分布式锁及相关

分布式锁的概念 => 是控制分布式系统之间同步访问共享资源的一种方式

使用场景 => 在分布式系统中,常常需要协调他们的动作,如果不同的系统或是同一个系统能够的不同主机之间共享了一个或 一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁

保证可用性 =>

  • 互斥性,在任意时刻,只有一个客户端能够持有该锁
  • 不会死锁(死锁 => 当两个以上的请求方,双方都在等待对方释放锁,以获取系统资源,但没有一方提前退出时,就成为死锁 两个人过独木桥)
  • 容错性 有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其它客户端能使用该锁

基于REDIS的分布式锁

Redission 简介

Redis客户端在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实现工具包中常用接口的基础上,未使用这提供了一系列具有分布式特性的常用工具类

支持Redis 单实例 哨兵 Cluster master-slave 等各种部署架构

1. redis使用lua脚本的 好处
  1. 原子性 Lua脚本是做为一个整体执行的,所以中间不会被其它命令插入
  2. 减少网络开销 可以把多条命令一次性打包
2. 基本思路
  1. 锁ID作为redis的key value为hash结构 hash的filed为获得锁的客户端ID value为加锁次数
  2. 成功新建写入锁的Key对应的Hash的客户端占用锁
  3. 代码待补充
  4. 客户端不断循环重试执行Lua脚本,知道获得锁
  5. 锁互斥机制 Lua脚本保证并发情况下加锁的原子性,中间不会被其他命令插入
3. 可重入锁机制

如果以获取客户端线程再次获取锁,该客户端线程的锁的次数+1

4. 释放锁机制

该客户端的锁的次数-1
如果发现加锁次数是0了,说明这个客户端已经不在持有锁了