当前位置: 首页 > news >正文

百度怎么做网站域名浙江网站建设制作

百度怎么做网站域名,浙江网站建设制作,mip网站怎么做匹配,免费做的网站怎么设置域名这篇文章我们来详细介绍一下如何正确地基于Redis实现分布式锁。 基于Redis的分布式锁实现 组件依赖 首先通过Maven引入Jedis开源组件&#xff0c;在pom.xml文件加入下面的代码&#xff1a; <dependency><groupId>redis.clients</groupId><artifactId&g…

        这篇文章我们来详细介绍一下如何正确地基于Redis实现分布式锁。

基于Redis的分布式锁实现

组件依赖

        首先通过Maven引入Jedis开源组件,在pom.xml文件加入下面的代码:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency>

 加锁代码

        我们先来看一下正确的代码实现:

public class RedisTool{private static final String LOCK_SUCCESS = "OK";private static final String SET_IF_NOT_EXIST = "NX";private static final String SET_WITH_EXPIRE_TIME = "PX";public static boolean tryGetDistributeLock(Jedis jedis, String lockKey, String requestId, int expireTime){String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME);if(LOCK_SUCCESS.equals(result)){return true;}return false;
}
}

        可以看到,加锁代码其实只有一行,jedis.set(String key, String value, String nxxx, String expx, int time),这个set方法一共有五个形参:

        String key:我们是用key来当锁,因为key是唯一的;

        String value:这个参数用来记录和标记加锁的是哪个线程。requestId可以使用UUID.randomUUID().toString()方法生成;

        String nxxx:这个参数我们填的是NX,即如果Key不存在,我们进行Set操作;如果Key存在,则不进行任何操作;

        String expx:这个参数我们传的是PX,意思是我们要对这个Key设置一个过期时间,具体的时间由第五个参数决定;

        int time:代表着具体的过期时间。

        总的来说,执行上面的set()方法就只会导致两种结果:

        (1)当前没有锁,那么就进行加锁操作,并对锁设置一个有效期,同时value表示加锁的客户端;

        (2)已经有锁存在,不进行任何操作。

        上面这一段加锁代码可以满足前面文章提到的分布式锁的三个方面。首先,set()操作加入了NX参数,可以保证如果有Key存在,则函数不会调用成功,也就是只有一个客户端能够持有锁,满足了分布式锁的互斥性;第二,由于我们在set时设置了key的过期时间,即使锁的持有者后续发生崩溃而没有解锁,锁也会因为到了过期时间而自动过期解锁,所以不会产生死锁问题;最后,我们是用requestId作为key对应的value,以此来代表加锁的客户端请求标识,那么客户端在解锁的时候就会自动判断这个锁是不是有自己这个客户端加的,实现了分布式锁的可重入。

解锁代码

        我们先来看一下正确的代码实现:

public class Redistool{private static final Long RELEASE_SUCCESS = 1L;public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId){String script = "if reids.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";Object result = jedis.eval(script, Collections.singleonList(lockKey), Collections.singletonList(requestId));if(RELEASE_SUCCESS.equals(result)){return true;}return false;
}
}

        可以看到,我们解锁只需要两行代码就搞定了。第一行代码,我们简单写了一个Lua脚本代码。第二行我们将Lua代码传到jedis.eval()方法里,并使参数KEYS[1]赋值为lockKey,ARGV[1]赋值为requestId。eval()方法是将Lua代码交给Redis服务端去执行。

        这段Lua代码的功能是首先获取锁对应的value值,检查是否与requested相等,如果相等则删除锁。使用Lua脚本来实现是因为要确保上述操作是原子性的。

        本文主要介绍了如何基于Redis正确的实现分布式锁。大家有什么问题或勘误可以在评论区留言,笔者看到都会回复的。

http://www.yayakq.cn/news/865725/

相关文章:

  • 制作公司网站需要几个数据表云南文山网站建设制作
  • 做网站做软件怎么赚钱吗音乐网站设计源码
  • 做一款app需要网站吗北京网站备案拍照地点
  • 吴忠网站建设报价苏州网页制作电话
  • 小杨哥直播带货平台杭州网站优化企业
  • 怀柔做网站的吗学电脑零基础怎样才可以快速学
  • 企业建网站的案例大庆网站建设
  • 牙科医院网站建设个人接做网站多少钱
  • 网站备案需要提供网站建设方案书免费加入微商代理
  • 网站建设主管的策划案东莞公司展厅设计公司
  • 济南网站建设优化百家号湖南人文科技学院官网首页
  • phpcms适合做什么网站凡客建站快车
  • 建设信用卡中心网站响应式网站设计建设制作
  • 如何建设网站效果好网站建设管理经验
  • 网站更换备案吗优秀网站seo报价
  • 国内做进口的电商网站网络文学网站开发
  • 网站备案 信息安全管理协议网站输入卡密提取怎么做
  • 网站开发小结wordpress速度慢设置
  • 建设小的电商网站开源系统wordpress文章排版工具
  • 乌兰浩特建设网站房地产信息网首页
  • 外贸网站建设哪里实惠大学两学一做网站
  • 网站怎么做播放器免费室内装修3d设计软件
  • 网站优化人员wordpress如何生成html代码
  • 门户网站网页设计规范茶网站建设方案
  • 私人网站开发公司怎么知道一个网站是谁做的
  • 下花园区住房和城乡建设局网站类似淘宝的电商平台
  • 深圳做棋牌网站建设哪家公司便宜如何做企业介绍
  • 营销网站建设服务如何用WordPress建小说站
  • 自由贸易试验区网站建设方案邯郸市网络公司
  • 有没有做公章的网站品牌网站设计首选