Redis
Redis是基于内存运行的高性能、支持数据持久化的key-value NoSql数据库,因为它基于内存运行,不需要读写磁盘,因此它读写速度非常快,被广泛用于缓存方向
主要缺点:数据库容量受到物理内存的限制,适用于较小数据量的高性能操作和运算
适用场景:会话缓存、全页缓存、队列、排行榜/计数器、发布/订阅
支持的数据类型
- String:String类型数据的最大容量为512M,用于做一些复杂的计数功能的缓存
- List:双向链表,关注列表、粉丝列表、消息列表等,List有序,适用于一些时间轴相关的数据的存储
- Set:全局去重,交集、并集、差集操作,计算共同喜好,全部喜好,独有喜好等
- Hash:对象存储
- SortedSet:排行榜、延时任务、范围查找,zset中设置score作为排序规则
过期策略
- 定期删除:定时随机查看设置过期时间的数据,超时则删除,不全部查看是因为数据量太大,浪费CPU性能
- 惰性删除:访问的数据已经过期,则删除
淘汰机制
- allkeys-lru:针对所有键,删除最近最少使用的数据
- volatile-lru:针对设置过期时间的键,删除最近最少使用的数据
- allkeys-random:针对所有键,随机删除
- volatile-random:针对设置过期时间的键,随机删除
持久化
RDB
- 保存数据快照再持久化到磁盘,数据快照以压缩二进制形式保存
- 指定时间间隔内将内存中的数据集快照写入磁盘
- 恢复速度更快,效率更高,但是宕机会导致数据丢失,常用于冷备份和复制传输
AOF
- 日志的方式完成持久化任务,日志记录所有的写操作,恢复时重新执行所有的写操作
- Redis默认的持久化方式,可靠性更高一些,可以用于事实更新,但是恢复速率和执行速率会更慢一些
主从复制
- Master以写为主,Slave以读为主
- 有效减少单个机器的并发访问数量
- Master到Slave的更新有延时
缓存穿透&缓存击穿&缓存雪崩
缓存穿透:访问服务器中一定不存在的key,导致服务器宕机
- 解决:布隆过滤器,过滤请求;缓存中存储该key的value为空
缓存击穿:缓存中不存在但是服务器中存在的key,短时间大量并发访问,会导致数据库服务器宕机
- 解决:互斥锁,一个线程访问,然后更新到缓存
缓存雪崩:大面积缓存失效,转而访问数据库,导致数据库宕机
- 解决:集群缓存,主从+哨兵;本地缓存+限流;Redis持久化机制
分布式锁
-
基于数据库表锁
-
基于ZooKeeper
-
基于Redis