1.基于redis实现分布式锁

setnx key val:根据返回值判断加锁是否成功。锁的value值为一个随机生成的UUID,释放锁的时候进行判断。

127.0.0.1:6379> setnx lck 123
(integer) 1
127.0.0.1:6379> setnx lck 123
(integer) 0

expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
del key:删除key

2.基于mysql实现数据库锁

利用select … where … for update 排他锁

注意: 其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。

mysql数据库锁是非可重入的,因为同一个线程在没有释放锁之前无法再次获得锁,因为数据库中已经存在同一份记录了。想要实现可重入锁,可以在数据库中添加一些字段,比如获得锁的主机信息、线程信息等,那么在再次获得锁的时候可以先查询数据,如果当前的主机信息和线程信息等能被查到的话,可以直接把锁分配给它。
C++ 可重入锁: recursive_mutex:同一个线程可以对同一个锁重复加锁,匹配相同次数的解锁才能使线程释放锁,其他线程加锁会形成死锁。

相关