Redis
一、基本概念
缓存
存储于内存中的数据,用于提升查询效率,避免所有请求直接查询MySQL。
查询频繁的数据。
修改较少
一致性要求不高。
NoSQL
基于Redis高并发读写特性,针对需要频繁读写操作,且允许一定数据丢失的数据存储到Redis。
数据结构
STRING: key/value的数据结构,也是最常用的一种数据结构
setnx: 如果不存在才存,否则会保存失败
incr: 原子性递增
HASH: key / <field / value>: 可以存储多个键值对
LIST: 普通列表结构,基于不同的命令操作可以实现列表、队列以及栈数据结构
SET: 元素且唯一的列表,可以实现随机获取成员,以及对多个不同SET集合求交集、并集、差集
ZSET: 可以排序的SET集合,利用score来进行排序
二、高级
缓存
一致性问题:
双写:同时将数据保存到Redis以及数据库,可能由于Redis写失败,或数据库写失败导致数据不一致问题。
延迟双删:
查询:先查缓存,缓存有直接返回,缓存没有查询数据库,数据库有,写入缓存并返回,数据库没有就返回空数据。
改:先删除缓存,再修改数据库,再启用一个延迟的异步线程再删除一次缓存。
并发问题:
缓存击穿:某一个热点缓存数据失效,大批量并发请求直接请求到数据库,导致数据库崩溃。
解决方案:加锁
缓存穿透:故意访问压根不存在的数据,此时数据库和缓存中都不存在,但是由于查询流程导致最终一定会查询数据库
解决方案:缓存有过期时间的空值、布隆过滤器
缓存雪崩:大批数据同时过期,导致多个业务同时查询MySQL,造成其他关联业务也受到影响,最终整个系统崩溃。
解决方案:在原来过期时间的基础上追加随机值,使大批key分散不同时间过期
持久化
RDB: 快照方式,按照配置的策略,在指定时间范围内修改了多少key进行快照备份。
优点:恢复数据较快 缺点:时间间隔长,可能丢失数据较多。
AOF: 日志模式,按照配置规则将操作的指令保存到文件中,重启时重新执行命令
优点:持久化效果较好 缺点:恢复速度较慢
混合持久化:综合RDB、AOF的优点,既有快照恢复快的特点,也有日志持久化的效果。
要求:版本4.0+、必须先开启AOF
淘汰机制
由于Redis内存不够,因此根据不同策略选择部分key进行淘汰,用于保存其他更重要的数据
有过期时间:
LRU: 最近最少使用,将长时间未使用的key淘汰
LFU: 最不经常使用的数据,按照一定时间内淘汰最少使用的数据
TTL: 将即将过期的key删除
RANDOM: 随机删除
没有过期时间:
LRU: 最近最少使用,将长时间未使用的key淘汰
LFU: 最不经常使用的数据,按照一定时间内淘汰最少使用的数据
RANDOM: 随机删除
默认:不淘汰,内存不够直接报错
过期 Key删除策略
惰性删除:访问的时候才删除,不访问就不删除
可能产生的问题:一直不使用但是过期了的key还会占用内存
定时删除:利用定时器,直接删除过期key,由于Redis是单线程的,因此删除时会占用线程,此时Redis会不可用
Redis6.0以后推出多线程方案,可以实现删除操作由异步线程进行。
定期删除:隔一段时间抽样检查,检测过期key比列达到多少以后进行删除。
三、使用方案
客户端
Jedis: 最接近Redis原生命令,使用比较简单
letuce: 功能较为完善,比较全面,支持Redis本身的各种特性,如集群、哨兵、队列、发布订阅等。
Redisson: 主要定位于高并发领域,提供了类似队列、bitmap、布隆过滤器、分布式锁等一系列并发功能。
Spring
Spring Data Redis
Spring Cache