Redis 缓存淘汰机制 :LRU 淘汰

  • U),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
  • volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

可以看到上面回收策略有俩个纬度,

  1. 回收的键的范围
  2. 过期集合
  3. 不区分是过期集合
  4. 回收策略
  5. 随机
  6. 基于lru

然后基于上面俩种纬度,做个组合就是四种主要策略。

需要注意的这里提到的过期集合,翻译并不是特别准确。它并不是指的这些键是已经过期了,而是指存放着含有过期时间的键;如果一个键没有过期时间,那么就不会存在在该集合中。redis中可以对键设置过期时间,只要是设置了过期时间的键都会存放在redis中专门的一个数据结构。

淘汰逻辑

lru淘汰的主要执行逻辑是在方法freeMemoryIfNeeded(void) 。在方法执行期间,客户端发出的命令会被阻塞住。阻塞命令执行也是为了避免更多的内存被使用。

算法主要逻辑:


do
{
         for(db in dbs)
         {
                根据配置的淘汰策略
                选择最适合的key
                释放资源
          }

}while(freed < tofreed)//已经释放的小于需要释放的

选择最合适的key这一步操作就要结合上面所说的,redis设置的几种淘汰策略。根据redis设置的淘汰策略,选择出需要淘汰的key,然后通过key释放起资源。

需要注意的是在这里的lru也不是严格的lru算法,它是基于一个配置的大小值maxmemory_samples,循环遍历samples,随机获取key然后找到一个最合适的key,然后把该key删除掉。网上也有文章分析,在这种类lru算法下,基本和真正的lru算法的性能没有太大差异,但是相比较于真正严格的lru效率要更高。

判断那个key是最合适是通过比较该key的lru时间和sever里维护的lru_clock差值。server.lruclock在定时事件中会被定时循环更新,会更新成和当前时钟值有个倍数关系的值。

/* Given an object returns the min number of seconds the object was never
 * requested, using an approximated LRU algorithm. */
unsigned long estimateObjectIdleTime(robj *o) {
    if (server.lruclock >= o->lru) {
        return (server.lruclock - o->lru) * REDIS_LRU_CLOCK_RESOLUTION;
    } else {
        return ((REDIS_LRU_CLOCK_MAX - o->lru) + server.lruclock) *
                    REDIS_LRU_CLOCK_RESOLUTION;
    }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏领域驱动设计DDD实战进阶

微服务实战(八):落地微服务架构到直销系统(服务高可用性)

在微服务架构风格的系统中,如果单个微服务垮掉或地址不可访问,虽然对系统的影响是有限的,但我们也必须采取一定的手段来保证每个微服务尽量可用;并且在大并发的情况下,...

1663
来自专栏精讲JAVA

Http 持久连接与 HttpClient 连接池

HTTP协议是无状态的协议,即每一次请求都是互相独立的。因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接。

1893
来自专栏用户画像

Matlab 读写文件

一、读取文本文件 思路: 1、用fopen来打开一个文件句柄 2、用fgetl来获得文件中的一行,如果文件已经结束,fgetl会返回-1 3、用fclo...

543
来自专栏编程一生

Redis和消息队列使用实战

1613
来自专栏博客园迁移

redis见解

http://blog.csdn.net/zhiguozhu/article/details/50517527 Redis 原生session与redis中的s...

1131
来自专栏Esofar 开发日记

[译]RabbitMQ教程C#版 - 远程过程调用(RPC)

但是如果我们想要运行一个在远程计算机上的函数并等待其结果呢?这将是另外一回事了。这种模式通常被称为 远程过程调用 或 RPC 。

870
来自专栏熊二哥

.NET工作准备--04ASP.NET

(已过时) ASP.NET 1.开发基础 *asp.net以什么形式运行?.net宿主的概念,ISAPI的概念,ASP.NET基本运行机制; .net宿主...

2095
来自专栏丑胖侠

Curator分布式锁之生成流水号

在分布式系统中,为了保证数据的一致性,往往需要进行同步控制,比如减库存、唯一流水号生成等。Curator对Zookeeper进行了封装,实现了分布式锁的功能,提...

2835
来自专栏熊训德的专栏

Hbase replication源码分析

本文主要通过Replication的核心原理和failover 过程,对Hbase replication源码分析,希望对大家了解Hbase源码有所帮助。

9860
来自专栏GreenLeaves

WCF系列教程之WCF服务宿主与WCF服务部署

本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆。 一、简介 任何一个程序...

2198

扫码关注云+社区