美文网首页Redis
02_redis_分布式锁

02_redis_分布式锁

作者: A_l_A_n | 来源:发表于2020-07-06 15:19 被阅读0次

分布式应用进行逻辑处理的时候,会遇到并发问题。
比如修改一个用户的状态,需要先读取用户的状态,在内存中进行修改,修改完后再放回去。如果这样的操作同时进行,就会出现并发的问题。以为读取和写入操作都不是原子级别的。
(原子操作:是指不会被线程调度机制打断的操作,一旦操作开始,就一直运行到结束,中间不会有线程转换。)

这个时候就考虑分布式锁来限制程序的并发。

分布式锁

  1. 加锁,执行,释放锁
> setnx lock:codehole true
OK
... do something critical ...
> del lock:codehole
(integer) 1

缺点:在执行的时候出现异常,导致不能执行del lock。从而死锁。

  1. 加锁,设置时间,执行,时间到释放锁
> setnx lock:codehole true
OK
> expire lock:codehole 5
... do something critical ...
> del lock:codehole
(integer) 1

缺点:如果setnx expire 之间的服务器进程挂调了,会导致expire不执行,死锁。

  1. Redis 2.8加入了 set 指令的扩展参数,使得 setnx 和expire 指令可以一起执行,彻底解决了分布式锁的乱象。
> set lock:codehole true ex 5 nx 
OK 
... do something critical ...
> del lock:codehole

超时问题

Redis分布式锁不能解决超时问题。如果加锁和释放锁之间处理的时间太长,超过了锁的时间限制,就出现问题了。这时锁过期了,第二个线程拿到了锁。等第一个线程执行完释放锁,第三个线程会在第二个线程没执行完的时候拿到锁。
为了避免这个问题,Redis分布式锁不要用于较长时间的任务,偶尔出现这种情况请人工干预一下子。

可重入性

指的是,在线程持有锁的时候再次请求加锁,如果一个锁支持同一个线程多次加锁,那么这个锁就是可重入的。
java中的ReentrantLock就是可重入锁,Redis分布式锁如果要支持可重入性,需要对客户端的set进行重新包装,使用线程的 Threadlocal 变量
存储当前持有锁的计数。

相关文章

  • 02_redis_分布式锁

    分布式应用进行逻辑处理的时候,会遇到并发问题。比如修改一个用户的状态,需要先读取用户的状态,在内存中进行修改,修改...

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资...

  • 4:Redis 分布式锁 (文末有项目连接)

    1:什么是缓存分布式锁 2:分布式锁的关键代码 3:业务代码使用分布式缓存锁 4:业务代码使用分布式缓存锁 5:测...

  • 锁(2)-- 分布式锁

    前言: 锁分3种:java锁、分布式锁、DB锁 分布式锁的几种实现方式 目前几乎很多大型网站及应用都是分布式部署...

  • java锁的概念

    参考文档探究分布式并发锁并发编程-锁的发展和主流分布式锁比较总结从构建分布式秒杀系统聊聊分布式锁探索并发编程(六)...

  • Redis实现分布式锁

    分布式下的分布式锁一般实现有三种: 基于数据库的乐观锁 基于redis的分布式锁 基于zookeeper的分布式锁...

  • 分布式锁

    为什么要用分布式锁? 分布式锁是悲观锁的实现; 如果采用乐观锁的方案就用不着分布式锁了。 能用乐观锁的地方尽量用乐...

  • 3.10:分布式锁

    本文将梳理微服务架构下,分布式锁的常用方案。整体包含以下三部分: 分布式锁的提出 分布式锁主流方案 分布式锁选择 ...

  • Redis实现分布式锁

    1. 分布式锁分类 数据库乐观锁 基于Redis的分布式锁 基于ZooKeeper的分布式锁 2. 组件依赖 po...

网友评论

    本文标题:02_redis_分布式锁

    本文链接:https://www.haomeiwen.com/subject/rsgwqktx.html