其实吧,LRU也就那么回事。 (下)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 其实吧,LRU也就那么回事。 (下)

关于 Redis 中的 LRU 算法,官网上是这样说的:

https://github.com/redis/redis-doc/blob/master/topics/lru-cache.md

image.png


在 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 算法的对比图:


image.png

对于这个图官网是这样说的:


image.png


你可以从图中看到三种不同的小圆点形成的三个不同的带:

  • 浅灰色带是被回收(被 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,一个被代码耽误的文学创作者,不是大佬,但是喜欢分享,是一个又暖又有料的四川好男人。

还有,欢迎关注我呀。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
11月前
|
缓存 算法
LRU算法详解
LRU算法详解
176 0
|
存储 缓存 算法
LRU缓存替换策略及C#实现
LRU缓存替换策略及C#实现
100 0
|
缓存 算法 Go
一个优雅的 LRU 缓存实现
一个优雅的 LRU 缓存实现
92 0
|
存储 缓存 算法
其实吧,LRU也就那么回事。 (上)
其实吧,LRU也就那么回事。 (上)
122 0
其实吧,LRU也就那么回事。 (上)
|
存储 SQL NoSQL
其实吧,LRU也就那么回事。 (中)
其实吧,LRU也就那么回事。 (中)
136 0
其实吧,LRU也就那么回事。 (中)
|
缓存
LRU缓存
LRU缓存
95 0
LRU缓存
|
缓存 算法 Java
LRU算法
LRU是Least Recently Used的缩写,意思就是最近最少使用,常用于页面置换的一种算法。LRU算法的提出,是基于这样一个场景:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是著名的局部性原理。此外,LRU算法也经常被用作缓存淘汰策略。本文将基于LRU算法的思想,使用Java语言实现一个我们自己的缓存工具类
|
存储 缓存 NoSQL
LRU(Least Recently Used)
Redis是基于内存存储的key-value数据库,我们知道内存虽然快但空间小,当物理内存达到上限时,系统就会跑的很慢,这是因为swap机制会将部分内存的数据转移到swap分区中,通过与swap的交换保证系统继续运行;但是swap属于硬盘存储,速度远远比不上内存,尤其是对于Redis这种QPS非常高的服务,发生这种情况是无法接收的。(注意如果swap分区内存也满了,系统就会发生错误!)
344 0
LRU(Least Recently Used)