Redis过期策略和内存淘汰策略

过期策略

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值