redis作为分布式锁

对于分布式程序而言,当多个主机中的程序需要操作同一个变量时,由于程序是分布在不同的主机之上,不在同一个jvm中,不能使用原有的锁来进行同步,这个时候就用到了分布式锁来同步。常见的分布式锁可以有三种方法来进行实现:

  • 1.数据库实现分布式锁
  • 2.实现分布式锁
  • 3.zookeeper来实现分布式锁

1.数据库实现分布式锁

  最简单的就是直接创建一张所锁表,通过操作该表中的数据来实现,当程序需要获得锁的时候就写入一条数据,想要释放锁的时候就删除这条数据。
  这种锁实现很简单但是存在一些缺点:

  • 1.这种锁没有失效时间,一旦释放锁的操作失败就会导致锁记录一直存在于锁表中,其他显示线程就无法获得这个锁,但是也可以设置定期的去清除数据来解决;
  • 2.这种实现依赖于数据库,可靠性不佳,数据库一般是单点,一旦出问题,影响大
  • 3.这种锁是非可重入的,因为同一个线程在没有释放锁资源的之前无法重新获取锁,因为在数据库中已经有一份记录了,想要实现可重入可以在多设计一些字段,比如获得主机信息,线程信息等,那么在再次获得锁的时候,可以先查询数据,如果当前的表可以查询到当前的主机或者线程的记录时,则直接将锁分配给它们。

redis作为分布式锁的8种问题,https://mp.weixin.qq.com/s/nSvBaNBYTZ_0Fk-9xkOLQg

2.Redis 作为分布式锁

  • 1.获取锁的时候用setnx存储对应的key到redis中,并使用expire设置过期时间,成功获取锁的时候会返回1,否则返回0
  • 2.在释放锁的时候,可以和key中的value进行比较,看是否是当前主机或者进程创建的锁,校验之后使用del对锁进行释放。

实例demo: