最近加班比较累,完全不想写作了。。

刚看到一篇有趣的文章,是redis的作者antirez对redis的LRU算法的回顾。LRU算法是Least Recently Used的意思,将最近最少使用的资源丢掉。Redis经常被用作cache,如果能够将不常用的key移除,尽量保留常用的,那内存的利用率就相当高了。当然,LRU也有弱点,考虑下面一种情况:

~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~|
~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~|
~~~~~~~~~~C~~~~~~~~~C~~~~~~~~~C~~~~~~|
~~~~~D~~~~~~~~~~D~~~~~~~~~D~~~~~~~~~D|

假设有4个key,A以5秒1次的频率被访问,B访问频率是2秒1次,C和D的访问频率都是10秒1次。因为B有最高的访问频率,所以B的空闲访问时间是最小的。它的上次访问时间也是第二最近的。但是D是一个特例,它的访问频率是10秒1次,但是它的访问时间是最近的。

当然,长期来看,这个算法还是不错的。通常访问频率高的key都有相对比较小的空闲时间。LRU算法会换掉最近最少使用的key,即空闲时间最长的。这个算法实现起来非常简单,我们秩序要跟踪一个key上次访问的时间即可,甚至有时候都不用,只要维持一个链表,有访问的就移动到表头,需要换掉元素的时候,就移除链表尾部的。

Redis最早并不支持LRU替换。通过修改Redis对象结构,作者挤出了24bit空间来做这个事情。因为指针太大,也没有空间来用链表实现。24bit用来存时间戳的低位已经足够了,可以支撑194天了,key的数据刷新频繁,够用了。

如何选择最大空闲时间的key来换出也是一个问题,Redis的key存放在一个平坦的哈希表里,添加一个额外的数据结构来完成代价太大。既然LRU是理想换页的一个渐近算法,我们何不尝试下LRU的渐近算法呢?

Redis的原始实现非常简单:当需要换出一个Key的时候,选任意3个key,,换出其中空闲时间最长的。相当于对整个key空间进行随机采样,并换出较好的选择。后来这个算法演变成N个随机key,算法优化后,默认变成采样5个key,速度没有损失。虽然实现是如此简单,但工作起来非常好。如果你仔细思考,你会发现你不可能用这个算法作出最佳决定,但是你也不大可能作出非常坏的决定。如果数据集里有一堆经常访问的key,5选1不大可能都挑中“热”的key。

redis的LRU算法(一)的更多相关文章

  1. redis的LRU算法(二)

    前文再续,书接上一回.上次讲到redis的LRU算法,文章实在精妙,最近可能有机会用到其中的技巧,顺便将下半部翻译出来,实现的时候参考下. 搏击俱乐部的第一法则:用裸眼观测你的算法 Redis2.8的 ...

  2. Redis的LRU算法

    Redis的LRU算法 LRU算法背后的的思想在计算机科学中无处不在,它与程序的"局部性原理"很相似.在生产环境中,虽然有Redis内存使用告警,但是了解一下Redis的缓存使用策 ...

  3. 【Redis 设置Redis使用LRU算法】

    转自:http://ifeve.com/redis-lru/ 本文将介绍Redis在生产环境中使用的Redis的LRU策略,以及自己动手实现的LRU算法(php) 1.设置Redis使用LRU算法 L ...

  4. Redis内存回收:LRU算法

    Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...

  5. Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?

    在<Redis 数据缓存满了怎么办?>我们知道 Redis 缓存满了之后能通过淘汰策略删除数据腾出空间给新数据. 淘汰策略如下所示: 设置过期时间的 key volatile-ttl.vo ...

  6. Redis学习笔记2-使用 Redis 作为 LRU 缓存

    当 Redis 作为缓存使用时,当你添加新的数据时,有时候很方便使 Redis 自动回收老的数据.LRU 实际上是被唯一支持的数据移除方法.Redis 的 maxmemory 指令,用于限制内存使用到 ...

  7. Redis - 作为 LRU 缓存

    一.简介 LRU 实际上是被唯一支持的数据移除方法,同时也是 memcached 默认支持的缓存算法. 二.配置内存大小 在 redis.conf 文件中使用 maxmemory 指令能够配置内存大小 ...

  8. Redis作为lru缓存作用

    当 Redis 作为缓存使用时,当你添加新的数据时,有时候很方便使 Redis 自动回收老的数据.LRU 实际上是被唯一支持的数据移除方法.Redis 的 maxmemory 指令,用于限制内存使用到 ...

  9. 用redis当作LRU缓存

    原文地址:https://redis.io/topics/lru-cache Redis可以用来作缓存,他可以很方便的淘汰(删除)旧数据添加新数据,类似memcached.LRU只是其中的一种置换算法 ...

随机推荐

  1. Win10安装.NetFamework3.5

    步骤1:装载Win10安装镜像 本人用的是"cn_windows_10_multiple_editions_x64_dvd_6848463.iso" 如图,我把镜像装载到H盘; 步 ...

  2. Python3+Requests-HTML+Requests-File解析本地html文件

    一.说明 解析html文件我喜欢用xpath不喜欢用BeautifulSoup,Requests的作者出了Requests-HTML后一般都用Requests-HTML. 但是Requests-HTM ...

  3. CentOS 中安装和卸载 Emacs

    日志更新记录: [1] 增加 CentOS7.2 (内核版本:3.10.0-514.16.1.el7.x86_64)下Emacs25.2 的安装过程,它与本文的步骤完全一样. Emacs 版本:htt ...

  4. 数据可视化之 tick_params( 参数 )

    参考:https://blog.csdn.net/helunqu2017/article/details/78736554/ 初学数据可视化,遇到了tick_params() 里面传参数问题,找了一些 ...

  5. 转载:Shell 脚本加密 - 略有修改

    shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件. shc 安装 yum -y install shc 如果yum不能安装,请移步官方下载rpm包 http ...

  6. Qt 分页标题打印

    void ItemSplitter::printpdf(const QString& fileName){ QPrinter printer_html(QPrinter::ScreenReso ...

  7. canvas 实现刮刮乐

    在解决问题前,我们先来了解一下 canvas 标签canvas 是 html5 出现的新标签,像所有的 dom 对象一样它有自己本身的属性.方法和事件,其中就有绘图的方法,js 能够调用它来进行绘图. ...

  8. python第三方库------jieba库(中文分词)

    jieba“结巴”中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点支持三种分词模式: 精确模式,试图将句子最精确地切开, ...

  9. Django数据同步过程中遇到的问题:

    1.raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__ve ...

  10. Python爬虫入门之正则表达式

    在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...