一.分布式数据库的含义
分布式数据库缓存指的是在高并发的环境下,为了减轻数据库的压力和提高系统响应时间,在数据库系统和应用系统之间增加一个独立缓存系统。
二.常见的缓存技术
(1)MemCache: Memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负载。Memcache在内存里维护一个统一的巨大的hash表,数据存在该hash表中。
(2)Redis: Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、KeyValue数据库 (支持多种数据结构,如key-value、string、set、list等),并提供多种语言的API。
(3)Squid:Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。
三.Memcache与Redis的对比
四.Redis分布式存储的常见方案
1、主从模式 (Master/Slavel):一机多从,故障时手动切换
2、哨兵模式 (Sentinel):有哨兵的一主多从,主节点故障自动选择新的节点
3、集群模式(Cluster):分界点对等集群,分slots,不同的slots的信息存储到不同的节点
五.Redis集群切片的常见方式
1、客户端分片:即在客户端通过key的hash值对应到不同的服务器。
2、中间件实现分片:在应用软件和Redis中间,例如: Twemproxy、Codis等,由中间件实现服务到后台Redis节点的路由分派.
3、客户端服务端协作分片:Redis Cluster模式,客户端可采用一致性哈希,服务端提供节点的重定向服务slot上。不同的slot对应到不同服务器。
六.Redis的分片方案
1、范围分片:按照数据范围来分片
2、哈希分片:通过Key进行hash运算分片,可以将数据比较均匀地分配到每一个结点,类似取余操作。
3、一致性哈希分片:哈希分片的改进,把存储节点和需要存储的数据放在一个hash环上,数据根据hash值在hash环上按照顺时针方向找到对应的结点
七.Redis和数据库之间数据同步方案(一致性)
1、读取数据时,先读取redis中的数据,如果redis没有,则从原数据库中读取,并同步更新redis中的数据。写回时,写入到原数据库中,并同步更新到redis中
2、异步队列方式实现同步,可采用消息中间件处理
3、通过数据库插件完成数据同步
4、利用触发器进行缓存同步
八.Redis的数据淘汰算法
1、不淘汰:noeviction,当空间不足时就报错,是系统的默认淘汰策略。
2、设置过期时间的键空间:
2.1、volatile-random:随机移除某个key
2.2、volatile-lru:移除最近没有使用的
2.3、volatile-ttl:ttl值小的key优先淘汰
3、全键空间:
3.1、allkey-random:随机移除某个key
3.2、allkey-lru:移除最近没有使用的
九.Redis的持久化
1、AOF:日志思路,把每条操作命令追加到AOF文件尾部,一旦有问题可以重新执行AOF文件中的命令
2、RDB:快照,指定时间间隔将数据进行快照存储
十.Redis常见问题
1、缓存雪崩
定义:大部分缓存失效导致请求往数据库发送,导致数据库奔溃
解决方案:
- 使用锁或队列:使用排他锁或者队列方式保证不会有大量线程对数据库一次性进行读写,避免缓存雪崩时大量并发请求落到底层存储系统上
- 为key设置不同的缓存失效时间:固定失效时间+随机失效时间
- 二级缓存:设置两个缓存(有时间限制+无时间限制),避免大规模访问数据库导致缓存雪崩
2、缓存穿透
定义:查询无数据返回导致直接插数据库,查询一个数据时,优先在缓存中寻找,如果缓存中没有就去数据库中寻找,但如果数据库中也没有,就会返回一个空值,但是如果后面还要查找这个数据,就会频繁地重复以上步骤,这就违背了当初设置缓存的作用
解决方案:
- 第一次查询结果为空时,设置一个默认值存放到缓存,第二次再查到缓存里就有值了。在设置一个5分钟的过期时间,以便正常更新缓存
- 设置布隆过滤器,将所有可能存在的数据hash到一个足够大的bitmap中,一个不存在的数据会被bitmap拦截掉,从而避免了对底层数据库的查询压力