这是我参与更文挑战的第26天,活动详情查看:更文挑战数据库
/** * 将key 的值设置为 value,并将 key 的过时时间设为 seconds (以秒为单位)。 * 只适用于String对象 */
SETEX key seconds value
/** * 这个命令和 SETEX 命令类似,但它以毫秒为单位设置 key 的生存时间, * 而不是像 SETEX 命令那样,以秒为单位。 * 只适用于String对象 */
PSETEX key milliseconds value
//将键 key 的生存时间设置为 seconds 秒
EXPIRE key seconds
//将键 key 的生存时间设置为 milliseconds 毫秒
PEXPIRE key milliseconds
//将键 key 的过时时间设定为 timestemp 指定的秒数时间戳
EXPIREAT key timestemp
//将键 key 的过时时间设定为 milliseconds-timestemp 指定的秒数时间戳
PEXPIREPAT key milliseconds-timestemp
复制代码
以上六种设置键过时的方式,其中 SETEX
和 PSETEX
两个命令只适用于字符串对象,其余4个命令适用于全部键类型。虽然有不少不一样的命令能够设置键过时,可是最终其余的命令都会被转为经过 PEXPIREPAT
命令实现。服务器
经过设置键的过时时间,能够判断某个时间点一个键是否过时。对于已过时的键,还须要将其删除,删除的策略有三种:markdown
nil
,若是键不过时则返回键。
Redis 中采用惰性删除和按期删除配合的策略,实现合理使用CPU时间和避免浪费内存空间之间取得平衡。函数
Redis 中,对于设置了过时时间的键,每次读写键时都会调用
expireNeeded
函数判断键是否过时。post惰性删除策略模式以下:spa
按期删除策略code
- 每隔一段时间,Redis会用规定的时间片断,从指定数据库中取出必定数量的键进行检查是否过时
- 使用
current_db
记录当前的检查的数据库(一个Redis服务器中能够有多个数据库,经过select
命令指定当前使用的数据库)- 当全部数据库都被检查一遍以后,
current_db
被设置为0,下一次从0号数据库开始从新检查