分布式锁目前比较常用的几种方案:
基于数据库实现分布式锁
基于缓存(redis , memcached)实现分布式锁
基于zookeeper实现分布式锁
比较:三种方案比较
从理解的难易程度角度(从低到高)
数据库 > 缓存 > Zookeeper
从实现的复杂性角度(从低到高)
Zookeeper >= 缓存 > 数据库
从性能角度(从高到低)
缓存 > Zookeeper >= 数据库
从可靠性角度(从高到低)
Zookeeper > 缓存 > 数据库
基于数据库实现分布式锁:
分布式锁是在分布式系统(多个独立运行系统)内的锁,锁作为数据资源存入数据库,当持有这把锁的访问者来决定是否开锁。
一般是通过为数据库表添加一个 “version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。
如何获取锁:
原理很简单,就是插入一个代表资源id的项,因为这个id带有唯一索引,所以只能可能有一个进程写入成功,也就是获取了锁,其它的进程需要等待,但记得设置最大等待时间。操作成功后要释放锁,也就是删除之前的记录。锁也要设置最大锁定时间,避免资源无法释放
使用数据库来实现分布式锁,都是依赖数据库中的一张表,一种是f表中的记录存在情况确定当前是否有锁存在,另外两种是通过数据库的乐观锁和排它锁/悲观锁来实现分布式锁。