Redis实现分布式锁1
生活随笔
收集整理的這篇文章主要介紹了
Redis实现分布式锁1
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? Jedis結合setNX方法實現(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)超時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,代表數(shù)據(jù)過期時間的單位,EX代表秒,PX代表毫秒* @param interval 過期時間,單位是expx所代表的單位。* @return SET 在設置操作成功完成時,才返回 OK 。* 如果設置了 NX 或者 XX ,但因為條件沒達到而造成設置操作未執(zhí)行,那么命令返回空批量回復(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 的數(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 設置生存時間,當 key 過期時(生存時間為 0 ),它會被自動刪除。* 可以對一個已經(jīng)帶有生存時間的 key 執(zhí)行 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 所關聯(lián)的字符串值* 如果 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
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Redis实现分布式锁1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自制一个 elasticsearch-s
- 下一篇: 快讯|腔家政服务商“懒猪到家”完成200