侧边栏壁纸
博主头像
敢敢雷博主等级

永言配命,自求多福

  • 累计撰写 57 篇文章
  • 累计创建 0 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Redis淘汰策略

敢敢雷
2020-02-28 / 0 评论 / 0 点赞 / 1,117 阅读 / 1,109 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我删除。

Redis在生产环境中,采用配置参数maxmemory 的方式来限制内存大小。当实际存储内存超出maxmemory 参数值时,开发者们可以通过这几种方法——Redis内存淘汰策略,来决定如何腾出新空间继续支持读写工作。

淘汰策略工作流程

首先,客户端会发起需要更多内存的申请。
其次,Redis检查内存使用情况,如果实际使用已经超出maxmemory,redis就会根据用户配置的淘汰策略选出无用的key。
最后,确认选中数据没有问题,成功执行淘汰任务。

淘汰策略

Redis淘汰策略一共有六种

  • volatile-lru
  • volatile-ttl
  • volatile-random
  • allkeys-lru
  • allkeys-random
  • no-enviction

volatile-lru

从设置的过期时间的数据集中挑选出最近最少使用的数据淘汰。没有设置过期时间的key不会被淘汰,这样就可以在增加内存空间的同时保持需要持久化的数据不会丢失。

volatile-ttl

除了淘汰机制采用LRU,策略上基本与volatile-lru相似,从设置过期时间的数据集中挑选将要过期的数据淘汰,ttl值越大越优先被淘汰。

volatile-random

从已设置过期时间的数据集中任意选择数据淘汰。当内存达到限制无法写入非过期时间的数据集时,可以通过该淘汰策略在主键空间中随机移除某个key。

allkeys-lru

从全数据集中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的时全体key集合,而非过期的key集合。

allkeys-random

从数据集选择任意数据淘汰。

no-enviction

禁止驱逐数据,当内存不足以纳入新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失,这也是系统默认的一种淘汰策略。

正确选择淘汰策略

开发者需要根据自身系统特征,正确选择或修改驱逐。

  1. 在Redis中,数据有一部分访问频率较高,其余部分访问频率较低,或者无法预测数据的使用频率时,设置allkeys-lru是比较合适的。
  2. 如果所有数据访问概率大致相等时,可以选择allkeys-random。
  3. 如果研发者需要通过设置不同的ttl来判断数据过期的先后顺序,此时可以选择volatile-ttl策略。
  4. 如果希望一些数据能长期被保存,而一些数据可以被淘汰掉时,选择volatile-lru或volatile-random都是比较不错的。
  5. 由于设置expire会消耗额外的内存,如果计划避免Redis内存在此项上的浪费,可以选用allkeys-lru 策略,这样就可以不再设置过期时间,高效利用内存了。

Redis淘汰策略主要分为LRU淘汰,TTL淘汰,随机淘汰三种机制。

LRU淘汰

最近最少使用。核心思想是 如果数据最近被访问过,那么将来被访问的机率也更高了

TTL淘汰

TTL数据淘汰机制中会先从过期时间表中随机挑选几个键值对,取出其中ttl最大的键值对淘汰。
同样,TTL淘汰策略并不是面向所有过期时间的表中最快过期的键值对,而只是随机挑选的几个键值对。

随机淘汰

在随机淘汰的场景下获取待删除的键值对,随机找hash桶再次hash指定位置的dictEntry即可。

Redis中的淘汰机制都是几近于算法实现的,主要从性能和可靠性上做平衡,所以并不是完全可靠,所以开发者们在充分了解Redis淘汰策略之后还应在平时多主动设置或更新key的expire时间,主动删除没有价值的数据,提升Redis整体性能和空间。

0

评论区