• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
剖析 redis 数据淘汰策略
发布日期:2016-4-16 11:4:57

  剖析 redis 数据淘汰策略

  一、概述

   与mysql不一样的是,redis 允许用户设置最大使用内存大小 server.maxmemory,在内存限定的情况下,这是很有用的。比如在一台 8G 机子上部署了 4 个 redis 服务点,每一个服务点分配 1.5G 的内存大小,这会减少内存紧张的情况,由此获取更为稳健的服务。

  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(驱逐):禁止驱逐数据

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

  二、LRU 数据淘汰机制

  在服务器配置中保存了 lru 计数器 server.lrulock,就会定时(redis 定时程序 serverCorn())更新,server.lrulock 的值是根据 server.unixtime 计算出来的。

  此外,从 struct redisObject 中可以发现,每一个 redis 对象都会设置相应的 lru。我们能想象的是,每一次访问数据的时候,就会更新 redisObject.lru。

  LRU 数据淘汰机制是这样的,可以参考以下程序:在数据集中随机挑选几个键值对,取出其中 lru 最大的键值对淘汰。因此,你会发现,redis 并不是保证取得所有数据集中最近最少使用(LRU)的键值对,而只是随机挑选的几个键值对中的。

    


                        代码1

  三、TTL 数据淘汰机制

  redis 数据集数据结构中保存了键值对过期时间的表,即 redisDb.expires。与 LRU 数据淘汰机制类似,TTL 数据淘汰机制是这个样子的:从过期时间的表中随机挑选几个键值对,取出其中 ttl 最大的键值对将其淘汰。你也会发现,redis 并不是保证取得所有过期时间的表中最快过期的键值对,而只是随机挑选的几个键值对中的。

  四、总结

  redis 每服务客户端执行一个命令的时候,就会检测使用的内存是否超额。若超额,就进行数据淘汰。如下面的代码所示:



后面我们会更新一些关于mysql的文章,敬请关注。