- , 23 2月 2022
- 作者 847954981@qq.com
- 后端学习, 我的编程之路
Redis过期处理
Redis很多时候是被服务器用作缓存,很多缓存都是临时缓存一下,之后可能不会用到。
比如我们短信验证码,每个用户在登录用完验证码就不会再使用。
因此 Redis 存在一个过期时间的设定。
对储存再Redis中的数据设置一个过期时间。具体如下
代码语言:javascript复制redisTemplate.opsForValue().set("code", "78987", 1000,TimeUnit.MILLISECONDS);
其中,第一个值表示‘key’,第二个值表示‘value’,第三个值表示’过期数’,第四个值表示‘时间单位’
这里表示为1000毫秒后过期。
- TimeUnit.MILLISECONDS : 毫秒
- TimeUnit.SECONDS : 秒
- TimeUnit.MINUTES : 分钟
- TimeUnit.HOURS : 小时
- TimeUnit.DAYS : 天
设置Rdis List的过期时间
列表结构的操作方法:
代码语言:javascript复制redisTemplate.opsForList().leftPush()
是无法设置过期时间的,这时可以用:
代码语言:javascript复制redisTemplate.expire("category", 60, TimeUnit.MINUTES);
设置过期时间,第一个参数是数据key,第二第三个组合表示具体时间。
其实 redisTemplate.expire()
是一个通用方法,可以为任何数据类型设置过期时间。
删除策略
但,虽然一个键已经过期,但并不会被立刻删除,而只是被标记为过期。至于什么时候删除,就涉及到服务器的删除策略。
服务器有多种删除策略:
1.惰性删除
每次查询或写键时,都会检查取得的键是否过期。如果过期就删除该键,否则就返回该键
这样做对 CPU 最友好。只有在操作的时候进行过期检查,删除的目标仅限于当前需要处理的键,不会在删除其他无关本次操作的过期键上花费任何 CPU 时间。
但是对内存不友好,键过期了,但因为一直没有被访问到,所以一直保留着一直占着存储空间。
2.定期删除
每隔一段时间,程序就对数据库进行检查,删除里面的过期键。至于要删除多少过期键,以及检查多少数据库,则由算法决定。
3.定时删除
在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
这样的做法对于内存是最好的,可以即使释放存储空,但是对于 cpu 却不好,在过期键比较多的情况下,删除过期键会占用相当一部分 CPU 时间。
这样对服务期的性能会有影响