Redis设置key过期以及删除过期key的策略
Redis有以下几个命令用于设置key的过期时间:
expire <key> <seconds>:给key设置以秒为单位的过期时间
pexpire <key> <milliseconds>:给key设置以毫秒为单位的过期时间
expireat <key> <timestamp_in_seconds>:指定一个以秒为单位的时间戳,当到达此时间时,key过期
pexpireat <key> <timestamp_in_milliseconds>:指定一个以毫秒为单位的时间戳,当到达此时间时,key过期
setex <key> <seconds> <value> : 设置key的同时,给key添加过期时间,单位为秒
查看过期时间的命令:
ttl <key> : 查看Key的过期时间(秒数),用不过期返回(integer) -1,Key不存在返回(integer) -2
pttl <key>:同ttl,返回毫秒数
示例:
127.0.0.1:6379> set a test
OK
127.0.0.1:6379> EXPIRE a 5
(integer) 1
127.0.0.1:6379 > get a // distance setup lifetime command executed in 5 seconds
"test"
127.0.0.1:6379 > get a // distance setup lifetime command executed after 5 seconds
(nil)
127.0.0.1:6379> set b 12
OK
127.0.0.1:6379> EXPIREAT b 1545569500
(integer) 1
127.0.0.1:6379> time
1) "1545569486"
2) "108616"
127.0.0.1:6379> get b//distance setting 1545569500 specified seconds timestamp execution
"12"
127.0.0.1:6379> time
1) "1545569506"
2) "208567"
127.0.0.1:6379 > get B // distance setting 1545569500 specified seconds timestamp to execute
(nil)
取消key的过期时间的设置
persist < key >:用于取消对key设置的过期时间
127.0.0.1:6379> EXPIRE c 1000
(integer) 1
127.0.0.1:6379 > TTL C // expiration time
(integer) 9996
127.0.0.1:6379> PERSIST c
(integer) 1
127.0.0.1:6379 > TTL C // no expiration time
(integer) -1
PS: TTL is the unit of seconds, the remaining survival time of the return key; similarly, the pttl command is the unit of milliseconds, the remaining survival time of the return key
删除过期key的策略
1、定时删除
在设置key的到期时间时,创建一个定时器,当key到期时立即删除key。
优点:
定时删除的这种方式是对内存最友好的,当key到期就马上释放key占用的内存。
缺点
对CPU不友好,特别是存在很多过期的key时,删除一个过期的key需要占用相当大的cpu时间。所以在内存不紧张,而CPU紧张的场景下,不宜使用此策略。
2、懒删除
懒删除的方式是不会在key过期时马上删除key,它会在每次向键空间读写时,检查键是否过期,如果过期了才真正删除它,否则返回key的值。
优点:
对CPU友好,只有操作时检查键是否过期,而不是定时的浪费CPU时间去检查。
缺点:
对内存不友好,这是很明显的,如果有大量过期的key,在一定时间内没有操作,那么它就会常驻在内存里,如果一直不操作,就相当于内存泄漏了。
3、按规则删除
考虑到上面两种删除策略的优缺点,redis结合了这两种策略来对key进行删除:懒删除和定时删除,已达到CPU和内存使用的平衡。
在redis server,懒删除是内置的策略,可以对定时删除设置执行时间和频率。有两种方式对定时删除设置:
1、配置redis.conf的hz选项,默认是10,也就是说每秒执行10次,数值越大,执行定时删除的频率越大,redis的cpu损耗也越大。
hz 10
2、配置redis.conf的最大内存,当内存的使用超出了最大内存,就会触发一个清除策略
maxmemory <bytes>
设置内存主动清除策略:
maxmemory-policy noeviction
内存清除策略:
- volatile-lru 只删除设置了过期时间的Key,使用频率越少的Key优先删除,不会对没有设置过期时间的Key删除
- volatile-ttl 和上面一样,只删除设置过期时间的Key,TTL过期时间越少优先删除
- volatile-random 随机删除快要过期的Key
- allkeys-lru 和lru一样,删除所有的Key,没有设置过期时间的Key也会被删除
- allkeys-random 和上面一样,删除掉随机的Key