redis-计数器信号量,看这一篇就够了

但各个系统的系统时间并不完全相同时,基本信号量就会出现问题:系统时间较慢的系统,将能够偷走系统时钟快的系统的信号量,导致信号量变得不公平。以下方法,只要系统间时间相差不到1秒,就不会出现信号量被偷或提早过期。

1、为信号量添加一个计数器器和一个有序集合。

2、其中计数器通过持续地执行自增操作,创建出一个类似于计时器的机制,确保最先对计数器执行自增操作的客户端最早获得信号量,将计数器的自增值用作信号量的分值,存放到有序集合中。每个客户端通过在该集合中的排名,来判断是否获得信号量使用权。

3、基本信号量中   System.currentMilstime  的有序集合得以保留,用作信号量过期。

4、通过ZinterStore命令+Weights参数,将信号量的超市时间传递给新的信号量拥有者有序集合中。

5、主要过程:

  1、首先通过从超时有序集合里面移除过期元素的方式来移除超时的信号量

  2、对超时有序集合和信号量拥有者有序集合执行交集计算,并将计算结果保存到信号量拥有者有序集合里,覆盖有序集合原有的 集合数据

  3、对计数器执行自增操作,并将计数器生成的值添加到信号量拥有者有序集合里;与此同时,程序还将当前时间添加到超市有序集合里

  4、程序检查当前客户端添加的标志符在信号量拥有者有序集合中的排名是否靠前,如果是表示客户端成功获取了信号量。否则,移除信号量拥有者有序集合和超时有序集合 中该标识符。

6、尽管如下程序并不要求所有主机都拥有相同的系统时间,但各个主机在系统时间上的差距仍需要控制在一两秒之内,从而避免信号量过早释放或者太晚释放。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值