①在(idea+SpringBoot+redis整合+RedisUtil可直接使用)笔记搭建成功的基础上
②创建jedis工具类
package com.example.redis;
import redis.clients.jedis.*;
import java.util.*;
/**
* JedisPool工具类
* 加载配置文件,配置连接池的参数
* 提供获取连接的方法
*/
public class JedisPoolUtils {
public static JedisCluster jedisCluster;
static {
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(2);
config.setMaxIdle(1);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("10.160.13.114", 6381));
jedisClusterNode.add(new HostAndPort("10.160.13.114", 6380));
jedisClusterNode.add(new HostAndPort("10.160.13.114", 6379));
jedisClusterNode.add(new HostAndPort("10.160.13.114", 6384));
jedisClusterNode.add(new HostAndPort("10.160.13.114", 6383));
jedisClusterNode.add(new HostAndPort("10.160.13.114", 6382));
jedisCluster = new JedisCluster(jedisClusterNode, config);
}
/**
* 加锁操作
* @param key 锁标识
* @param uniqueId 客户端标识
* @param timeOut 过期时间
*/
public static boolean lock(String key, String uniqueId, Long timeOut) {
boolean jedisTag = "OK".equals(jedisCluster.set(key, uniqueId, "NX", "EX", timeOut)) ? true : false;
return jedisTag;
}
/**
* 释放锁
* @param key 锁标识
* @param uniqueId 客户端标识
* @return
*/
public static boolean unLock(String key, String uniqueId) {
//lua脚本
String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else return 0 end";
boolean jedisTag = "OK".equals(jedisCluster.eval(luaScript,Collections.singletonList(key), Collections.singletonList(uniqueId)));
return jedisTag;
}
/**
* 尝试加锁
* @param key 锁标识
* @param value 客户端标识
* @param timeOut 过期时间
* @param retry 重试次数
* @param sleepTime 重试间隔时间
* @return
*/
public static Boolean lockRetry(String key,String value,Long timeOut,Integer retry,Long sleepTime){
Boolean flag = false;
try {
for (int i=0;i<retry;i++){
flag = lock(key,value,timeOut);
if(flag){
break;
}
Thread.sleep(sleepTime);
}
}catch (Exception e){
e.printStackTrace();
}
return flag;
}
}
注意集群有密码时会抛出:
但是jedis又支持设置密码,解决方法如下
http://www.mamicode.com/info-detail-1451210.html
package com.example.redis;
import redis.clients.jedis.*;
import java.util.*;
/**
* JedisPool工具类
* 加载配置文件,配置连接池的参数
* 提供获取连接的方法
*/
public class JedisPoolUtils {
public static JedisPool jedisPool;
static {
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(2);
config.setMaxIdle(1);
jedisPool = new JedisPool(config, "10.160.13.114", 6381, 2000, "SSJ5IdEL");
}
/**
* 加锁操作
* @param key 锁标识
* @param uniqueId 客户端标识
* @param timeOut 过期时间
*/
public static boolean lock(String key, String uniqueId, Long timeOut) {
Jedis jedis =jedisPool.getResource();
boolean jedisTag = "OK".equals(jedis.set(key, uniqueId, "NX", "EX", timeOut)) ? true : false;
jedis.close();
return jedisTag;
}
/**
* 释放锁
* @param key 锁标识
* @param uniqueId 客户端标识
* @return
*/
public static boolean unLock(String key, String uniqueId) {
//lua脚本
String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else return 0 end";
Jedis jedis =jedisPool.getResource();
boolean jedisTag = "OK".equals(jedis.eval(luaScript,Collections.singletonList(key), Collections.singletonList(uniqueId)));
jedis.close();
return jedisTag;
}
/**
* 尝试加锁
* @param key 锁标识
* @param value 客户端标识
* @param timeOut 过期时间
* @param retry 重试次数
* @param sleepTime 重试间隔时间
* @return
*/
public static Boolean lockRetry(String key,String value,Long timeOut,Integer retry,Long sleepTime){
Boolean flag = false;
try {
for (int i=0;i<retry;i++){
flag = lock(key,value,timeOut);
if(flag){
break;
}
Thread.sleep(sleepTime);
}
}catch (Exception e){
e.printStackTrace();
}
return flag;
}
}
另一种单机版redis分布式锁(https://www.cnblogs.com/liuyang0/p/6744076.html)