Redis数据过期策略

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

Redis数据过期策略

定时删除

  • 策略 : 在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作
  • 优点 : 对内存友好,保证过期键会尽可能快地被删除,并释放过期键所占用的内存
  • 缺点 : 对CPU时间不友好,占用太多CPU时间,影响服务器的响应时间和吞吐量

惰性删除

  • 策略 : 放任过期键不管,每次从键空间读写操作时,都检查键是否过期,如果过期,删除该键,如果没有过期,返回该键
  • 优点 : 对CPU时间友好,读写操作键时才对键进行过期检查,删除过期键的操作只会在非做不可的情况下进行
  • 缺点 : 对内存不友好,只要键不删除,就不会释放内存,浪费太多内存,有内存泄漏风险

定期删除

  • 策略 :对定时删除策略和惰性删除策略的一种整合和折中。每隔一段时间执行一次定时删除,并通过限制删除操作执行的总时长和总频率来限制删除操作对CPU占用时间的影响。通过定期删除过期键,有效减少了因为过期键而带来的内存浪费
  • 难点:确定删除操作执行的总时长和总频率。执行太频繁,执行时间过长,就会退化成定时删除策略,影响客户端请求效率;执行得太少,执行时间太短,会演变为惰性删除,存在内存浪费的情况

Redis服务器使用惰性删除和定期删除两种策略,通过配合使用,很好地在合理使用CPU时间和避免浪费内存之间取得平衡

驱逐策略

  • maxmemory

maxmemory 用于指定Redis能使用的最大内存。既可以在 redis.conf 文件中设置, 也可以在运行过程中通过CONFIG SET命令动态修改

maxmemory 100mb

达到最大内存限制时maxmemoryRedis根据 maxmemory-policy 配置的策略, 来决定具体的行为


Redis 3.0支持的策略包括

  • noeviction:不删除策略,达到最大内存限制时,如果需要更多内存,直接返回错误信息

大多数写命令都会导致占用更多的内存(有极少数会例外, 如 DEL )。

  • allkeys-lru:所有key通用;优先删除最近最少使用key
  • volatile-lru:只限于设置了expire的部分; 优先删除最近最少使用(less recently usedLRU)的 key
  • allkeys-random:所有key通用;随机删除一部分key
  • volatile-random:只限于设置了expire的部分;随机删除一部分key
  • volatile-ttl:只限于设置了expire的部分;优先删除剩余时间短的key

如果没有设置 expire 的key,不满足先决条件(prerequisites)

那么 volatile-lru, volatile-randomvolatile-ttl 策略的行为,和 noeviction(不删除) 基本上一致

  • 配置驱逐策略,可以通过maxmemory-policy属性设置
maxmemory-policy noeviction

maxmemory-policy同样可以在运行时设置,用户可以根据内存的使用情况动态的修改淘汰策略。

redis中的数据有一部分访问频率比较高,另外一部分访问频率较低时,设置allkeys-lru比较合适。或者无法预测数据的使用频率时,allkeys-lru也是不错的选择。

如果你需要循环或者扫描连续数据时,换种说法就是数据的访问概率大致相等时,allkeys-random是不错的选择

当你想通过设置不同的ttl来控制数据过期的先后顺序时,你可以设置为volatile-ttl

当你希望一些数据常驻内存,另外一些数据可以被替换掉时,就请用volatile-lruvolatile-random

另外,数据的过期时间是存储在另外一个哈希表中的,因此要耗费更多的内存空间,而allkeys-lru并不需要数据设置过期时间,因此对内存的利用率更高

volatile-lruvolatile-randomvolatile-ttl在没有数据满足被淘汰的条件时,会和noeviction一样返回错误

触发淘汰动作

客户端执行一个命令, 导致Redis中的数据增加,占用更多内存

Redis检查内存使用量, 如果超出 maxmemory 限制, 根据策略清除部分key

继续执行下一条命令, 以此类推

策略执行方式

Redis为了避免反复触发淘汰策略,每次会淘汰掉一批数据;当Redis指令产生数据比较大时,淘汰掉的数据量也相应也比较大。

为了节省内存,LRU的策略并不是严格执行的,Redis是在整体中随机抽样取出一小部分数据,在这部分数据中严格执行LRU策略

Redis3.0以后的版本对此算法做了改进,但仍然也是近似的LRU的策略,只是离真正的LRU更近了。

另外用户可以动态的设定随机抽取的样本数,例如

maxmemory-samples 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值