Redis设置键的生存时间或者过期时间以及删除过期键的3种策略
1、Redis设置键的生存时间或者过期时间
生存时间:指当前键可以保持多长时间;
过期时间:指当前键什么时候过期,具体的时间戳;
设置过期时间一般用expire,或者pexpire,主要区别:expire单位是秒,而pexpire单位是毫秒。
TTL、PTTL命令,返回当前键距离过期还有多长时间,TTL单位是秒,PTTL单位是毫秒。
Redis有四个不同的命令可以用于设置键的生存时间或过期时间:
- EXPIRE<key><ttl> (单位:秒)
- PEXPIRE<key><ttl> (单位:毫秒)
- EXPIREAT<key><timestamp>(UNIX时间戳)
- PEXPIREAT<key><timestamp>(UNIX时间戳)
其实不管使用EXPIRE、PEXPIRE还是EXPIREAT,最终都是通过PEXPIREAT去设置过期时间,redis专门用过期字典,来保存所有键的过期时间,过期字典保存了对应键的过期时间戳,判断键是否过期,就是当前时间戳跟过期字典里面保存的时间戳进行比较。
2、Redis删除过期键的3种策略
1、定时删除:设置键的过期时间的同时,创建一个定时器,然后在键过期的时候自动触发删除操作。
2、惰性删除:就是在获取键的时候,检查键是否过期,如果过期的话,执行删除操作。
3、定期删除:每隔一段时间,检查数据库中的键是否过期,如果过期的话,执行删除操作。
3、3种策略的优缺点
1、定时删除:有利于内存,可以尽可能的释放和利用,因为在键过期的时候触发删除操作,但是如果同一个时刻过期键非常多,这时候会占用系统CPU很长一段时间,就会影响其它服务的吞吐量以及响应时间,导致大量请求超时;除此之外,创建一个定时器需要用到Redis服务器中的时间事件,因为时间事件底层是通过无序链表实现的,Redis并不能高效的处理大量时间事件,所以通过大量时间事件处理过期键并不合适。
2、惰性删除:跟定时删除切切相反,有利于CPU,不利于Redis内存,因为获取键的时候(所有读写数据库的命令都会触发,比如GET,EXPIRE、TTL、PTTL等),如果键过期了,才会执行删除操作,这样基本不占用CPU,但是如果数据库有很多键无人问津,内存就越来越少,除非清空所有键!!!
3、定期删除:每隔一段时间执行一次删除过期键操作(默认间隔时间:100ms,间隔时间需要根据服务器性能以及相关业务综合评估来设定),并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时解决了过期键占用内存的问题。