Redis内存回收策略

 

如果使用Redis的时候,不合理使用内存,把什么东西都放在内存里面,又不设置过期时间,就会导致内存的堆积越来越大。根据28法则,除了20%的热点数据之外,剩余的80%的非热点或不怎么重要的数据都在占用内存空间,这时就要使用一种淘汰策略来释放一些内存。Redis中提供了多种内存回收策略,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对 象,释放这些对象占用的空间,那么选择淘汰哪些对象呢?
在redis.conf 里面有个配置策略 maxmemory-policy ,它有几个可选值:

noeviction: 默认的策略,即当内存使用达到阈值的时候,所有引起申请内存的命令都会报错;
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 。
适用场景: 如果我们的应用对缓存的访问都是相对热点数据,就可以选择这个策略;
allkeys-random:随机移除某个key。
适合的场景:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

从已经设置了过期时间的key中去选择
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;适合场景:这种策略使我们可以向Redis提示哪些key更适合被淘汰,可以自己控制 。

那么怎样保证Redis里面的数据都是热点数据?
可以使用LRU的淘汰策略,选择最近最少使用的数据全部淘汰掉,剩下的就是经常访问的数据,都是热点数据。

总结
实际上Redis实现的LRU并不是可靠的LRU,也就是名义上我们使用LRU算法淘汰内存数据,但是实际上被淘汰的键 并不一定是真正的最少使用的数据,这里就要权衡了,如果需要在所有的数据中搜索符合条件的数 据,那么一定会增加系统的开销,Redis是单线程的,所以耗时的操作会谨慎一些。为了在一定成本内实现相对的 LRU,早期的Redis版本是基于采样的LRU,也就是放弃了从所有数据中搜索解,改为采样空间搜索优解。Redis3.0 版本之后,Redis作者对于基于采样的LRU进行了一些优化,目的是在一定的成本范围内让结果更靠近真实的LRU。

posted @   割肉机  阅读(2468)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2018-07-26 redis存在大量脏页问题的追查记录
2018-07-26 spring cloud与K8S
2018-07-26 SpringCloud 教程
2018-07-26 如何使用RedisTemplate访问Redis数据结构
2018-07-26 解决Spring Boot 使用RedisTemplate 存储键值出现乱码 \xac\xed\x00\x05t\x00
2018-07-26 redis的三种启动方式
2018-07-26 Spring Boot-------JPA——EntityManager构建通用DAO
点击右上角即可分享
微信分享提示