Redis过期处理

Redis很多时候是被服务器用作缓存,很多缓存都是临时缓存一下,之后可能不会用到。

比如我们短信验证码,每个用户在登录用完验证码就不会再使用。

因此 Redis 存在一个过期时间的设定。

对储存再Redis中的数据设置一个过期时间。具体如下

redisTemplate.opsForValue().set("code", "78987", 1000,TimeUnit.MILLISECONDS);

其中,第一个值表示‘key’,第二个值表示‘value’,第三个值表示’过期数’,第四个值表示‘时间单位’

这里表示为1000毫秒后过期。

  • TimeUnit.MILLISECONDS : 毫秒
  • TimeUnit.SECONDS : 秒
  • TimeUnit.MINUTES : 分钟
  • TimeUnit.HOURS : 小时
  • TimeUnit.DAYS : 天

设置Rdis List的过期时间

列表结构的操作方法:

redisTemplate.opsForList().leftPush()

是无法设置过期时间的,这时可以用:

redisTemplate.expire("category", 60, TimeUnit.MINUTES);

设置过期时间,第一个参数是数据key,第二第三个组合表示具体时间。

其实 redisTemplate.expire() 是一个通用方法,可以为任何数据类型设置过期时间。

删除策略

但,虽然一个键已经过期,但并不会被立刻删除,而只是被标记为过期。至于什么时候删除,就涉及到服务器的删除策略。

服务器有多种删除策略:

1.惰性删除

每次查询或写键时,都会检查取得的键是否过期。如果过期就删除该键,否则就返回该键

这样做对 CPU 最友好。只有在操作的时候进行过期检查,删除的目标仅限于当前需要处理的键,不会在删除其他无关本次操作的过期键上花费任何 CPU 时间。

但是对内存不友好,键过期了,但因为一直没有被访问到,所以一直保留着一直占着存储空间。

2.定期删除

每隔一段时间,程序就对数据库进行检查,删除里面的过期键。至于要删除多少过期键,以及检查多少数据库,则由算法决定。

3.定时删除

在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。

这样的做法对于内存是最好的,可以即使释放存储空,但是对于 cpu 却不好,在过期键比较多的情况下,删除过期键会占用相当一部分 CPU 时间。

这样对服务期的性能会有影响