一、Redis设置过期时间
1)设置过期时间的几种常见的命令
A、 EXPIRE key seconds -- 设置redis 键key的过期时间为seconds秒
B、 PEXPIRE key milliseconds -- 设置redis 键key的过期时间为millisecond豪秒
C、 EXPIREAT key timestamp --设置redis键key的过期时间为timestamp时间戳对应的时间秒
D、 PEXPIREAT key milliseconds-timestamp -设置redis键key的过期时间为milliseconds-timestamp时间戳对应的时间豪秒
2)字符串独有的设置过期时间的命令
setex key second value
3)清除redis过期时间
PERSIST key
)4获取redis建的过期时间
TTL key -- 返回键key的过期时间(单位秒)
PTTL key -- 返回键key的过期时间(单位毫秒)
二、三种过期策略
定时过期
含义:在设置key的过期时间的同时,为key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。
优缺点:及时清除过期的key,节约内存空间。但是对CPU消耗高。若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key
定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重
惰性过期
含义:在访问某个key的时候,先判断key是否过期,如果过期了则删除key,返回null。
优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)
定期过期
含义:每隔一段时间,从设置了过期时间的键中,随机扫描一点数量的key,清除已经过期了的key。
优点: 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点定期删除过期key--处理"惰性删除"的缺点
缺点: 在内存友好方面,不如"定时删除".在CPU时间友好方面,不如"惰性删除"
难点: 合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)
定时删除和和定期删除为主动删除。惰性删除为被动删除。用到的时候才会检查key是否过期,过期就删除返回null。
惰性删除为redis服务器内置策略
定期删除可以通过:
第一、配置redis.conf 的hz选项,默认为10 (即1秒执行10次,100ms一次,值越大说明刷新频率越快,最Redis性能损耗也越大 官方值1 and 500建议设置不能超过100,否则非常消耗CPU)
第二、配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时,就会触发主动清理策略【触发内存淘汰机制】
1、memcached只是用了惰性删除,而Redis同时使用了惰性删除与定期删除,这也是二者的一个不同点(可以看做是redis优于memcached的一点)
三、Redis过期策略。
定期过期通过redis.conf 文件 hz 参数配置,默认情况10 即1秒钟10次,100ms一次。官方给出的参考值是1-500,值越大清理过期key的频率越高,但是对CPU消耗越高。原话是当参数值为100时,对CPU消耗特别高。
四、Redis 内存淘汰机制
当redis内存空间达到参数maxmemory配置的值时,当新写入key时,触发内存淘汰机制。内存淘汰策略通过maxmemory-policy 参数配置;有以下几种:
noeviction:当内存空中不足以容纳新写入数据时,redis报错,无法写入数据。
allkeys-random:当内存空间不足以容纳新写入数据时,redis随机清除某个key。
allkeys-lru:当内存空间不足以容纳新写入数据时,redis会移除最近最少使用的key (less recently used)。
volatile-random:当内存空间不足以容纳新写入数据时,redis会从设置了过期时间的key中,随机移除某个key。
volatile-lru:当内存空间不足以容纳新写入数据时,redis会从设置了过期时间的key中,移除最近最少使用的key。
volatile-ttl:当内存空间不足以容纳新写入数据时,reids会从设置了过期时间的key中优先移除有更早过期时间的key。
近似LRU算法, maxmemory-samples 5 默认值5 ,官方给出建议如果10将非常接近LRU算法,但是对CPU消耗高。