一、LRU简介

LRU是Least Recently Used的缩写,即:最近最少使用。

它是内存管理中的一种页面置换算法,对于在内存中但是又不用的数据块,操作系统会根据哪些数据属于LRU而将其移除内存而腾出空间来加载另外的数据。

二、redis LRU

官方文章:https://redis.io/topics/lru-cache#using-redis-as-an-lru-cache

redis常常被用作缓存,当有新的数据进来的时候会自动驱逐旧的数据。LRU是memcached 默认的驱逐策略,在开发者当中也是常常被提及的。

1)最大内存配置

在redis LRU缓存使用中,你需要配置最大内存。最大内存的作用是限制redis的内存使用,当内存使用接近最大值的时候就会根据驱逐策略进行旧数据驱逐。

你可以通过redis.conf配置:

  1. macmemory 100mb

当然新版的redis可以通过命令来配置你可以使用命令

  1. config set maxmemory '100mb'

来配置

2)驱逐策略

最大内存限制了内存的使用以及临界值,那么驱逐策略则定义旧数据的驱逐方式,可用的策略有以下几种:

1、noeviction: 当接近最大值的时候报错

2、allkeys-lru: 移除所有keys中最近最少使用的key

3、volatile-lru: 移除所有携带过期时间(expire set)的keys中最少使用的key

4、allkeys-random: 随机移除所有key

5、volatile-random: 随机移除所有携带过期时间(expire set)的key

6、volatile-ttl: 移除携带过期时间(expire set),且剩余过期时间更短的key

3) 执行流程

1、当客户端发送一个命令,需要新增数据

2、服务端会检查内存使用情况,如将要大于限制,它就会根据驱逐策略驱逐key以释放空间;

3、新命令被执行,以此类推。

4)近似LRU算法

事实上,Redis LRU 算法并不完全是LRU算法的实现,只能说是接近于LRU算法。尤其是在3.0版本以后已经非常接近LRU算法了。

Redis LRU 算法不会计算出所有keys当中最接近的(因为会比较耗内存),而是从所有key当中挑选出样本,然后再挑选样本的算法基础上驱逐最接近的。

你可以配置样本的数量:

  1. maxmemory-samples 5

我们看官方网站提供的一张对比图,LRU算法和Redis LRU算法的对比:

说明:1、绿色区域是新增数据;2、灰色区域是未驱逐数据;3、浅灰色区域是驱逐数据。

左上角是LRU算法,右上角是样本为10的Redis3.0 LRU算法,左下角是样本为5的Redis 2.8 LRU算法,右下角是样本为5的Redis3.0 LRU。

很明显,相同样本的情况下,3.0版本较2.8版本有了很大程度的进步,更接近LRU算法。

在3.0版本中样本为10较样本为5的情况来说已经非常接近LRU算法。

三、Redis LFU

从redis4.0开始,提供了一种新的策略LFU (Least Frequently Used eviction mode),意思就是根据历史的最少访问频率来决定驱逐的数据。这种策略的中心思想是认为,如果该数据历史访问频率很高,那么在未来的访问频率也会很高。

LFU有两种选择:

1)volatile-lfu: 从携带过期时间的keys中选择历史访问最少的key

2) allkeys-lfu: 从所欲keys中选择历史访问最少的key

四、LFU算法介绍:

在redis中每个对象都有24bits空间来记录LRU/LFU信息:

当这24bits用作LFU时,其被分为两部分:

1、高16位用来记录访问时间(单位:分钟)

2、低8位用来记录访问频率,简称(counter)

我们来看counter:基于概率的对数计数器

我们通常计数器就是直接递增,但redis的计数器只有8bits最大值也就是2^8 - 1 = 255 ,如果采用直接递增的方式那么最多只能记录255频率。

因此,redis在这里采用了概率对数的方法,在默认概率因子配置:lfu_log_factor = 10 的情况下,8bits可以表示100万的访问频率。

概率对数的算法让8bits可以记录很高的访问频率,但是如果计数器只做增长,就无法区分热点key。可能出现的情况就是即使长时间没有访问,它的访问频率依然很高。

针对这种情况,redis提供了一个衰减因子lfu_decay_time(单位:分钟),目的就是如果一个key长时间没有被访问那么计数器就要减少,减少的值由衰减因子来控制。

