Redis 如何實現redis分散式鎖
阿新 • • 發佈:2021-07-31
1、redis設定key時上鎖
package com.test; import com.utils.JedisUtil; import redis.clients.jedis.Jedis; import java.util.*; public class Test09_Redis { private static final Long SUCCESS = 1L; private static Jedis jedis = new Jedis("127.0.0.1"); public static void main(String[] args) { // Jedis jedis = JedisUtil.getJedis(); // JedisUtil.close(jedis); boolean b = tryLock("1", "123"); boolean b1 = unLock("1", "123"); System.out.println("b= " + b + " b1= " + b1); } // public boolean tryLock2(String key, String requestId, int expireTime) { // //使用jedis的api,保證原子性 // //NX 不存在則操作 EX 設定有效期,單位是秒 // // String result = jedis.set(key, requestId, "NX", "EX", expireTime); // String result = jedis.set(key, requestId, expireTime); // //返回OK則表示加鎖成功 // return "OK".equals(result); // } /** * 加鎖 */ public static boolean tryLock(String key, String requestId) { //使用setnx命令。 //不存在則儲存返回1,加鎖成功。如果已經存在則返回0,加鎖失敗。 return SUCCESS.equals(JedisUtil.getJedis().setnx(key, requestId)); } //刪除key的lua指令碼,先比較requestId是否相等,相等則刪除 private static final String DEL_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; /** * 解鎖 */ public static boolean unLock(String key, String requestId) { //刪除成功表示解鎖成功 Long result = (Long) jedis.eval(DEL_SCRIPT, Collections.singletonList(key), Collections.singletonList(requestId)); return SUCCESS.equals(result); } }