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

执业医师变更注册网站跨境电商运营平台

执业医师变更注册网站,跨境电商运营平台,编程代写有哪些平台,徐州企业网站设计Redis 中,Setnx(SET if Not eXists)命令是指:只有当指定的 key 不存在时,才会为 key 设置指定的值,此时设置成功,返回 1;如果指定 key 存在,不会覆盖该 key 的值&#xf…

Redis 中,Setnx(SET if Not eXists)命令是指:只有当指定的 key 不存在时,才会为 key 设置指定的值,此时设置成功,返回 1;如果指定 key 存在,不会覆盖该 key 的值,此时设置失败,返回 0。

因此,利用 Redis 执行命令时是单线程的特性 + Setnx 并发操作的原子性可以实现一个简单的分布式锁。

Redis 执行命令时是单线程的特性可以保证:当多个客户端同时通过 Setnx 命令尝试获取锁时,只有一个客户端会获取成功,其他客户端则获取失败。

Setnx 并发操作的原子性可以保证:多个客户端并发操作的互斥性,即当一个客户端执行 Setnx 命令时,不会被其他客户端影响。

此外,还要考虑:如果获取锁成功,则设置一个过期时间,防止该客户端挂了之后一直持有该锁;客户端释放锁的时候,需要先判断该锁是否仍然属于该客户端,如果是,则通过 DEL 命令释放锁。

实现代码:

public class RedisDistributedLock {private final JedisPool jedisPool;public RedisDistributedLock(JedisPool jedisPool) {this.jedisPool = jedisPool;}public boolean tryLock(String lockKey, String requestId, int expireTime) {try (Jedis jedis = jedisPool.getResource()) {String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);return "OK".equals(result);}}public boolean unlock(String lockKey, String requestId) {try (Jedis jedis = jedisPool.getResource()) {String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));return Long.parseLong(result.toString()) == 1L;}}}

1、tryLock方法接收三个参数,分别是锁的键值lockKey、加锁的请求标识requestId和锁的过期时间expireTime。该方法会尝试使用Redis的set命令加锁,如果加锁成功则返回true,否则返回false。其中NX表示只在锁的键不存在时设置锁,PX表示锁的过期时间为expireTime毫秒。

2、unlock方法接收两个参数,分别是锁的键值lockKey和加锁的请求标识requestId。该方法会执行一个Lua脚本,判断当前锁的值是否等于请求标识requestId,如果是则删除锁并返回true,否则返回false。该方法使用eval命令执行Lua脚本,传入锁的键值和请求标识两个参数,返回值是执行结果。

优点:

(1)实现简单:SETNX 命令实现简单,易于理解和使用。

(2)性能较高:由于 SETNX 命令的执行原子性,保证了分布式锁的正确性,而且在 Redis 中,SETNX 命令是单线程执行的,所以性能较高。

缺点:

(1)锁无法续期:如果加锁方在加锁后的执行时间较长,而锁的超时时间设置的较短,可能导致锁被误释放。

(2)无法避免死锁:如果加锁方在加锁后未能及时解锁(也未设置超时时间),且该客户端崩溃,可能导致死锁。

(3)存在竞争:由于 SETNX 命令是对 Key 的操作,所以在高并发情况下,多个客户端之间仍可能存在竞争,从而影响性能。

(4)SETNX 不支持可重入,可以借助 Redission 封装的能力实现可重入锁。

总结:

使用 SETNX 命令是 Redis 实现分布式锁最简单的方法,虽然上述方案中并不支持可重入性,但是依然可以在当前逻辑的基础上进行调整,使其支持可重入。 尽管如此,使用 SETNX 命令仍然有其他问题,比如锁无法续期等问题。

其次,Redission 中已经实现了效果不错的分布式锁,开箱即用即可,这里我们只是思考一下基于 SETNX 实现分布式锁的思路而已。

http://www.dtcms.com/a/504981.html

相关文章:

  • 门头沟做网站公司国内建网站流程
  • 北京网站制作郑州电子商务网站建设需要知识
  • RK3568学习笔记
  • 大规模网站开发语言微信小程序可以自己开发吗
  • wordpress 导出用户天津seo网络营销
  • 【数据结构与算法基础】05. 栈详解(C++ 实战)
  • 做网站要有什么团队雨发建设集团有限公司网站
  • seo建站优化asp.net+mvc+网站开发
  • 网站图片一般分辨率做多大赣州网站建设服务
  • 2017招远网站建设云兰装潢公司总部地址电话
  • 网站服务器查询工具wordpress 返回顶部插件
  • 做网站推广弊端青岛胶南做网站的
  • 2018年网站建设工作总结北京市建设工程信息网登录流程
  • 网站首页背景代码旅游类网站开发毕业设计
  • 9 垂直分片
  • 公司网站如何备案如何制作钓鱼网站
  • 做网站如何分类关于网站建设的外文翻译
  • 网站建设申请书搜了网推广
  • 昆明做网站建设有哪些网站推广优化联系方式
  • 免费注册自己的网站品牌建设卓有成效
  • 易语言和网站做交互中国赣州
  • 网站网页设计制作公司搬家网站建设案例说明
  • STM32Cubemx配置独立看门狗(IWDG)
  • 有做翻译英文网站山西网站开发二次开发
  • 外贸业务怎么利用网站开发客户网站建设模板网站
  • 免费的企业网站建设wordpress做漫画
  • 网站域名查询网网站推广的方法搜索引擎
  • 给外国小孩 做 英语题用的网站怎么做文学动漫网站
  • 网站制作网页设计室内设计软件3d
  • 北京专业制作网站公司哪家好贵南网站建设