关于 Redis 中的 LRU 算法,官网上是这样说的:
https://github.com/redis/redis-doc/blob/master/topics/lru-cache.md
在 Redis 中的 LRU 算法不是严格的 LRU 算法。
Redis 会尝试执行一个近似的LRU算法,通过采样一小部分键,然后在采样键中回收最适合的那个,也就是最久没有被访问的那个(with the oldest access time)。
然而,从 Redis3.0 开始,改善了算法的性能,使得更接近于真实的 LRU 算法。做法就是维护了一个回收候选键池。
Redis 的 LRU 算法有一个非常重要的点就是你可以通过修改下面这个参数的配置,自己调整算法的精度。
maxmemory-samples 5
最重要的一句话我也已经标志出来了:
The reason why Redis does not use a true LRU implementation is because it costs more memory.
Redis 没有使用真实的 LRU 算法的原因是因为这会消耗更多的内存。
然后官网上给了一个随机 LRU 算法和严格 LRU 算法的对比图:
对于这个图官网是这样说的:
你可以从图中看到三种不同的小圆点形成的三个不同的带:
- 浅灰色带是被回收(被 LRU 算法淘汰)的对象
- 灰色带是没有被回收的对象
- 绿色带是新添加的对象
由于 Redis 3.0 对 LRU 算法进行了改进,增加了淘汰池。
所以你可以看到,同样使用 5 个采样点,Redis 3.0 表现得比 Redis 2.8 要好。
同时可以看出,在 Redis 3.0 中使用 10 为采样大小,近似值已经非常接近理论性能。
写到这里我突然想起了另外一个面试题。
数据库中有 3000w 的数据,而 Redis 中只有 100w 数据,如何保证 Redis 中存放的都是热点数据?
这个题你说它的考点是什么?
考的就是淘汰策略呀,同志们,只是方式比较隐晦而已。
我们先指定淘汰策略为 allkeys-lru 或者 volatile-lru,然后再计算一下 100w 数据大概占用多少内存,根据算出来的内存,限定 Redis 占用的内存。
搞定。
才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以在后台提出来,我对其加以修改。
感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。
我是 why,一个被代码耽误的文学创作者,不是大佬,但是喜欢分享,是一个又暖又有料的四川好男人。
还有,欢迎关注我呀。