• Randy
    2018-04-19
    现实生活中也有不需要更新某个数据的场景,只是为了同步或是互斥一下不同机器上的线程,这时候像 Redis 这样的分布式锁服务就有意义了
    这句没明白,如果要进行互斥或同步操作,那就是要对同一个资源进行写操作,如果只是读操作那就不需要锁保护了,那分布式锁的意义是什么?
     1
     18
  • 林子
    2018-07-09
    如果用cas方式或者叫乐观锁来修改数据库中表(共享资源),会出现脏读问题,耗子叔,这点没提到。
    
     7
  • yun
    2019-06-19
    对资源修改,用cas而不是分布式锁,我反对
    1:前提是共享资源的修改得提供cas,比如我要更新hdfs,然后再在hbase上更新meta,为了保证一致性,要用分布式锁
    2,资源一存储在hbase,支持cas,资源二redis上,二者都支持cas,服务更新数据时要更新二者,服务是多个进城并发干,为了保证一致性,得有分布式锁,单个数据库的cas不行

    cas和分布式锁是两个完全不同的东西,cas像是单机的乐观锁,能用cas的话,不用分布式式锁,那不废话吗?能单机干的,谁会上分布式
    你跨多个服务,搞一个cas,试试?

    文中的令牌和cas,他们间确实类似。但是分布式锁中带令牌,就是为了解决,客户端认为占有锁,到实际锁过期的问题,此时没必要对比cas

    展开
     2
     6
  • 天天向上
    2018-05-08
    分布式锁 应该是 先获取锁 再进行业务操作 属于悲观锁 而用乐观锁代替 又演变为cas代替 这样合适吗? 其实悲观和乐观 核心是面对的并发度不一样,如果在大并发下用乐观锁 应该失败的几率会增大,用悲观锁避免大量失败,但是会block!麻烦耗子哥 指导指导

    作者回复: 一切都是trade-off。不过实际情况下,乐观加上重试机制会好一些。

    
     6
  • 约书亚
    2018-04-19
    皓哥,这篇文章前半段一直到cas之前基本是在说redlock,后面说到fence和cas,恰恰是redlock争论当中反方的观点---如果你想锁的资源,能提供给你cas功能,那还要分布式锁干嘛?这也是我的疑问,我觉得是悖论
    在我使用consul时,我发现,如果我要锁住一个资源,理论上100%安全的必要条件是,我的资源就是那个锁本身,在consul就是那个资源只能是锁住key对应的value。consul本身也提供cas,但对客户端来说,没加锁的代码容易写
    但换成其他资源,这个悖论就显现出来了。我的想法对么?

    作者回复: 这篇文章其实我是在不断地变换思路解决问题,不能说Redlock没用,其至少可以同步不同的client。而你的理解是对的,如果是有共享资源,最好是在那个资源上提供无锁实现。

    
     4
  • 华烬
    2018-04-19
    数据库用timestamp的判断是否冲突是有风险的吧
    
     3
  • ZhYB
    2019-06-26
    redis锁timeout确实是个问题,配合存储的版本控制一起做能解决数据准确问题。但是说存储上cas可以代替分布式锁,就不对了。分布式锁锁住的是计算过程和更新存储两件事,而cas只能管更新存储这一件事,也就是二者就不是一个级别的东西。再说锁住计算过程这件事在正常情况下是没有问题的,而当出现极端异常下的超时问题时,出现了同时计算,出现了冗余计算,这完全可以接受。
    
     2
  • 董泽润
    2018-06-21
    https://github.com/dongzerun/dlock
    这是我在用的,redis lua 实现,和耗子叔的相似
    
     2
  • 王磊
    2018-06-08
    皓哥,有个问题想确认下,redlock是要求各个节点独立部署,都是master,那么这样的部署方式是否就限定这N台Redis不能同时作为缓存服务器了?
     1
     2
  • 山分子
    2019-04-18
    用过redis和etcd的分布式锁,用分布式锁的场景有两个,一个是定时任务,一个是阻止客户端的重复提交。
    
     1
  • 小新是也
    2018-11-18
    锁还是感觉zk专业一点
    
     1
  • 流迷的咸菜
    2018-04-19
    文中说的RedLock应该是单节点的lock的实现吧?分布式的应该如下吧?
    1. It gets the current time in milliseconds.
    2. It tries to acquire the lock in all the N instances sequentially, using the same key name and random value in all the instances. During step 2, when setting the lock in each instance, the client uses a timeout which is small compared to the total lock auto-release time in order to acquire it. For example if the auto-release time is 10 seconds, the timeout could be in the ~ 5-50 milliseconds range. This prevents the client from remaining blocked for a long time trying to talk with a Redis node which is down: if an instance is not available, we should try to talk with the next instance ASAP.
    3. The client computes how much time elapsed in order to acquire the lock, by subtracting from the current time the timestamp obtained in step 1. If and only if the client was able to acquire the lock in the majority of the instances (at least 3), and the total time elapsed to acquire the lock is less than lock validity time, the lock is considered to be acquired.
    4. If the lock was acquired, its validity time is considered to be the initial validity time minus the time elapsed, as computed in step 3.
    5. If the client failed to acquire the lock for some reason (either it was not able to lock N/2+1 instances or the validity time is negative), it will try to unlock all the instances (even the instances it believed it was not able to lock).
    展开
    
     1
  • 番茄炒西红柿
    2020-01-09
    问一下采用伴生线程来续锁的行为是否可取。
    
    
  • 文刂 氵共 超
    2019-12-26
    坚持学习,学习笔记 https://mubu.com/colla/7x-yIQlfyLM
    
    
  • junshuaizhang
    2019-12-09
    有两个问题
    1.ABA问题文中没有介绍咋处理。
    2.对于用库存当version虽然解决了并发问题,但是对实际性能影响太大。
    
    
  • 万丈尘
    2019-09-09
    同时更新同一条数据真的合理吗,使用不使用cas都不会出错,因为数据库原子性,相反这种情况需要考虑的是执行顺序而不是抢占一个锁
    
    
  • 布小丫学编程
    2019-08-31
    支付回调返回就是使用的分布式锁来实现的,容许有一些错误的出现,但是实现起来会更简单一些。
    Redis分布式锁是可以实现大粒度的锁,不需要考虑每一个点的更新插入都满足幂等性,实现起来更加简单快捷。小并发量时使用会更快捷。
    数据库乐观锁只有在数据库操作时满足幂等性,但是其他redis、mongodb等的都是不可回滚的,所以这些场景下必须使用Redis分布式锁。可能更适合大并发量访问时候的。
    
    
  • edisonhuang
    2019-07-15
    当我们需要对资源做互斥访问时,分布式服务也像单机服务一般,需要对资源加锁。分布式锁需要保证安全性,避免死锁和容错性
    
    
  • 又双叒叕是一年啊
    2019-06-25
    发现了一篇 好文 https://juejin.im/post/5bbb0d8df265da0abd3533a5#heading-23
    
    
  • 靠人品去赢
    2019-04-15
    分布式锁有点像并发编程
    
    
我们在线,来聊聊吧