文章目录
Redis持久化与过期机制
1. 持久化机制
1.1 RDB(默认)
- 机制
- 指定时间内、指定次数写操作 -> 会将内存中的数据写入磁盘(dump.rdb文件)
- 重启Redis将会加载磁盘中已持久化的数据
- 优点:恢复速度快,适用于大多数场景
- 缺点:数据的数据完整性、一致性不高(因为如果内存中的数据写入磁盘之前,程序挂了或者宕机,会导致新的数据没有被持久化)
1.2 AOF
- 机制
- 将每个写操作以日志的方式记录并追加到文件中
- 重启Redis将会读取日志文件进行恢复
- 优点:数据的完整性、一致性更高
- 缺点:日志记录较多,恢复速度慢
2. 过期机制
2.1 根据过期策略删除数据
- 定时删除:内存占用低,CPU消耗高。每100ms进行一次随机抽样(100个key),删除过期的key。如果删除的key超过抽样总数的25%(即25个),那么立即进行下一次抽样检查。
- 惰性删除:内存占用高,CPU消耗低。当key被访问时,才检查key是否过期,如果过期则删除这个key,并返回空。
- 定期删除:定时删除与惰性删除的结合版。如果删除频次较高,转为定时删除,如果删除频次较低,转为惰性删除。
2.2 当内存过大装不下新数据时,将启用淘汰机制
- 一般为了防止Redis占用内存过大,影响整个服务器,会设置其最大内存值,即maxmemory
- 当内存超过maxmemory时,将根据maxmemory_policy释放内存
- noeviction:写入新数据时,直接报错
- allkeys-lru:写入新数据时,删除所有数据中最近最少使用的key
- allkeys-lfu:写入新数据时,删除所有数据中使用频次最少的key
- allkeys-random:写入新数据时,随机删除所有数据中的key
- volatile-lru:写入新数据时,删除设置了过期时间的数据中最近最少使用的key
- volatile-lfu:写入新数据时,删除设置了过期时间的数据中使用频次最少的key
- volatile-random:写入新数据时,随机删除设置了过期时间的数据中的key
- volatile-ttl:写入新数据时,优先删除过期时间较早的key
- 补充
- LRU -> least recently used
- LFU -> least frequently used
3. 其他
3.1 Redis快的原因
- 纯内存操作
- epoll是单线程,没有多线程的加锁以及切换(Redis6开始支持多线程I/O)
3.2 如何解决缓存穿透、缓存击穿、缓存雪崩?
- 缓存穿透 ->
- 布隆过滤器
- 缓存击穿 ->
- 去数据库(例如MySQL)取值时,先在Redis中为该key设置一个占位值,这样后续大量针对该key的请求就不会直接传到后面的数据库
- 二级缓存
- 分布式锁(Redis、Zookeeper)
- 缓存雪崩 ->
- 为Redis生成带过期时间的key时,给一个随机的浮动时间,防止同一时间大量key一起过期
- 另外,内存足够的话,建议将热门数据设置无过期时间
3.3 应该为什么样的数据提前做缓存?
- 这个和具体的业务相关,要根据实际场景来分析
- 提前做好缓存是为了降低后面到来的流量高潮导致的压力
- 注意:这里主要强调提前做缓存,是主动的。内存足够时,建议直接设置无过期或是较长的过期时间。
- 举例(主要是可预测的热点数据)
- 电商中促销活动商品的数据
- 节日相关的商品的数据
- 实时热点文章的数据
- 热搜词相关的商品的数据
- 新上映的电影相关的数据