前言
这几年一直在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
达到最大内存限制时maxmemory
,Redis
根据 maxmemory-policy
配置的策略, 来决定具体的行为
Redis 3.0
支持的策略包括
noeviction
:不删除策略,达到最大内存限制时,如果需要更多内存,直接返回错误信息
大多数写命令都会导致占用更多的内存(有极少数会例外, 如 DEL )。
allkeys-lru
:所有key
通用;优先删除最近最少使用key
volatile-lru
:只限于设置了expire
的部分; 优先删除最近最少使用(less recently used
、LRU
)的 keyallkeys-random
:所有key
通用;随机删除一部分key
volatile-random
:只限于设置了expire
的部分;随机删除一部分key
volatile-ttl
:只限于设置了expire
的部分;优先删除剩余时间短的key
如果没有设置 expire 的key,不满足先决条件(prerequisites)
那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为,和 noeviction(不删除) 基本上一致
- 配置驱逐策略,可以通过
maxmemory-policy
属性设置
maxmemory-policy noeviction
maxmemory-policy
同样可以在运行时设置,用户可以根据内存的使用情况动态的修改淘汰策略。
当redis
中的数据有一部分访问频率比较高,另外一部分访问频率较低时,设置allkeys-lru
比较合适。或者无法预测数据的使用频率时,allkeys-lru
也是不错的选择。
如果你需要循环或者扫描连续数据时,换种说法就是数据的访问概率大致相等时,allkeys-random
是不错的选择
当你想通过设置不同的ttl
来控制数据过期的先后顺序时,你可以设置为volatile-ttl
当你希望一些数据常驻内存,另外一些数据可以被替换掉时,就请用volatile-lru
或volatile-random
吧
另外,数据的过期时间是存储在另外一个哈希表中的,因此要耗费更多的内存空间,而allkeys-lru
并不需要数据设置过期时间,因此对内存的利用率更高
volatile-lru
,volatile-random
和volatile-ttl
在没有数据满足被淘汰的条件时,会和noeviction一样返回错误
触发淘汰动作
客户端执行一个命令, 导致Redis
中的数据增加,占用更多内存
Redis
检查内存使用量, 如果超出 maxmemory
限制, 根据策略清除部分key
继续执行下一条命令, 以此类推
策略执行方式
Redis
为了避免反复触发淘汰策略,每次会淘汰掉一批数据;当Redis
指令产生数据比较大时,淘汰掉的数据量也相应也比较大。
为了节省内存,LRU
的策略并不是严格执行的,Redis
是在整体中随机抽样取出一小部分数据,在这部分数据中严格执行LRU
策略
在Redis3.0
以后的版本对此算法做了改进,但仍然也是近似的LRU
的策略,只是离真正的LRU
更近了。
另外用户可以动态的设定随机抽取的样本数,例如
maxmemory-samples 5