Redis系列:数据库与TTL过期处理

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

数据库

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

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

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

生存时间与过期

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

在实现上,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设计与实现》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值