• Monday
    2019-09-09
    思考题:
    1、redis服务器只支持单进程单线程,但是redis的客户端可以有多个,为了保证一连串动作的原子性,所以要支持事务。
    2、客户端2成功,客户端1失败。这个问题类似于Java并发的CAS的ABA问题。redis应该是除了看ticket的值外,每个key还有一个隐藏的类似于版本的属性。
     1
     7
  • tt
    2019-09-09
    单线程的REDIS也采用事物,我觉得主要是用来监视自己是否可以执行的条件是否得以满足,尤其是这个条件有可能不在REDIS自身的控制范围之内的时候。

    作者回复: 对的,单线程不一定代表要执行的事务的条件都满足,因为其他客户端的命令可能会在WATCH之后修改了KEY的值(如文中例子),导致事务条件不满足,打断事务执行的情况。

    
     5
  • godfish
    2019-10-22
    抢票那个我有个问题是如果ticket大于1的情况,因为watch了key,客户端1岂不是也抢票失败了?实际上不应该失败吧。或者是这里ticket的1不是代表数量代表其中一张票?
     1
     2
  • mickey
    2019-09-09
    客户端2首先返回 OK,客户端1返回 nil 。

    作者回复: 对的,客户端2 即使SET ticket的数值没有变化,也是对ticket进行了“修改”,也就是数据的版本发生了变化,因此和文章中的例子一样,客户端2会返回OK,客户端1是 nil

    
     2
  • steve
    2019-09-09
    是否能用DECR实现呢?

    作者回复: 可以的,使用DECR 可以实现原子性的递减

    
     2
  • 花见笑
    2020-01-07
    推荐使用 Redis 脚本功能 来代替事务 性能高出很多
    
     1
  • Demon.Lee
    2019-09-09
    返回结果跟之前一样,因为客户端1还是因为key变化了执行失败

    作者回复: Good Job

     1
     1
  • ABC
    2019-11-26
    推荐大家在Docker容器里面搭建各种开发环境,方便而且又不用配置特别多东西.以前我是在Windows上直接部署MySQL作为开发环境,后来就换到Docker了,才发现那么方便!~

    作者回复: 嗯 Docker很方便

    
    
  • 扶幽
    2019-10-31
    思考题:
    1,Redis是单线程程序,多个客户端在并发访问的时候要在多个线程间切换来交替执行,所以还是要进行并发控制。
    2,??
    
    
  • 水如天
    2019-09-11
    能分析下JSON类型的存储和查询原理吗
    
    
  • tt
    2019-09-09
    对于第一个问题,我觉得原因在于WATCH+MULTI主要是事物来监视自身执行得以的条件是否满足的

    作者回复: 对的

    
    
  • mickey
    2019-09-09
    上面的抢票时序,Redis是串行化的,不能在T2时刻同时两个客户端都执行Watch吧。

    作者回复: 对 串行化的,所以同一时刻也会进行串行化的处理,比如顺序为:客户端1 watch -> 客户端2 watch,或者是 客户端2 watch -> 客户端1watch,都有可能。

    
    
我们在线,来聊聊吧