本篇整理Redis中数据库与过期处理的相关内容。

数据库

在Redis中也是有数据库的概念的,只不过不像mysql那样是显示管理的,而是使用一个数字来表示,默认是0数据库。默认情况下redis会创建16个数据库,可以通过 select 1 命令切换数据库。

Redis本身是一个键值对系统,只不过值可以是前面提过的五种不同类型,因此不同的数据库就代表不同的键的空间。

redis的ttl什么时候会变_缓存

实现上,每个数据库都会包含一个redisDb对象,这个对象内部有一个dict,也就是上面说的键值对。因此客户端在使用不同的数据库时,实际上在使用不同db对象下的dict。

redis的ttl什么时候会变_缓存_02

生存时间与过期

Redis可以通过EXPIRE或者PEXPIRE来设置某个key的生存时间,即Time to Live, TTL。其中EXPIRE设置的是过期的秒数,PEXPIRE设置的是过期的UNIX时间戳。最终他们的底层都是基于UNIX时间戳来实现。

redis的ttl什么时候会变_Redis_03

在实现上,redisDb对象内部会使用dict来维护键值对内容,使用expires来维护key与过期时间的关系。这样可以通过扫描expires快速知道哪些key是过期的。

如果想移除某个Key的过期配置,可以通过PERSIST命令移除expires中的过期时间配置。使用TTL命令或者PTTL可以查看剩余的生存时间。

配置好过期时间,如果某个key过期了该怎么处理呢?Redis提供了三种删除策略:

1 定时删除,在设置key的过期时间时,创建定时器,定时器会在过期时触发,立即删除该key。优点是删除及时;缺点是会额外消耗CPU,在系统访问性能瓶颈时,增加系统压力。

2 惰性删除,即在访问到这个key时,判断是否过期,如果过期就立刻删除。优点是不会消耗过多的资源;缺点是如果这个key一直不被访问,那么就永远不会被删除掉。

3 定期删除,每隔一段时间,系统自动检查,删除一定数量的过期键。优点是即不会过多消耗CPU资源,又避免资源释放不掉;不过需要用户具有一定的经验,才能配置好这个定期规则,从而达到移除与性能之间的平衡。

数据备份时对过期键的处理

在生成RDB文件时,会忽略过期的键。主服务器加载RDB时,也会忽略;从服务器加载时会直接加载。

AOF持久化时,忽略过期的影响。当被删除时,追加DEL命令。在AOF重写时,会忽略过期的键。

复制模式下,从节点会忽略过期,完全由主节点控制。主节点删除过期键时,会向各个从服务器发送DEL命令。

参考

《Redis设计与实现》