Redis 内存满了怎么办?回收机制和驱逐策略解析

配资网 阅读: 2024-10-21
后台-插件-广告管理-内容页头部广告(手机)

现在在数据存储界,Redis这种内存型key-value数据库挺火。但内存容量有限,这问题就像定时炸弹,内存一满,key过期失效的情况就来了。这可让不少开发者头疼,也是本文要重点聊的。

# 设置最大占用内存为100MB
maxmemory 100mb

Redis内存满的情况

在许多实际应用场合,用32位操作系统时,Redis内存受限是个常见问题。比如说,在小服务器上,32位系统默认内存上限是3GB。如果不了解这些限制,开发时很容易碰壁。一旦内存达到配置文件设定的上限,Redis不会束手无策。它有几种应对策略。咱们可以通过调整策略来应对内存不足的困境。

// 获取最大内存限制
config get maxmemory
 1)  "maxmemory"
 2)  "0"
// 设置最大的内存限制
config set maxmemory 100mb

Redis在内存满了的时候会用近似LRU算法来处理。在像缓存这样的应用场景里,这个算法挺不错的。它跟理论上的LRU算法不一样,不需要保存每个key的前后key地址,所以占用内存少,内存紧张的时候负担小多了。

近似LRU算法原理

Redis用的近似LRU算法挺特别,跟普通的LRU算法不一样。它淘汰数据的方式挺有意思,用的是随机采样。每次它都会随机选5个key,然后从这5个中找出最近最少被使用的key来淘汰。

当使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误

策略掘金拼音怎么写_掘金策略_策略掘金有用不

这个算法给每个key加了个24位的字段,专门记录它最后一次被查的时间。另外,它还管理着一个16个元素的候选池。池里的数据按照访问时间来排序。一开始随机选的key都会被放进池里,之后每次随机选的key,只有当它的访问时间比池里最晚的时间还要早,才能被加入,直到池子满了为止。看Redis官方文档里新旧算法的对比,3.0版本的效果明显比2.8好,而且样本量越大,越接近LRU算法的标准。

// 获取内存淘汰策略 可以看到默认是noeviction
config get maxmemory-policy
 1)  "maxmemory-policy"
 2)  "noeviction"
 
 // 修改内存驱逐策略
 config set maxmemory-policy allkeys-lru

LFU算法的特点

maxmemory-policy allkeys-lru

Redis4.0里新添的LFU算法挺有意思。这个算法能更准确地反映key的使用频率。但在现实生活中,有时候会遇到一些特殊情况。比如,用LRU算法的话,就会出现不太合理的情况。举个例子,一个key很久都没被访问过,结果突然被访问了一次,就因为这次访问被误判为热门数据,结果没有被淘汰。而有些将来可能会用到的key,却因为这种误判而被淘汰了。

LFU算法用到两个参数,第一个是计算器,数值在0到255之间,访问次数越多,数值就越高。第二个是衰减周期,每隔一段时间,计算器的数值会减少。这样一来,就能避免LRU算法里出现的不合理情况。

Redis的key过期情况

Redis里头,咱们能通过expire给key设个过期时间。这招在很多业务场合里头都挺管用的。好比说,咱们在设置用户登录状态的缓存时,得挑个合适的过期时间,这样才能保证数据既有效又安全。要是key过期了,那可就得启动Redis的回收机制了。

Redis不是直接检查每个key是否过期,它采用的是一种主动删除策略,会随机挑选一部分key进行校验。一旦发现key已失效,就会将其删除。这种做法在面对大量数据时,有其独到之处,因为它不会让系统在短时间内承受巨大的查询压力。

策略掘金拼音怎么写_策略掘金有用不_掘金策略

对开发的影响

对开发者来说,弄懂Redis这类机制至关重要。在搭建缓存系统时,若不掌握内存满和key过期等机制,缓存失效或内存溢出问题就很容易出现。尤其在电商抢购这类高并发场景,数据涌入Redis,处理不当这些机制,系统崩溃的风险就大大增加。

选了LRU算法可得注意,它那不合理的地方可能会影响到咱们的业务数据。还有,要是选了LFU算法,也得清楚,参数要是设置得不对,也会导致数据淘汰不合理的问题。

如何优化策略

优化Redis的策略,得从实际业务需求来考虑。要是业务里更看重那些近期经常被访问的数据,那可能调整LFU算法的参数是个不错的选择。在32位系统内存受限的情况下,咱们可以更精确地调整内存的大小和驱逐策略。

在调整key的过期时间时,咱们得看业务逻辑里那个时间周期。比如说,数据的有效期是24小时,那咱们就能把过期时间精确地设置为24小时。

咱们聊聊,你们在使用Redis时,要是碰上内存不够用或者key过期没处理好的问题,你们都是怎么处理的呀?顺便也给大家提个醒,点个赞,转发一下这篇文章。对了,评论区也欢迎你们留言交流交流。

本文 融资融券杠杆炒股 原创,转载保留链接!网址:http://www.wjjxb.com/zmt/392.html

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索