Key 过期删除
2021-11-12 16:16:54 8 举报
AI智能生成
Redis Key 过期删除
作者其他创作
大纲/内容
命令
设置过期时间
EXPIRE key seconds
为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
PEXPIRE
以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。
EXPIREAT key timestamp
EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
PEXPIREAT
以毫秒为单位设置 key 的过期 unix 时间戳,而不是像 EXPIREAT 那样,以秒为单位。
查看剩余时间
TTL
PTTL
移除过期时间
PERSIST key
移除给定 key 的生存时间
当生存时间被移除后,就会从 redisDb 的过期数据结构中剔除
持久化
RDB
生成 RDB
在执行 SAVE 和 BGSAVE 的时候,是不会包含已过期的键的
载入 RDB
如果是以主服务器来执行,会对文件中的键值进行检查,如果已经过期的话,是不会被读取进去,会自动排除掉已经过期的键值
如果是以从服务器来执行,会将文件中的所有的键值对都加载到数据库中,通过后期的数据同步将过期 key 从库中移除掉
AOF
文件写入
如果一个过期键还没有被惰性删除或定期删除,那么在 AOF 文件中是不存在的,是不会对 AOF 文件产生影响的
如果一个过期键被访问,触发了删除逻辑,会在 AOF 文件中显示的追加一条 DEL 语句
文件重写
和生成 RDB 文件一致,是会对键进行检查,如果过期的话,就会直接忽略
主从复制
主服务器在删除一个过期键之后,会显示地向所有从服务器发送一个 DEL 命令,告知从服务器删除这个过期键
从服务器在执行客户端的读命令的时候,是不会对过期键执行任何处理的,只有接收到主服务器的 DEL 命令之后,才会进行删除
通过主服务器来控制从服务器统一的删除过期键,可以保证主从服务器数据的一致性
过期时间保存
redisDb 结构有一个 expires 属性,保存了数据库中所有键的过期时间
过期字典的键是一个指针,指向键空间中的某个键对象
过期字典的值是一个 long long 类型的整数,保存了键所指向的数据库键的过期时间
类型
定时删除
通过定时器,在键过期的时候,将键删除
缺点:对 CPU 时间片不友好,如果过期键比较多的话,会长时间占用 CPU 执行时间,影响其余程序执行
惰性删除
在获取这个键值的时候,判断是否过期,如果过期的话,将其删除
缺点:如果这个键一直没有被访问的话,会占用内存空间,可能会导致内存泄漏等问题
定期删除
每隔一段时间对有有效期的 key 值进行检查,至于要检查多少库和删除多少 key 由相关算法决定
是对前两钟删除策略的一个中和,通过检查部分库,减少了对 CPU 时间片的占用,通过定时删除 key 减少了惰性删除对内存占用的问题
Redis 策略
惰性删除
所有读写数据库的命令在执行前都会调用 expireIfNeeded 函数进行检查
如果键已经过期,函数会将数据键从数据库中删除,如果没有过期,函数不做动作
定期删除
会通过 redis 的周期函数调用 activeExpireCycle 函数
在规定时间内,分多次遍历服务器中的各个数据库,从数据库的 expires 字典中随机检查一部分键的过期时间,并删除其中的过期键
在函数执行的时候,会有一个全局变量 current_db,用来记录当前的检查进度,在下一次函数执行的时候继续,当全部的库都检查完毕之后,这个变量会被重置为0,然后再开启下一轮
复制
在运行在主从模式的时候,键的删除操作是由主节点控制的
客户端只有访问主节点,主节点判断过期之后,会显示的发送 DEL 命令给全部的从节点,通知从节点删除
客户端访问从节点的时候,如果这个键过期了,但由于没有收到主节点的删除通知,此时还是会正常访问这个过期键
0 条评论
下一页