redis在分布式中,并发修改某个值,怎么保证数据的准确性

在分布式系统中,常见redis 中某个value的值会被修改,如果没有做这个控制,那么可能会导致这个顺序的错乱,比如说,先让A的数据些入进去,再B的数据,如果没有控制,会导致B先写,然后A,最后导致这个结果错误,这个是非常常见的一个问题,那么我们怎么来解决这个问题呢?

借鉴这个CAS乐观锁来解决这个事情,比如在每次写入数据的时候,添加一个时间戳,当你要写入的时候先去读取一下,当前这个key下的value的值的时间戳是否比当前这个缓存里的时间戳更新,如果更新那么就更新下,如果没有缓存里的这个新,那么就不去更新,而是重新获取当前这个值,利用这个cas的锁的方式,控制下

总结下,乐观锁控制方式,通过这个版本号,或者时间戳,OK,不多说,上图:

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式系统,多个节点可能同时尝试修改一个 key 的,这会导致数据的不一致性和冲突。Redis 通过使用乐观锁来解决这个问题。 乐观锁是一种基于版本号的锁机制。当一个节点要修改某个 key 的时,它会先读取该 key 的版本号,然后修改该 key 的,并把版本号加一。如果在这个过程,其他节点也尝试修改该 key 的,它们也会先读取该 key 的版本号,然后尝试修改该 key 的,但是由于版本号已经被修改了,它们的修改请求就会被拒绝。这样就保证了同一时间只有一个节点能够修改该 key 的,避免了数据的冲突和不一致性。 在 Redis ,可以使用 WATCH 和 MULTI 命令来实现乐观锁。WATCH 命令会监视一个或多个 key,如果这些 key 在执行 MULTI 命令之前被修改了,那么 EXEC 命令就会失败。这时候应该重新执行整个事务。 示例代码: ``` WATCH key val = GET key val = val + 1 MULTI SET key val EXEC ``` 在这个代码,我们先使用 WATCH 命令监视 key。然后使用 GET 命令获取 key 的,执行逻辑处理后,再使用 MULTI 命令开启一个事务,将修改后的设置回 key 。如果在这个过程,其他节点修改了 key 的,那么 EXEC 命令就会失败,这时候应该重新执行整个事务。 除了乐观锁外,Redis 还支持悲观锁,可以使用 SETNX 和 GETSET 命令来实现。SETNX 命令可以原子性地设置一个 key 的,只有当该 key 不存在时才会执行设置操作。GETSET 命令可以原子性地获取一个 key 的,并设置一个新的。这两个命令都可以用来实现悲观锁。但是,悲观锁会带来更多的性能开销,因为它需要不断地检查锁是否被占用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值