大厂面试官问我:Redis的分布式锁怎么解决死锁问题?【后端八股文十:Redis分布式锁八股文合集(2)】

 本文为【Redis分布式锁八股文合集(2)】初版,后续还会进行优化更新,欢迎大家关注交流~

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
19d95742d45b4220ad0ae0359ffcba93.png

💥个人主页绝命Coding-CSDN博客
💥 所属专栏后端技术分享
这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖

    往期内容:

大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】-CSDN博客

大厂面试官问我:Redis持久化RDB有没有可能阻塞?阻塞点在哪里?【后端八股文三:Redis持久化八股文合集】-CSDN博客

大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】-CSDN博客

上篇文章:

大厂面试官问我:Redis的分布式锁,锁失效了该怎么办?【后端八股文十:Redis分布式锁八股文合集(1)】

 

Redis分布式锁超时怎么办

  • 在使用 Redis 分布式锁时,需要设置一个合理的超时时间,以防止客户端宕机或网络异常导致的死锁问题。
  • 但如果设置的超时时间太短,又可能导致合法的业务逻辑无法完成,锁被提前释放。
  • Redisson 的看门狗机制可以很好地解决这个问题,它会自动检查并续期锁,确保业务逻辑能够正常执行。

 

怎么使用Mysql来实现Redis的分布式锁,如何解决分布式锁的常见问题 / 不用redis怎么实现分布式锁?

使用 MySQL 实现分布式锁:

  • 可以创建一个 MySQL 表,用来存储锁信息。表结构可以包括:锁名称、持有锁的进程 ID、锁的过期时间等字段。
  • 要获取锁,可以执行一个 INSERT INTO locks (lock_name, process_id, expiration) VALUES (?, ?, ?) 的 SQL 语句,并设置一个合理的过期时间。
  • 如果 INSERT 成功,说明获取锁成功。如果 INSERT 失败,说明锁已经被其他进程持有,需要重试。
  • 在业务逻辑执行完毕后,需要执行 DELETE FROM locks WHERE lock_name = ? AND process_id = ? 来释放锁。

 

对标 Redisson 的实现:

可重入锁:

  • Redisson 的可重入锁通过维护一个持有锁的线程 ID 和锁的持有次数来实现。
  • MySQL 实现中,通过 lock_count 字段来记录锁的持有次数,实现类似的功能。

锁超时:

  • Redisson 通过 Lua 脚本在释放锁时检查过期时间来解决锁超时问题。
  • MySQL 实现中,在释放锁时检查当前时间是否超过过期时间,避免误删其他进程的锁。

锁失效:

  • Redisson 利用 Redis 的原子操作特性来保证锁的获取和释放是原子的。
  • MySQL 实现中,通过事务来确保锁的获取和释放是原子的。

死锁问题:

  • Redisson 通过设置锁的等待时间和自动续期来解决死锁问题。
  • MySQL 实现中,通过设置 innodb_lock_wait_timeout 参数来解决死锁问题,并在业务逻辑中捕获超时异常并重试。

 

用redis和mysql实现分布式锁有什么异同?

相同点:

  • 都可以用来实现分布式锁,基本原理类似,都需要处理加锁、释放锁、过期处理等问题。

不同点:

  • Redis 作为内存数据库,性能更优,但需要考虑单点故障问题。
  • MySQL 作为关系型数据库,可靠性更高,但性能相对较低。
  • ZooKeeper 等第三方协调服务,可靠性和性能均较高,但需要额外部署及维护成本。

 

Redis实现分布式锁的命令 / Redis实现分布式锁怎么弄的,key和value怎么设置?/ Redis分布式锁如何上锁

  • Redis 实现分布式锁主要使用 SET key value NX PX milliseconds 命令。
  • 获取锁时,客户端生成一个唯一的 value(通常是客户端标识+随机数),然后执行 SET key value NX PX milliseconds。
  • 释放锁时,客户端先判断 key 对应的 value 是否与自己生成的一致,一致则执行 DEL key 命令释放锁。
  • 如果业务处理时间过长,可以通过 Lua 脚本在释放锁时检查过期时间,防止锁被误释放。

 

redis分布式锁的粒度控制

  • Redis 分布式锁可以通过锁名来控制粒度,例如为不同业务设置不同的锁名。
  • 也可以为同一个业务设置多个子锁,根据业务需求进行细粒度的锁控制。

 

