在?这里有你所不知道的数据库吗?

一、SQL和NOSQL

常常使用的关系型数据库有 MySQL、Oracle、SQL Server、SQLite、DB2、Teradata、Infomix、Sybase、PostgreSQL、Access、FoxPro 等;相对应的,常见的 NoSQL 数据库有 MongoDB、Memcached、RedisHBase、CouchDB、Neo4j、Cassandra、Riak 等。

1.关系型数据库通过外键关联来建立表与表之间的关系,

2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。

3.非关系型数据库中,我们查询一条数据,结果出来一个数组,关系型数据库中,查询一条数据结果是一个对

1.Nosql特点

(1)易扩展,数据之间没有关系的。

(2)大数据量,高性能。高性能读写非常灵活的。

(3)灵活的数据模型。不需要事先对存储数据建立字段。

(4)高可用。

2.两者区别

1) 使用成本

NoSQL:NoSQL 使用简单,易搭建,大部分是开源软件,比较廉价,任何人都可以使用。

关系型数据库:相对于NoSQL,关系型数据库通常需要安装部署,开源的比较少,使用成本比较昂贵。尤其是 Oracle 数据库,需要花费大量资金购买,使用成本比较高。

2) 存储形式

NoSQL:NoSQL 具有丰富的存储形式,如 key-value(键值对)形式、图结构形式、文档形式、列簇形式等,因此,它可以存储各种类型的数据。

关系型数据库:关系型数据库是采用关系型数据模型来组织的,它是行列表结构,通过行与列的二元形式表示出来,数据之间有很强的关联性。它采用二维表结构的形式对数据进行持久存储。

3) 查询速度

NoSQL:NoSQL 将数据存储在系统的缓存中,不需要经过 SQL 层的解析,因此查询效率很高。

关系型数据库:关系型数据库将数据存储在系统的硬盘中,在查询的时候需要经过 SQL 层的解析,然后读入内存,实现查询,因此查询效率较低。

4) 扩展性

NoSQL:NoSQL 去掉了传统关系型数据库表与字段之间的关系,实现了真正意义上的扩展。它采用键值对的形式存储数据,消除了数据之间的耦合性,因此易扩展。

关系型数据库:由于关系型数据库采用关系型数据模型来存储数据,数据与数据之间的关联性较强,存在耦合性,因此不易扩展。尤其是存在多表连接(join)查询机制的限制,使得扩展很难实现。

5) 是否支持 ACID 特性

ACID 特性是指数据库事务的执行要素,包括原子性、一致性、隔离性、持久性。

NoSQL:NoSQL 一般不支持 ACID 特性,它实现最终一致性。

关系型数据库:关系型数据库支持 ACID 特性,具有严格的数据一致性。

6) 是否支持 SQL 语句

NoSQL:SQL 语句在 NoSQL 中是不被支持的,NoSQL 没有声明性查询语言,且没有预定义的模式。

关系型数据库:关系型数据库支持 SQL 语句,也支持复杂查询。SQL 是结构化查询语言、数据操纵语言、数据定义语言。

NoSQL 数据与传统关系型数据库是互补的关系,对方的劣势就是自己的优势,反之亦然。

请添加图片描述

二、Mysql

1.SQL注入

是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。

注入方法:1、数字型注入 当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

2、字符型注入当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。

2.Mysql存储引擎

在这里插入图片描述

3.读写分离

1.原理:让主数据m(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理SELECT查询操作。

4.缓存

缓存分类

本地缓存:HashMap/ConcurrentHashMap.Ehcache.Guava Cache

等缓存服务:Redis/Tair/Memcache 等

使用场景

短时间内相同数据重复查询多次且数据更新不频繁,这个时候可以选择先从缓 存查询,查询不到再从数据库加载并回设到缓存的方式。此种场景较适合用单机缓存。 高并发查询热点数据,后端数据库不堪重负,可以用缓存来扛。

缓存作用:

减轻数据库的压力,减少访问时间。

缓存选择:

如果数据量小,并且不会频繁地增长又清空(这会导致频繁地垃圾 回收),那么可以选择本地缓存。具体的话,如果需要一些策略的支持比如缓存 满的逐出策略,可以考虑 Ehcache;如不需要,可以考虑 HashMap;如需要

考虑多线程并发的场景,可以考虑 ConcurentHashMap。其他情况,可以考虑缓存服务。目前从资源的投入度.可运维性.是否能动态扩容以及配套设施来考虑,我们优先考虑 Tair。除非目前 Tair 还不能支持的场合(比如分布式锁.Hash 类型的 value),我们考虑用 Redis。

缓存穿透

一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如 DB。如果 key 对应的 value 是一定不存 在的,并且对该 key 并发请求量很大,就会对后端系统造 成很大的压力。这就 叫做缓存穿透。 对查询结果为空的情况也进行缓存,缓存时间设置短点,或者该 key 对应 的数据 insert 了之后清理缓存。

解决方案

(一)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

(二)采用异步更新策略,无论 key 是否取到值,都直接返回。value 值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

(三)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内 部维护一系列合法有效的 key。迅速判断出,请求所携带的 Key 是否合法有效。

如果不合法,则直接返回。

缓存并发

有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程 同时查询 DB,同时设置缓存的情况, 如果并发确实很大,这也可能造成 DB 压力过大,还有缓存频繁更新的问题。对缓存查 询加锁,如果 KEY 不存在,就加锁,然后查 DB 入缓存,然后解 锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入 DB 查询。

缓存雪崩(失效)

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如 DB)带来很大压力。不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀.

解决方案

(一)给缓存的失效时间,加上一个随机值,避免集体失效。

(二)使用互斥锁,但是该方案吞吐量明显下降了。

(三)双缓存。我们有两个缓存,缓存 A 和缓存 B。缓存 A 的失效时间为 20 分钟缓存 B 不设失效时间。自己做缓存预热操作。然后细分以下几个小点:

I 从缓存 A 读数据库,有则直接返回。

II A 没有数据,直接从 B 读数据,直接返回,并且异步启动一个更新线程。

III 更新线程同时更新缓存 A 和缓存 B。

三、Redis

1.特点

优点

1.支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)
2.支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失  的手段。
3.支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
4.单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
5.支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
6.支持简单的事务需求,但业界使用场景很少,并不成熟。

缺点

1.Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
2.支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
3.Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存
耗用。

2.存储结构(基本数据类型)

String,字符串,是 Redis 的最基本的类型,一个 key 对应一个 value。是二进制安全的,最大能存储 512MB。

Hash,散列,是一个键值(key=>value)对集合。string 类型的field 和 value 的映射表,特别适合用于存储对象。每个 hash 可以存储 232 -1 键值 对(40 多亿)

List,列表,是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。最多可存储 232 -1 元素(4294967295, 每个列表可存储 40 多亿)。

Set,集合, 是 string 类型的无序集合,最大的成员数为232 -1(4294967295, 每个集合可存储 40 多亿个成员)。

Sorted set,有序集合,和 set 一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。Redis 正是 通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数(score)却可以重复。173

四、MongDB

1.特点

优点

1.更高的写负载,MongoDB拥有更高的插入速度。
2.处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。
3.高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点
(数据中心)故障转移。
4.快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置
获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内
存资源相当丰富的话,这将极大地提高数据库的查询速度。
5.非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而
导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,
整个过程会非常快速。

缺点

1.不支持事务。
2.MongoDB占用空间过大 。
3.MongoDB没有成熟的维护工具。

猜你喜欢

转载自blog.csdn.net/Your1221/article/details/118161765
今日推荐