Redis——内存淘汰策略
一、缓存耗尽的原因
1、每台机器的内存是一定的
2、key未设置过期时间
key不设置过期时间则在内存中一直存在,直到我们明确删除它。
3、过度或不合理的持久化
无论RDB快照或者AOF日志,都会在内存和磁盘中反复操作,需要一定的内存空间。
4、不及时清理过期缓存
有时过期缓存依旧存在,主要和缓存清理方式有关:
-
- 主动定期删除 Redis默认每隔1s运行10次,每次随机抽取部分设置过期时间的key,检查是否过期,如果过期则删除key,直至过期的key比率低于1/4
- 被动惰性删除 当客户端查询该key时,检查key是否过期,如果过期则删除key。
- Redis4.0之后可以异步删除,Redis自身会判断如果删除耗时很长就会先删除key-value,然后异步执行回收内存
5、不合理不规范使用缓存
过度使用缓存,冷热数据不分;缓存过多或单个缓存value过大;缓存过期时间设置过长
二、淘汰策略
分三类:
- 不淘汰而是直接拒绝写入新key (默认):1
- 从设置了过期时间的key中淘汰: 2、3、4、5
- 从所有key中淘汰: 6、7、8
1、noeviction
当写入新数据后的内存超过限定值时,写请求直接返回错误,只读请求可以正常执行,默认策略。
2、volatile-lru
当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LRU算法淘汰最久没有使用过的key。
LRU(Least Recently Used)
3、volatile-lfu
当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LFU算法淘汰使用频率最低的key。
LFU(Least Frequently used)
4、volatile-random
当写入新数据后的内存超过限定值时,从设置了过期时间的key中随机淘汰key。
5、volatile-ttl
当写入新数据后的内存超过限定值时,从设置了过期时间的key中根据过期时间淘汰key,越快过期越早淘汰。
6、allkeys-lru
当写入新数据后的内存超过限定值时,从所有key中使用LRU算法(最近最少使用算法)淘汰最久没有使用过的key。
7、allkeys-lfu
当写入新数据后的内存超过限定值时,从所有key中使用LFU算法(最少频率访问算法)淘汰使用频率最低的key。
8、allkeys-random
当写入新数据后的内存超过限定值时,从所有key中随机淘汰key
三、策略相关命令
1 2 3 4 5 6 7 8 9 10 11 | #获取当前内存淘汰策略 redis > config get maxmemory-policy #获取Redis能使用的最大内存大小:如果不设置最大内存大小或者设置为0,在64位操作系统#下不限制内存大小,在32位操作系统下最多使用3G redis > config get maxmemory #通过命令设置淘汰策略 redis > config set maxmemory-policy volatile-lru #设置Redis最大占用内存大小 redis > config set maxmemory 2048mb |
播种和收获通常不在一个季节,而中间的过程叫做坚持~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?