1. 数据库乐观锁(使用SQL语句);
3. 基於ZooKeeper的分布式锁(并发量很高)
基于Redis的分布式锁流程详解:
悲观锁 C1获取锁,并崩溃C2和C3调用SETNX上锁返回0后,调用GET命令获得foo.lock的时间戳T1通过比對时间戳,发现锁超时
如果T1=T2,说明C4获得时间戳
如果T1!=T2,说明C4之前有另外一个客户端C5通过调用GETSET方式获取了时间戳C4未获得锁。只能sleep下进叺下次循环中(由于进程/线程之间时间戳差距很小,不影响正常的逻辑)
注:设置key时,也可以设置超时时间来解决超时bug
乐观锁-使用事務(级别是读提交)
2.exec,提交事务执行从multi到此命令前的命令队列,置客户端为非事务态
3.discard,取消事务置客户端为非事务态。
4.watch监视键值對,作用时如果事务提交exec时发现监视的监视对发生变化事务将被取消。
说明:redis的事务级别是读提交其它的操作也会对事务结果有影响。所以事务只是用来保证原子性
要实现乐观锁,只能使用watch机制watch使用说明如下:
1. 乐观锁的实现,必须基于WATCH然后利用redis的事务。
2. WATCH生命周期只是和事务关联的,一个事务执行完毕相应的watch的生命周期即结束。