为什么需要数据过期处理?
Redis经常被用来作为缓存数据库,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了,如果不进行处理,那么缓存数据堆积会导致内存泄漏,然后系统奔溃。
设置过期时间
SETEX(String key, int seconds, String value) \\字符串独有的方式
EXPIRE key seconds //将key的生存时间设置为ttl秒
PEXPIRE key milliseconds //将key的生成时间设置为ttl毫秒
EXPIREAT key timestamp //将key的过期时间设置为timestamp所代表的的秒数的时间戳
PEXPIREAT key milliseconds-timestamp //将key的过期时间设置为timestamp所代表的的毫秒数的时间戳
返回值
一个整数值1或0,如下:
- 如果成功地为该键设置了超时时间,返回 1
- 如果键不存在或无法设置超时时间,返回 0
TTL
该命令可以查看过期时间还剩下多少。
3种过期策略
定时删除
在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。
- 优点:保证内存被尽快释放。
- 缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key。
惰性删除
key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
- 优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的。
- 缺点:若大量的key在超出超时时间后,再也没有被获取过,那么可能发生内存泄露。
定期删除
每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作。
- 优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理"定时删除"的缺点,定期删除过期key–处理"惰性删除"的缺点。
- 缺点:在内存友好方面,不如"定时删除";在CPU时间友好方面,不如"惰性删除"。
- 难点:合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)。
过期策略小结
- 定时删除和定期删除为主动删除:Redis会定期主动淘汰一批已过去的key。
- 惰性删除为被动删除:用到的时候才会去检验key是不是已过期,过期就删除。
- 定期删除可以通过:
- 第一、配置redis.conf 的hz选项,默认为10 (即1秒执行10次,100ms一次,值越大说明刷新频率越快,最Redis性能损耗也越大)。
- 第二、配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时,就会触发主动清理策略。
Redis使用的过期策略
惰性删除+定期删除
内存淘汰策略
通过设置 maxmemory 限制最大使用内存。超出限制时,根据redis提供的几种内存淘汰机制可以让用户自己决定如何腾出新空间以提供正常的读写服务。
机制 | 说明 |
---|---|
noeviction | 拒绝写操作, 读、删除可以正常使用。默认策略,不建议使用 |
allkeys-lru | 移除最近最少使用的key,最常用的策略 |
allkeys-random | 随机删除某个key,不建议使用 |
volatile-lru | 在设置了过期时间的key中,移除最近最少使用的key,不建议使用 |
volatile-random | 在设置了过期时间的key中,随机删除某个key,不建议使用 |
volatile-ttl | 在设置了过期时间的key中,把最早要过期的key优先删除 |