如果业务处理较慢,分布式锁过期怎么办 / Redis 分布式锁超时可以超时时间设长一点可以吗?不可以的话需要怎么解决?/ redis分布式锁的setnx为什么设置过期时间?

  • 如果业务处理时间过长,分布式锁可能会提前过期。这时可以通过 Lua 脚本在释放锁时检查过期时间,如果未过期则继续持有锁。
  • 也可以使用 Redis 的看门狗机制,由专门的线程定期检查并续期锁,确保业务能够正常执行完成。

 

Redisson实现的分布式锁怎么解决死锁问题? / Redis实现分布式锁怎么避免死锁问题

  • Redisson使用Redis的Lua脚本来实现分布式锁,保证锁的获取和释放是原子操作,避免死锁问题。
  • 在获取锁的时候,Redisson会设置一个自动续期的定时任务,在锁即将过期的时候,会自动续期,确保业务逻辑能够在锁有效期内完成。
  • 在锁被释放的时候,Redisson会检查当前线程是否为持有锁的线程,如果是才会释放锁,避免误删其他线程的锁。

 

Redis分布式锁使用场景,怎么使用的?

  • 秒杀、抢购等高并发场景,需要控制访问资源的并发数。
  • 分布式任务调度,防止多个节点重复执行同一个任务。
  • 分布式服务的leader选举,只允许一个服务节点执行特定操作。
  • 分布式限流,限制某个资源的访问频率。

 

如何使用Redis分布式锁解决的超卖问题?

  • 在获取锁之前,先检查库存是否足够,如果不足则直接返回。
  • 获取锁成功后,再执行扣减库存的操作。
  • 最后在释放锁之前,再次检查库存是否足够,如果不足则恢复之前的库存。

 

介绍一下redisson分布式锁?/ Redisson怎么改进的分布式锁

  • Redisson在Redis的基础上,实现了可重入锁、公平锁、联锁等多种类型的分布式锁。
  • 可重入锁通过维护一个持有锁的线程ID和锁的持有次数来实现。
  • 公平锁通过维护一个等待队列,按照请求顺序依次获取锁。
  • 联锁允许同时获取多个锁,只有全部获取成功才算获取锁成功。

 

redis分布式锁实现,怎么实现可重入? / 基于Redis如何实现可重入的分布式锁?

  • 可重入锁需要记录当前线程持有锁的次数,以及线程ID。
  • 在获取锁时,先检查当前线程是否已经持有锁,如果是则将持有次数加1,并更新锁的过期时间。
  • 在释放锁时,将持有次数减1,如果减到0则删除该锁。

 

redis分布式锁如何实现可重入,考虑不同主机线程重名的情况

  • 可以在锁key的值中加入线程ID或进程ID,来区分不同主机上的线程。
  • 在释放锁时,先检查当前线程ID是否与锁中记录的ID一致,只有一致才能释放锁。

 

使用Redis分布式锁有一个问题,不管是主从模式/哨兵模式下,如果主节点挂了,key没有同步到主节点,查询不到key就又可以获取锁,怎么解决 / Redis分布式锁主库挂了,切换到从库,从库还没同步,其它线程也能加锁,怎么办?

使用RedissonRedLock

  • Redisson提供了RedissonRedLock,可以在多个Redis节点上获取锁。
  • 只有在大部分(例如超过半数)节点上获取到锁,才算获取成功。
  • 即使个别节点挂掉或数据未同步,只要大部分节点正常工作,锁的一致性仍可得到保证。

 

Redis分布式锁,服务异常了,锁得不到释放了怎么办?除了加过期时间,还能怎么办?Redis集群时怎么办?

  • 除了设置过期时间外,还可以使用Lua脚本来实现锁的安全释放。
  • 在释放锁时,先检查当前线程是否持有该锁,只有持有者才能释放。
  • 如果服务异常导致锁无法释放,可以通过定期扫描未释放的锁并强制释放的方式解决。

 

Redission看门狗什么时候会续期?怎么判断会不会续期?

  • Redisson在获取锁成功后,会启动一个定时任务,在锁快到期时自动续期。
  • 续期时间由leaseTime参数控制,默认值为30秒。
  • 如果业务逻辑超过leaseTime仍未完成,则需要手动续期,否则锁会过期。
  • 可以通过tryLock(waitTime, leaseTime, TimeUnit)方法设置自定义的等待时间和锁有效期。

 

锁误删和超时问题

  • 锁误删问题可以通过Lua脚本实现安全的释放,确保只有持有者才能释放。
  • 锁超时问题可以通过定期扫描未释放的锁,并根据业务逻辑判断是否需要强制释放。

 

    后期新的八股文合集文章会继续分享,感兴趣的小伙伴可以点个关注~

 更多精彩内容以及免费资料请关注公众号:绝命Coding

914cbb12b2c3492aaa31232a11aa9c64.png

 

 

 

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值