redis数据淘汰机制

redis数据淘汰机制

 

 

概述

在 Redis 中,允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下是很有用的。譬如,在一台 8G 机子上部署了 4 个 Redis 服务点,每一个服务点分配 1G 的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

 

 

 

 

Redis 提供 6 种数据淘汰策略

 

  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰
  4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. no-enviction(驱逐):禁止驱逐数据 ,不淘汰数据,直接报错

默认使用:no-enviction

 

Redis 确定驱逐某个键值对后,会删除这个数据,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。

 

 

 

 

LRU 数据淘汰机制

 

       每一个 Redis 对象都会设置相应的 lru,即最近访问的时间。可以想象的是,每一次访问数据的时候,会更新 redisObject.lru。

 

淘汰原理:

 

       在数据集中随机挑选几个键值对,取出其中 lru 最大的键值对淘汰。所以,你会发现,Redis 并不是保证取得所有数据集中最近最少使用(LRU)的键值对,而只是随机挑选的几个键值对中的。

 

 

 

 

TTL 数据淘汰机制

 

       Redis 数据集数据结构中保存了键值对过期时间的表,即 redisDb.expires,在使用 SET 命令的时候,就有一个键值对超时时间的选项。

 

淘汰原理:

 

       从过期时间 redisDB.expires 表中随机挑选几个键值对,取出其中 ttl 最大的键值对淘汰。同样你会发现,Redis 并不是保证取得所有过期时间的表中最快过期的键值对,而只是随机挑选的几个键值对中的。

 

 

 

 

什么时候开始淘汰数据

 

       Redis 每服务客户端执行一个命令的时候,会检测使用的内存是否超额。如果超额,即进行数据淘汰。

 

       数据淘汰策略其实只是其中一种数据的删除策略,从大方向上看,应该看看redis数据删除策略

 

 

 

数据删除策略有三种:

 

  1. 被动删除:只有key被操作时(如GET),Redis才会被动检查该key是否过期,如果过期则删除之并且返回NIL。
  2. 主动删除:定期删除过期的数据,可以配置
  3. 当前已用内存超过maxmemory限定时,触发数据淘汰策略

被动删除特点:

 

  1. 这种删除策略对CPU是友好的,删除操作只有在不得不的情况下才会进行,不会其他的expire key上浪费无谓的CPU时间。
  2. 但是这种策略对内存不友好,一个key已经过期,但是在它被操作之前不会被删除,仍然占据内存空间。如果有大量的过期键存在但是又很少被访问到,那会造成大量的内存空间浪费。expireIfNeeded(redisDb *db, robj *key)函数位于src/db.c。

 

 

   

参考 

http://wiki.jikexueyuan.com/project/redis/data-elimination-mechanism.html

http://www.tuicool.com/articles/vQNZJb3

你可能感兴趣的:(数据库--redis高级,数据库)