我命由我,不由天!


  • 搜索
prometheus docker golang linux kubernetes

Redis-过期策略(二十一)

发表于 2021-06-05 | 0 | 阅读次数 339

过期策略

Redis所有的数据结构都可以设置过期时间。

同一时间太多key过期,而导致收割过期key的操作太过于繁忙,而产生卡顿

过期的key集合

Redis会将每个设置了过期时间的key放入一个独立的字典中,以后会定时遍历这个字典来删除到期的key。除了定时遍历之外,还会使用惰性策略来删除过期的key。惰性策略就是在客户端访问这个key的时候,Redis对key的过期时间进行检查,如果过期了就立即删除

定时扫描策略

Redis默认美妙进行10次过期扫描,不会遍历过期字典中所有的key,而采用一种简单的贪心策略。

  1. 从过期字典中随机选出20个key
  2. 删除这20个key中已经过期的key
  3. 如果过期的key的比例超过1/4,那就重复(1)

同时,为了保证过期扫描不会出现循环过度,导致线程卡死的现象,算法还增加了扫描时间的上限,默认不会超过25ms。

假设一个大型Redis实例所有key在同一时间过期了,Redis会持续扫描过期字典,直到过期字典中过期的key变得稀疏,才会停止。这会导致线上读写请求出现明显的卡顿。导致这种卡顿的另外一种原因是内存管理器需要频繁回收内存页,这也会产生一定的CPU消耗。

当客户端请求到来时,服务器如果正好进入过期扫描状态,客户端的请求将等待至少25ms,如果客户端将超时时间设置的比较短,而且你还无法从Redis的slowlog中看到慢查询记录。

所以业务开发人员一定要注意过期时间。

从节点的过期策略

从节点不会进行过期扫描,从节点对过期的处理是被动的。主节点在key到期时,会在AOF文件里增加一条del指令,同步到所有的从节点,从节点通过执行这条del来删除过期key。

因为指令同步是异步进行的,所以主从数据会产生不一致。

  • 本文作者: Dante
  • 本文链接: https://gaodongfei.com/archives/redis-过期策略
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
redis-cluster(二十)
redis-lru(二十二)
  • 文章目录
  • 站点概览
Dante

Dante

119 日志
5 分类
5 标签
RSS
Creative Commons
0%
© 2023 Dante
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4
沪ICP备2020033702号