欢迎光临
我们一直在努力

Redis(四) — 淘汰过期策略

一:惰性删除

1.1 策略描述

当访问redis中键值对时会判断这个键值对是否过期,如果过期的话就会删除这个键值对并返回nil

1.2 策略优缺

  • 优点:对CPU友好,不用执行与当前命令无关的操作
  • 缺点:对内存不友好,当大量过期的键值对不被访问时会浪费大量内存空间

二:定期删除

2.1 策略描述

为了弥补惰性删除对于内存的不友好,redis中还有一种过期策略即定期删除。当一个键值对设置expire后,redis中会维护一个过期字典。这个过期字典在redis中会使用serverCron时间事件轮训,轮训过期键值对进行释放

2.2 策略详解

redis.conf配置文件中hz配置项配置serverCron每秒执行次数,默认10表示每100ms执行一次serverCron。redis中限制每次过期key清理时间不超过CPU时间的25%,这段时间内会执行如下步骤操作:

  • 1:随机选取过期字典中的100个key
  • 2:淘汰所有的过期key
  • 3:如果过期key超过25个则重复步骤1

三:主动清理

物理机的内存空间是有限的,当所有内存被占满以后redis接收到写操作命令应该怎么处理?相关的清理策略又是什么?

3.1 触发机制

redis.conf配置文件中maxmemory参数设置redis占用内存的大小,当超过这个值限定以后将会根据maxmemory-policy设置清理redis内存对象。有关这个maxmemory提醒一点:

  • 集群环境下适当调低maxmemory配置,给output buffer预留空间。因为output buffer空间并不包括在maxmemory中

3.2 清理策略

清理策略划分可以分为两个维度三个方面,两个维度分别是过期键中筛选所有键中筛选,三个方面分别是lruttlrandom

  • volatile-lru:过期键中最长时间未调用的键值对
  • volatile-ttl:过期键中即将过期的键值对
  • volatile-random:过期键中随机删除
  • allkeys-lru:所有键中最长时间未调用的键值对
  • allkeys-random:所有键中随机删除
  • noevication:不清理,返回异常

3.3 相关参数

# 策略启动阈值
maxmemory <bytes>
# 清理策略类型
# 默认不清理直接返回异常noeviction
maxmemory-policy noeviction
# 如策略采用volatile-lru,每次删除会选择参数设置个数样本键值对
# 然后删除其中lru时间最长的键值对
# 源码注释中告诉我们默认参数5比较合适
# 10的话淘汰的ttl或者lru精度很高,但是CPU消耗比较大
# 3的话会很快,但是精度不会太高
maxmemory-samples 5
复制代码

转载本站文章请注明,转载自:IT技术资讯 [https://www.ithothub.com]

本文链接:https://www.ithothub.com/redis/2020060417073556.html

赞(0) 打赏

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