Redis(四) -- 淘汰过时策略

一:惰性删除

1.1 策略描述

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

1.2 策略优缺

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

二:按期删除

2.1 策略描述

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

2.2 策略详解

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

  • 1:随机选取过时字典中的100个key
  • 2:淘汰全部的过时key
  • 3:若是过时key超过25个则重复步骤1

三:主动清理

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

3.1 触发机制

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

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

3.2 清理策略

清理策略划分能够分为两个维度三个方面,两个维度分别是过时键中筛选全部键中筛选,三个方面分别是lruttlrandomserver

  • 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
复制代码