过期策略 Redis keys过期有两种方式:被动和主动方式。 被动方式:当客户端尝试访问过期keys时,会检查keys是否过期,过期则删除。 主动方式:但是有些过期的keys,客户端永远不会去访问他们。所以,应该定时随机检查keys的过期时间 具体就是Redis每秒10次做的事情: - 随机检查20个keys的过期时间。 - 删除所有已经过期的keys。 - 如果有多于25%的keys过期,重复步奏1. - 不断重复过期检测,直到过期的keys的百分比低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys 内存淘汰策略 最大内存配置选项 maxmemory 配置选项使用来配置 Redis 的存储数据所能使用的最大内存限制。可以通过在内置文件redis.conf中配置,也可在Redis运行时通过命令CONFIG SET来配置。例如,我们要配置内存上限是100M的Redis缓存,那么我们可以在 redis.conf 配置如下: maxmemory 100mb 设置 maxmemory 为 0 表示没有内存限制。在 64-bit 系统中,默认是 0 无限制,但是在 32-bit 系统中默认是 3GB。 当存储数据达到限制时,Redis 会根据情形选择不同策略,或者返回errors(这样会导致浪费更多的内存),或者清除一些旧数据回收内存来添加新数据。 回收策略 当内存达到限制时,Redis 具体的回收策略是通过 maxmemory-policy 配置项配置的。 以下的策略都是可用的: - noenviction:不清除数据,只是返回错误,这样会导致浪费掉更多的内存,对大多数写命令(DEL 命令和其他的少数命令例外) - allkeys-lru:从所有的数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰,以供新数据使用 - volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰,以供新数据使用 - allkeys-random:从所有数据集(server.db[i].dict)中任意选择数据淘汰,以供新数据使用 - volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰,以供新数据使用 - volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰,以供新数据使用 当 cache 中没有符合清除条件的 key 时,回收策略 volatile-lru, volatile-random 和volatile-ttl 将会和 策略 noeviction 一样返回错误。根据业务特点选择正确的回收策略是很重要的。但是,你可以在程序运行时重新配置策略,使用 INFO 输出来监控缓存命中和错过的次数,以调优你的设置。 普适经验规则: 如果用户请求呈现幂律分布(power-law distribution),也就是,期望一部分子集元素被访问得远比其他元素多时,可以使用allkeys-lru策略。在你不确定时这是一个好的选择。 如果期望是循环周期的访问,所有的键被连续扫描,或者期望请求符合平均分布(每个元素以相同的概率被访问),可以使用allkeys-random策略。 如果你期望能让 Redis 通过使用你创建缓存对象的时候设置的TTL值,确定哪些对象应该是较好的清除候选项,可以使用volatile-ttl策略。 当你想使用单个Redis实例来实现缓存和持久化一些键,allkeys-lru和volatile-random策略会很有用。但是,通常最好是运行两个Redis实例来解决这个问题。 另外值得注意的是,为键设置过期时间需要消耗内存,所以在内存压力下使用像allkeys-lru这样的策略会比为键的回收设置过期时间更高效。
参考:
expire 命令 -- Redis中国用户组(CRUG)redishttp://www.redis.cn/commands/expire.html使用Redis作为LRU缓存https://www.redis.com.cn/topics/lru-cache.html