跳至主要內容
Redis-实践篇-Redis实现分布式锁

学习核心

  • Redis 实现分布式锁实践

学习资料

实践版本说明

  • Redis 5.0.14.1
  • Springboot 2.7.6

基于Redis实现分布式锁(JAVA版本)

​ Redis 实现分布式锁核心思路:通过set指令配置相关参数构建分布式锁的特性:SET key value [EX seconds] [PX milliseconds] [NX|XX]


holic-x...大约 18 分钟RedisRedis
Redis-应用篇-③分布式锁

学习核心

  • 分布式锁核心概念(分布式锁场景应用、分布式锁特性、基于分布式锁特性的分布式锁设计方案扩展和优化)

  • 如何用redis实现分布式锁?

    • setnx =》确保互斥性(最简单的版本,但存在安全性问题:如果持有锁的客户端在执行过程中出现异常导致锁无法正确释放,就会造成死锁问题)

    • 引入过期机制 =》确保安全性

      • 方案1:setnx + expire

        • 存在问题:无法确保两个指令操作的原子性,仍可能出现死锁问题
      • 方案2:SET lock_key lock_value NX PX 10000

        • 存在问题:由于业务执行时间过长,可能导致锁的误释放操作,进而破坏了锁的互斥性(A先获取锁执行业务流程,但执行过程中锁过期,此时B恰好获取到锁并执行业务流程,如果A执行完成后释放锁就会不小心把B的锁给释放掉,进而导致并发问题,导致分布式锁失效)
    • 设置owner =》 确保对称性(谁申请谁释放原则)

      • 实现方案:SET lock_key lock_unique_value NX PX 10000在释放锁之前校验锁的归属者,如果归属于其他客户端则不做释放操作
      • 存在问题:get lock 校验 和 del lock 操作是非原子操作,存在时间差攻击,可能出现校验的时候锁还是自己的,删除的时候却是其他客户端的。需通过Redis + Lua脚本确保操作的原子性
    • 可靠性实现 =》确保可靠性,基于对单机部署可能出现的单点故障问题的解决方案

      • 方案1:主从容灾(主从架构、哨兵模式)

        • 存在问题:可能存在“从节点出现部分数据损失”、“分布式锁失效”、“出现短暂多机获取执行权限的情况”
          • “从节点出现部分数据损失”:由于数据同步操作过程是一个异步过程,当主节点更新完成还未同步到从节点的过程中主节点宕机,则导致从节点出现部分数据损失的情况
          • “分布式锁失效”:由于数据同步延时+主备切换导致,当A从主节点获取到锁但数据还未同步到从节点时主节点宕机,由于主备切换,未更新锁信息的从节点一旦上位成功称为新的主节点,当B从新主节点获取锁的时候就会获取成功,进而破坏了分布式锁的互斥性,导致分布式锁失效
          • “出现短暂多机获取执行权限的情况”:由于上述问题,导致分布式锁失效,就会出现多个机器都获取到执行权限的问题
      • 方案2:多机部署

  • redis分布式锁单点故障、可重入

  • 除了redis还有哪些分布式锁方案(mysql、zk)


holic-x...大约 26 分钟RedisRedis
Redis-高可用篇-①主从复制

学习核心

  • 理解主从复制的目的和实现

学习资料

主从复制

1.主从复制模式

主从复制的引入是为了避免传统单机部署模式下服务器出现单点故障问题,这个模式可以保证多台服务器的数据一致性,且主从服务器之间采用的是【读写分离】的方式。主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令


holic-x...大约 21 分钟RedisRedis