hoohack / hoohack.github.io

personal blog
http://www.hoohack.me/
2 stars 2 forks source link

理解Redis的内存回收机制 #48

Open hoohack opened 5 years ago

hoohack commented 5 years ago

https://www.hoohack.me/2019/06/24/redis-expire-strategy

Redis,Redis回收机制,Redis内存回收,Redis惰性删除,Redis面试题,Redis源码

chinazj commented 5 years ago

不全是单线程,清理过期key、处理内存回收应该是启用的线程。主线程只做接收命令,处理命令。redis里面为了快速做了大量优化.

wei1234567 commented 4 years ago

楼主,有一张图片 点不开了

hoohack commented 4 years ago

@wei1234567 楼主,有一张图片 点不开了

感谢反馈,已经处理了

poettian commented 4 years ago

写的很棒,图文并茂👍。

我们近期业务有使用redis的键空间通知,依赖redis在key过期失效时主动通知。之前没有过多思考redis如何实现清理过期key。在看过这篇文章后,对我们的实现就产生了疑问:因为redis的定期删除是通过随机采样实现的,在key过多的情况下,那redis是不能精准的实现过期的key很快可以被清理掉的,甚至可能过了很长时间,过期key还在内存中,这是可能的吧。

此外,请教作者一个问题:在到底要不要给缓存设置过期时间上,和同事有分歧。同事观点是不设置过期时间,内存满了就让redis通过内存淘汰来腾出内存给新key,不设置过期时间的话还能节省 expire dict 的内存。总感觉不妥,但又觉得有道理。

hoohack commented 4 years ago

@poettian 写的很棒,图文并茂👍。

我们近期业务有使用redis的键空间通知,依赖redis在key过期失效时主动通知。之前没有过多思考redis如何实现清理过期key。在看过这篇文章后,对我们的实现就产生了疑问:因为redis的定期删除是通过随机采样实现的,在key过多的情况下,那redis是不能精准的实现过期的key很快可以被清理掉的,甚至可能过了很长时间,过期key还在内存中,这是可能的吧。

此外,请教作者一个问题:在到底要不要给缓存设置过期时间上,和同事有分歧。同事观点是不设置过期时间,内存满了就让redis通过内存淘汰来腾出内存给新key,不设置过期时间的话还能节省 expire dict 的内存。总感觉不妥,但又觉得有道理。

这个从具体场景上分析,如果业务的请求量比较大,那么通过Redis自己的内存淘汰机制去腾出内存就不太妥。比如,有A类型的key,没有设置过期时间,占用内存较高,属于核心功能,B类型的key,平时占有内存很少,由于活动火爆,请求瞬间上涨,内存不断达到瓶颈,那么为了腾出内存,Redis就会清理A类型的key,这个时候A类型相关的服务的响应就会很慢(因为穿透缓存)。而且,一般都会设置内存告警,不设置过期的话,Redis就会频繁告警。

个人觉得是过期时间+lru淘汰结合更加合适。当然,得结合业务类型来判断,某种业务场景下,也许不设置过期时间是对的。-。-

GStepOne commented 4 years ago

redis 只支持惰性删除和定期删除,好像没有实现定时删除。

betterest8830 commented 3 years ago

如果当前的内存使用率较大,那么就需要查看是否有配置最大内存,如果有且内存超了,那么就可以初步判定是内存回收机制导致key设置不成功,还需要查看内存淘汰算法是否noeviction或者allkeys-random。为什么会有allkeys-random这个算法进行判断么,难道不是只判断是否noeviction。不是很懂,完指教一下