redis的衰减因子默认值为1,意思是如果N分钟没有被访问,那么计数器就减 1 * N。

上面的概率因子和衰减因子,redis都有默认值,当然也可以进行配置:

  1. lfu-log-factor 10
  2. lfu-decay-time 1

Redis LFU算法可以参考文章:https://yq.aliyun.com/articles/278922

redis(7)LRU缓存的更多相关文章

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

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

  2. Redis - 作为 LRU 缓存

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

  3. Redis作为lru缓存作用

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

  4. 用redis当作LRU缓存

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

  5. Redis做LRU缓存

    当Redis用作缓存时,通常可以让它在添加新数据时自动逐出旧数据. 这种行为在开发人员社区中非常有名,因为它是流行的memcached系统的默认行为. LRU实际上只是支持的驱逐方法之一. 本页介绍了 ...

  6. redis文档翻译_LRU缓存

    Using Redis as an LRU cache使用Redis作为LRU缓存 出处:http://blog.csdn.net/column/details/redisbanli.html Whe ...

  7. 动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略

    我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题, ...

  8. 在我们使用Redis作为一个LRU缓存的时候,怎么做才能更高效

    当用Redis作为一个LRU存储时,有些时候是比较方便的,在你增添新的数据时会自动驱逐旧的数据.这种行为在开发者论坛是非常有名的,因为这是流行的memcached系统的默认行为. LRU实际上只是支持 ...

  9. 【Redis】LRU算法和Redis的LRU实现

    LRU原理 在一般标准的操作系统教材里,会用下面的方式来演示 LRU 原理,假设内存只能容纳3个页大小,按照 7 0 1 2 0 3 0 4 的次序访问页.假设内存按照栈的方式来描述访问时间,在上面的 ...

随机推荐

  1. jvisualvm_使用jmx连接远程linux应用

    [前提] JVisualVM是由Sun提供的性能分析工具,在Jdk6.0以后的版本中是自带的,如果是用Jdk1.5或以前版本的就得要单独安装了. [1]远程机器需要开启jmx 在使用jvisualvm ...

  2. [ActionScript 3.0] flash中的颜色

    在 Flash 中,颜色就是一串特殊的数字,一个颜色值可以是0到16,777,215中的任意数值,这就是24位(bit)色彩.也许大家会问,为什么有16,777,216(256*256*256)种颜色 ...

  3. ubuntu15.04下安装jdk8

    前几天手贱,删掉了ubuntu自带的java,最后安装时遇到了Picked up JAVA_TOOL_OPTIONS的问题,经过网上各种找,终于被我弄成功了.下面将经验下载下面供大家方便: jdk8的 ...

  4. python2与python3差异,以及如何写两者兼容代码

    1.路径差异: 绝对导入:跳过包内,直接搜索 sys.path ,在sys.path的基础上进行我们的模块搜索. 相对导入:先包内,再包外,再,,, python2是默认相对导入的,因此对于一般性的导 ...

  5. jquery 实现省市二级联动

    效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. Kettle 解决数据锁的问题(事务(进程 ID 51)与另一个进程被死锁在 锁 资源上)

    1.Kettle做了一个作业, 执行的时候问题发生在步骤2和步骤3之间,也就是步骤2还未完全执行完的时候,步骤3就要更新步骤2插入的数据,造成死锁.(我的理解是既然都分开作业了,那么每个作业都是一个单 ...

  7. 高阶篇:4.1.1)QFDI(客户需求转换为设计要求)

    本章目的:明确QFDI的作用:收集客户需求(Customer Needs),转换为设计要求(Design Feature).并介绍其制作方法. 1.QFDI质量屋举例 不用怀疑,现在大部分参考教材所谓 ...

  8. CDQZ Day6

    1DP #2题目名称 种植 计数 棋盘 树输入文件名 plant.in count.in chess.in tree.in输出文件名 plant.out count.out chess.out tre ...

  9. C#集合之队列

    队列是其元素按照先进先出(FIFO)的方式来处理的集合. 队列使用System.Collections.Generic名称空间中的泛型类Queue<T>实现.在内部,Queue<T& ...

  10. 论文阅读 | ExtremeNet:Bottom-up Object Detection by Grouping Extreme and Center Points

    相关链接 论文地址:https://arxiv.org/abs/1901.08043 论文代码:https://github.com/xingyizhou/ExtremeNet 概述 ExtremeN ...