Redis实现分布式锁1
生活随笔
收集整理的這篇文章主要介紹了
Redis实现分布式锁1
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? Jedis結(jié)合setNX方法實(shí)現(xiàn)分布式鎖
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()) {// 已經(jīng)超時(shí)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:";}/*** 設(shè)置key* 需要傳入key是否不存存在** @param key 鍵* @param value 值* @param expx EX/PX 值只能取EX或者PX,代表數(shù)據(jù)過期時(shí)間的單位,EX代表秒,PX代表毫秒* @param interval 過期時(shí)間,單位是expx所代表的單位。* @return SET 在設(shè)置操作成功完成時(shí),才返回 OK 。* 如果設(shè)置了 NX 或者 XX ,但因?yàn)闂l件沒達(dá)到而造成設(shè)置操作未執(zhí)行,那么命令返回空批量回復(fù)(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;}/*** 刪除給定的一個(gè)或多個(gè) key 。* 不存在的 key 會被忽略。** @param key 鍵* @return 被刪除 key 的數(shù)量。*/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 設(shè)置生存時(shí)間,當(dāng) key 過期時(shí)(生存時(shí)間為 0 ),它會被自動刪除。* 可以對一個(gè)已經(jīng)帶有生存時(shí)間的 key 執(zhí)行 EXPIRE 命令,新指定的生存時(shí)間會取代舊的生存時(shí)間。** @param key* @param interval* @return 設(shè)置成功返回 1 。* 當(dāng) key 不存在或者不能為 key 設(shè)置生存時(shí)間時(shí)(比如在低于 2.1.3 版本的 Redis 中你嘗試更新 key 的生存時(shí)間),返回 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 所關(guān)聯(lián)的字符串值* 如果 key 不存在那么返回特殊值 nil 。** @param key* @return 當(dāng) key 不存在時(shí),返回 nil ,否則,返回 key 的值。* 如果 key 不是字符串類型,那么返回一個(gè)錯誤。*/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;}
轉(zhuǎn)載于:https://www.cnblogs.com/brant/p/10448187.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Redis实现分布式锁1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自制一个 elasticsearch-s
- 下一篇: 快讯|腔家政服务商“懒猪到家”完成200