Jedis结合setNX方法实现分布式锁

public boolean lock(String key, int exprie) {try {exprie = exprie <= 0 ? 60 : exprie;String value = JsonUtil2.obj2String(createMeta(exprie));String lockKey = this.getLockKeyPrev() + key;String result=this.setNX(lockKey, value,"EX",exprie);if (result!=null && result.equals("OK")) {LOGGER.info("Get redis lock success, key =" + lockKey);return true;}Object obj = this.get(lockKey);if (obj==null) {this.delete(lockKey);LOGGER.info("Redis unlock success ,key = " + lockKey);Thread.sleep(1000);value = JsonUtil2.obj2String(createMeta(exprie));String result1=this.setNX(lockKey, value,"EX",exprie);if (result1!=null && result1.equals("OK")) {this.expire(lockKey, exprie);LOGGER.info("Get redis lock success, key =" + lockKey);return true;} else {LOGGER.warn("Get redis lock fail, key =" + lockKey);return false;}}value = (String)obj;LockModel model = JsonUtil2.getObjectMapper().readValue(value, LockModel.class);if (model.isLose()) {// 已经超时this.delete(lockKey);value = JsonUtil2.obj2String(createMeta(exprie));String result2=this.setNX(lockKey, value,"EX",exprie);if (result2!=null && result2.equals("OK")) {this.expire(lockKey, exprie);LOGGER.info("Get redis lock success, key =" + lockKey);return true;} else {LOGGER.warn("Get redis lock fail, key =" + lockKey);return false;}}LOGGER.warn("Get redis lock fail, key =" + lockKey);return false;} catch (Exception ex) {ex.printStackTrace();LOGGER.error(ex.getMessage());return true;}}public void unlock(String key) {String lockKey = this.getLockKeyPrev() + key;try {delete(lockKey);} catch (Exception ex) {LOGGER.error(ex.getMessage());}LOGGER.info("Redis unlock success ,key = " + lockKey);}private LockModel createMeta(int exprie) {LockModel meta = new LockModel();meta.setExpireTime(exprie);meta.setLockTime(System.currentTimeMillis());return meta;}public String getLockKeyPrev() {return "lock:";}/*** 设置key* 需要传入key是否不存存在** @param key      键* @param value    值* @param expx     EX/PX   值只能取EX或者PX,代表数据过期时间的单位,EX代表秒,PX代表毫秒* @param interval 过期时间,单位是expx所代表的单位。* @return SET 在设置操作成功完成时,才返回 OK 。* 如果设置了 NX 或者 XX ,但因为条件没达到而造成设置操作未执行,那么命令返回空批量回复(NULL Bulk Reply)*/public String setNX(String key, Object value, String expx, long interval) {Jedis jedis = MyRedisPool.getJedis();String result = "";try {result = jedis.set(key, String.valueOf(value), "NX", expx, interval);} catch (Exception e) {e.printStackTrace();} finally {MyRedisPool.returnResource(jedis);}return result;}/*** 删除给定的一个或多个 key 。* 不存在的 key 会被忽略。** @param key 键* @return 被删除 key 的数量。*/public Long delete(String key) {Jedis jedis = MyRedisPool.getJedis();Long result = 0L;try {result = jedis.del(key);} catch (Exception e) {e.printStackTrace();} finally {MyRedisPool.returnResource(jedis);}return result;}/*** 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。* 可以对一个已经带有生存时间的 key 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。** @param key* @param interval* @return 设置成功返回 1 。* 当 key 不存在或者不能为 key 设置生存时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的生存时间),返回 0 。*/public Long expire(String key, int interval) {Jedis jedis = MyRedisPool.getJedis();Long result = 0L;try {result = jedis.expire(key, interval);} catch (Exception e) {e.printStackTrace();} finally {MyRedisPool.returnResource(jedis);}return result;}/*** 返回 key 所关联的字符串值* 如果 key 不存在那么返回特殊值 nil 。** @param key* @return 当 key 不存在时,返回 nil ,否则,返回 key 的值。* 如果 key 不是字符串类型,那么返回一个错误。*/public Object get(String key) {Jedis jedis = MyRedisPool.getJedis();Object o = null;try {o = jedis.get(key);} catch (Exception e) {e.printStackTrace();} finally {MyRedisPool.returnResource(jedis);}return o;}

  

转载于:https://www.cnblogs.com/brant/p/10448187.html

Redis实现分布式锁1相关推荐

  1. 基于 Redis 实现分布式锁思考

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/xuan_lu/article/details/111600302 分布式锁 基于redis实 ...

  2. Redis实现分布式锁的深入探究

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.分布式锁简介 锁 是一种用来解决多个执行线程 访问共享资源 错 ...

  3. nx set 怎么实现的原子性_基于Redis的分布式锁实现

    前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...

  4. Zookeeper和Redis实现分布式锁,附我的可靠性分析

    作者:今天你敲代码了吗 链接:https://www.jianshu.com/p/b6953745e341 在分布式系统中,为保证同一时间只有一个客户端可以对共享资源进行操作,需要对共享资源加锁来实现 ...

  5. Redis——由分布式锁造成的重大事故

    作者:浪漫先生 原文:juejin.im/post/6854573212831842311 前言 基于Redis使用分布式锁在当今已经不是什么新鲜事了.本篇文章主要是基于我们实际项目中因为redis分 ...

  6. 基于Redis的分布式锁和Redlock算法

    来自:后端技术指南针 1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手 ...

  7. 《Redis官方文档》用Redis构建分布式锁

    <Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...

  8. 《Redis官方文档》用Redis构建分布式锁(悲观锁)

    2019独角兽企业重金招聘Python工程师标准>>> **用Redis构建分布式锁 ** 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章 ...

  9. redis 实现分布式锁

    为什么80%的码农都做不了架构师?>>>    redis 实现分布式锁 伪代码 lock(){if(jedis.setNx("key",timestamp)){ ...

  10. redis系列:基于redis的分布式锁

    一.介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...

最新文章

  1. 2020年,5种将死的编程语言
  2. 一文教会你什么线程安全以及如何实现线程安全
  3. 不怕面试再问 Activity,一次彻底地梳理(原理+生命周期)
  4. 双向多点路由重分布--如何防止路由环路以及次优路径
  5. 百度为什么发现不了旗下网站的恶意代码?
  6. 8255交通灯实验的微型计算机,微机原理课程设计——8255,8253交通灯模拟实验.doc...
  7. 在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头
  8. bool函数_PHP变量类型测试函数的使用:一、is_bool的用法
  9. 市场调研策划书_市场调查计划书模板
  10. eclipse你的主机中的软件中止了一个已建立的连接。_如何备份/恢复一个基于Windows系统的操作面板?...
  11. 转:移动网络下的性能优化之省电篇
  12. 人机交互,情感计算,,人工智能相关研究的科研团队
  13. 利用C Free3.5 本身获得自身注册码
  14. 交替性注意力_玩出专注力,一次对付五种专注力不足
  15. 前端-深克隆与浅克隆
  16. CCF-CSP认证历年真题解
  17. ubuntu 14.04 安装搜狗拼音输入法
  18. 小程序全套购物车(全选,单选,反选,删除,价格计算)
  19. 幻数java题_幻数
  20. Google扩展程序地址

热门文章

  1. 067_为什么要使用xhtml
  2. Linux给命令设置超时时间,Linux命令技巧和时间设置
  3. android培训内容明细,记录Android开发学习
  4. 每次启动“Everything“需要管理员权限来索引NTFS卷.
  5. 销售找客户的软件_实用的销售客户管理软件
  6. linux下使用python_Python随笔(一)、Linux系统下python环境的安装
  7. 校园网服务器系统需求分析,校园网的网络系统集成建设需求分析的主要工作
  8. python入门基础代码初学
  9. html中透明度怎么写,css中控制透明度
  10. mongotemplate 查list_mongoTemplate.aggregate()聚合查询 时间