Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.
redis 数据库键的过期时间都保存在过期字典中,过期字典的键是一个指针,指向键空间下的一个对象(也就是某个数据库键),过期字典的值是一个 long long 类型的整数,这个整数保存了数据库键的过期时间,一个毫秒精确度的 UNIX 时间戳。
过期键的判定
如果一个键过期了,redis 什么时候删除它呢?
在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即对键进行删除
定时删除策略对内存是最友好的,通过定时器可以保证过期的键尽快的被删除,释放内存
对 CPU 是最不友好的,在过期键比较多的情况下,删除过期键这一行为会占用非常多的 CPU。会对服务器的响应时间和吞吐量造成影响。
每次从数据库中获取键时判断它是不是过期了,如果是过期的就删掉该键。
对 CPU 时间来说是最友好的,
对内存是最不友好的,如果一个键已经过期,一直没有访问的话那么这个键一直不会被删掉,其对应的内存一直不会被释放。某种程度上可以说是内存泄露。
每隔一段时间,程序就对数据库进行一次检查,删除过期的键。
定期删除策略是前面两种策略的一种整合和折中。
定期删除策略每隔一段时间执行一次删除过期键的操作,并通过限制操作的时长和频率来减少操作对 CPU 带来的影响
有效的减少了内存的浪费。
定期删除策略的难点是确定删除操作的时长的频率
在执行 SAVE 或者 BGSAVE 命令创建一个新的 RDB 文件时,程序会对数据库中的键进行检查,已过期的键不会保存到 RDB 文件中。
在启动 Redis 时,如果启用了 RDB 功能,那么服务器将对 RDB 文件进行载入:
如果一个键在 AOF 中已经存在,当它过期时会往 AOF 文件中追加一条删除命令来记录该键已被删除
在执行 AOF 重写的过程中,程序会对数据库键进行检查,已经删除的键不会出现在重写后的文件中。
从服务器的删除操作由主服务器控制
当键在主服务器上被删除时,主服务器会显示的发一条 DEL 指令到从服务器,告知从服务器删除这个过期键

Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.