redis过期与内存淘汰策略


讨论redis 过期策略时,首先了解redis的过期设置

redis 过期时间

Redis提供了四个命令来设置数据过期时间:

  • EXPIRE key ttl :表示将键 key 的生存时间设置为 ttl 秒。
  • PEXPIRE key ttl :表示将键 key 的生存时间设置为 ttl 毫秒。
  • EXPIREAT key timestamp:表示将键 key 的生存时间设置为 timestamp 所指定的秒数时间戳。
  • PEXPIREAT key timestamp :表示将键 key 的生存时间设置为 timestamp 所指定的毫秒数时间戳。

在Redis内部实现中,前面三个设置过期时间的命令最后都会转换成最后一个PEXPIREAT 命令来完成

redis 过期策略

redis过期策略分为三种:

过期策略描述优点缺点
定时过期在设置某个key 的过期时间同时,创建的定时器,会在该过期时间到来时,立即执行对其进行删除的操作定时删除对内存是最友好的,确保内存的key一旦过期就能立即从内存中删除。对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响。
惰性删除设置该key 过期时间后,不去管它,当需要该key时,在检查其是否过期,如果过期,删掉,反之返回该key对 CPU友好,只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。对内存不友好,如果一个键已经过期,一直没有使用,该键会一直在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。从而造成内存泄漏。
定期删除每隔一段时间,对一些key进行检查,删除里面过期 key可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。定期删除,也能有效释放过期键占用的内存难以确定删除操作执行的时长和频率。执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。

redis 的过期策略各有优确定,单一策略可能无法满足业务,redis 使用组合策略,redis采用惰性删除和定期删除两种策略配合使用。

redis 内存淘汰策略

  • 通过设置内存最大值,redis 所有的配置都在redis.conf中进行配置,内存通过maxmemory 设置
  • 设置内存淘汰策略
1.volatile-lru: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)
2.allkeys-lru:   当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
3.volatile-random: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
4.allkeys-random:  当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,
5.volatile-ttl:  当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除
6.noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错 ,默认选项,一般不会选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值