1. Redis的key有效期设置及淘汰策略
Redis的数据结构是key-value格式的键值对, 在项目中通常作为缓存数据库使用, 当然使用过程中经常对key设置有效期.
1.1 key的过期时间和永久有效分别怎么设置
expire
命令和persist
命令.
1.2 Redis的过期键的删除策略
Redis是key-value数据库, 我们可以设置Redis中缓存的key的过期时间. Redis的过期策略就是指当Redis中缓存的key过期了, Redis如何处理.
过期策略通常有以下三种:
-
定时过期:
- 每个设置过期时间的key都需要创建一个定时器, 到过期时间就会立即清除.
- 优点: 节约内存, 到时就删除, 快速释放掉不必要的内存占用.
- 缺点: CPU压力很大, 无论CPU此时负载量多高, 均占用CPU, 会影响Redis服务器响应时间和指令吞吐量.
- 总结: 用处理器性能换取存储空间(拿时间换空间).
-
惰性过期
- 数据到达过期时间, 不做处理. 等下次访问该数据时
如果未过期, 返回数据.
如果已过期, 删除, 返回不存在. - 优点: 节约CPU性能, 发现必须删除的时候才删除.
- 缺点: 内存压力很大, 出现长期占用内存的数据.
- 总结: 用存储空间换取处理器性能(拿时间换空间)
- 数据到达过期时间, 不做处理. 等下次访问该数据时
-
定期过期:
- 周期性轮询Redis库中的时效性数据, 采用随机抽取的策略, 利用过期数据占比的方式控制删除频度.
expires[]记录了所有过期key的地址还有时间, 会定期轮询这个字典数据. - 特点1: CPU性能占用设置有峰值, 检测频度可自定义设置.
- 特点2: 内存压力不是很大, 长期占用内存的冷数据会被持续清理
- 周期性抽查存储空间(随机抽查, 重点抽查)
- 周期性轮询Redis库中的时效性数据, 采用随机抽取的策略, 利用过期数据占比的方式控制删除频度.
Redis中同时使用了惰性过期和定期过期两种过期策略。
2. 逐出算法(淘汰策略)
当新数据进入Redis时, 如果内存不足怎么办? 也就是这时候Redis中所有的key都没有过期, 但是又来了新的数据需要存储, 就需要临时淘汰一些数据, 这就是逐出算法或者淘汰策略.
-
Redis使用内存存储数据, 在执行每一个命令前, 会调用freeMemoryIfNeeded()检测内存是否充足. 如果内存不满足新加入数据的最低存储要求, Redis要临时删除一些数据为当前指令清理存储空间, 清理数据的策略称为逐出算法.
-
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间, 如果不成功则反复执行. 当对所有数据尝试完毕后, 如果不能达到内存清理的要求, 将出现错误信息.
-
数据逐出的相关配置
-
一共8种逐出策略