Redis基础系列(八)——过时键删除策略

这是我参与更文挑战的第26天,活动详情查看:更文挑战数据库

Redis 设置键过时时间的命令

/** * 将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 
复制代码

  以上六种设置键过时的方式,其中 SETEXPSETEX两个命令只适用于字符串对象,其余4个命令适用于全部键类型。虽然有不少不一样的命令能够设置键过时,可是最终其余的命令都会被转为经过 PEXPIREPAT 命令实现。服务器

过时键删除策略

  经过设置键的过时时间,能够判断某个时间点一个键是否过时。对于已过时的键,还须要将其删除,删除的策略有三种:markdown

  • 定时删除:在设置键的过时时间时,建立一个定时器,让定时器在键过时的时候,当即执行对键的删除操做。
    • 优势:对内存最友好,应删尽删
    • 缺点:对CPU不友好,在过时键较多的状况下,定时器会占用太多的CPU资源
  • 惰性删除:听任过时键无论,每次从键空间中获取键时,都检查取得的键是否过时,若是过时则将其删除并返回nil,若是键不过时则返回键。
    • 优势:对CPU友好,只在用到键的时候才判断是否过时
    • 缺点:对内存不友好,若是一个过时键没有再被用到,也就会一直留在内存中
  • 按期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过时键。
    • 对定时删除和按期删除进行整合和折中,同时减轻CPU和内存的消耗
    • 难点:如何肯定删除操做执行的时长和频率,执行得太频繁或者执行时间太长会退化为定时删除,执行得太少则退化为惰性删除

Redis 过时键删除策略

  Redis 中采用惰性删除和按期删除配合的策略,实现合理使用CPU时间和避免浪费内存空间之间取得平衡。函数

Redis 中,对于设置了过时时间的键,每次读写键时都会调用expireNeeded函数判断键是否过时。post

惰性删除策略模式以下:spa

惰性删除策略.png

按期删除策略code

  • 每隔一段时间,Redis会用规定的时间片断,从指定数据库中取出必定数量的键进行检查是否过时
  • 使用 current_db 记录当前的检查的数据库(一个Redis服务器中能够有多个数据库,经过 select 命令指定当前使用的数据库)
  • 当全部数据库都被检查一遍以后,current_db 被设置为0,下一次从0号数据库开始从新检查
相关文章
相关标签/搜索