Redis过期问题探究

过期精度

Redis2.4及以前的版本,过期时间有0-1秒的误差

Redis2.6起,过期时间误差缩小到0-1毫秒

过期和持久

Keys的过期时间使用Unix时间戳存储(从Redis2.6开始以毫秒为单位)。这意味着即使Redis实例不可用,时间也是一直在流逝的,因此要处理好过期的工作,计算及必须采用稳定的时间,如果你将RDB文件在两台时钟不同步的电脑间同步,所有的keys装载时就会过期

正在运行的实例也会检查计算机的时钟,如设置了一个key的有效期是1000秒,然后设置你的计算机时间为未来2000秒,这是key会立即失效,而不是等待1000秒之后

Redis如何淘汰过期的keys

被动、主动

被动:当客户端尝试访问它时,key会被发现并主动的过期

主动:有些过期的keys,永远不会访问他们。所以定时随机测试设置keys的过期时间。

           具体就是Redis每秒10次做的事情

           1:测试随机的20个keys进行相关过期检测

           2:删除所以已经过期的keys

           3:如果有多于25%的keys过期,重复步骤1

平凡的概率算法,基本上的假设是,样本是密钥空间,并且不端重复过期检测,直到过期的kyes的的百分比低于25%,意味着在任何给定的时刻,最多会清楚1/4的过期keys

在复制AOF时如何处理过期

当一个key过期,DEL将会随着AOF文字一起合成到所有附加的slaves,在master实例中,这种方法是集中的,并且不存在一致性错误的机会。当slaves连接到master时,不会独立过期keys(会等到master执行DEL命令),它们仍然会在数据集里面存在,所有当slave当选为master时淘汰keys会独立执行,然后成为master

redis线程模型及单线程为什么快

1:IO模型使用了多路复用器,在linux系统中使用的是EPOLL

      类似netty的BOSS,WORKER使用一个EventLoopGroup(threads=1)

2:单线程的Reactor模型,每次循环取socket中的命令然后逐一操作,可以保证socket中的指令是按顺序的,不保证不同的socket也就客户端的命令的顺序性

3:命令操作在单线程中顺序操作,没有多线程的困扰不需要锁的复杂度,在操作数据上相对是原子性

架构设计模型

1:自身的内存存储数据,读写操作不涉及磁盘IO

2:redis提供了value具备类型为每种类型实现了一些操作命令

      实现了计算向数据移动,而非数据向计算移动,这样在IO的成本上有一定的优势且在数据结构类型上,丰富了一些统计类属性,读写操作中,写操作会O(1)负载度更新length类属性,使得读操作也是O(1)的

redis事务

MULTI、EXEC、DISCARD、和WATCH是Redis事务相关的命令。事务可以一次执行多个命令,并且有一下两个保证:

        1:事务是一个单独的隔离操作:事务中的所有命令都会序列化,按顺序地执行。事务在执行的过程中,不会被其它客户端发送来的命令请求所打断

        2:事务是一个原子操作:事务中的命令要么全部执行,要么全部不执行

EXEC命令负责触发并执行事务中的所有命令

        1:如果客户端在使用MULTI开启了一个事务之后,却因为断线没有成功执行EXEC,那么事务中的所有命令都不会被执行

         2:如果客户端成功在开启事务之后执行EXEC,那么事务中的所有命令都会被执行

Redis事务不支持回滚

         1:从实用性的角度说,失败的命令是由编程错误造成的

         2:因不需要对回滚支持,所以Redis内部可以保持简单快速

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值