pom.xml配置
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml配置
redis:host: 20.74.51.205password: 123456port: 6379pool:max-idle: 100min-idle: 1max-active: 1000max-wait: -1timeout: 0
config配置
package com.lock.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** @author 作者 小书生008* @create 2018-09-20 15:55**/
@Slf4j
@Configuration
@EnableAutoConfiguration
public class RedisConfig {@Value("${spring.redis.host}")private String hostName;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.timeout}")private int timeout;@Beanpublic JedisPoolConfig getRedisConfig(){JedisPoolConfig config = new JedisPoolConfig();return config;}@Beanpublic JedisPool getJedisPool(){JedisPoolConfig config = getRedisConfig();JedisPool pool = new JedisPool(config,hostName,port,timeout,password);log.info("init JedisPool...");return pool;}public String getHostName() {return hostName;}public void setHostName(String hostName) {this.hostName = hostName;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getTimeout() {return timeout;}public void setTimeout(int timeout) {this.timeout = timeout;}
}
加锁和解锁
package com.lock.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.util.Collections;
import java.util.UUID;/*** @author 作者 小书生008* @create 2018-09-20 16:06**/
@Slf4j
@Component
public class RedisLock {private final String LOCK_SUCCESS = "OK";private final String SET_IF_NOT_EXIST = "NX";private final String SET_WITH_EXPIRE_TIME = "PX";@Autowiredprivate JedisPool jedisPool;// 同时在redis上创建相同的一个key 相同key 名称private String redislockKey = "redis_lock";@SuppressWarnings("deprecation")public Jedis getResource(){return jedisPool.getResource();}public String getRedisLock(Long acquireTimeout, Long timeOut){Jedis jedis = null;try {//1.建立连接jedis = getResource();// 2.定义 redis 对应key 的value值( uuid) 作用 释放锁 随机生成valueString uuid = UUID.randomUUID().toString();//3.定义在获取锁后的超时时间int expireLock = (int)(timeOut / 1000);//4.定义在获取锁之前的超时时间,用于在超时时间内循环重试获取锁long endTime = System.currentTimeMillis() + acquireTimeout;while (System.currentTimeMillis() < endTime) {String result = jedis.set(redislockKey, uuid, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireLock);if (LOCK_SUCCESS.equals(result)) {log.info("获取锁..." + Thread.currentThread().getName() + ",identifierValue:" + uuid);return uuid;}log.info("未获取锁..." + Thread.currentThread().getName() + ",identifierValue:" + uuid);}} catch (Exception e) {e.printStackTrace();}finally {if (jedis != null){jedis.close();}}return null;}public void unRedisLock(String uuid){if (null == uuid){return;}final Long RELEASE_SUCCESS = 1L;Jedis jedis = null;try {//建立连接jedis = getResource();String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";Object eval = jedis.eval(script, Collections.singletonList(redislockKey), Collections.singletonList(uuid));if (RELEASE_SUCCESS.equals(eval)){log.info("释放锁..." + Thread.currentThread().getName() + ",identifierValue:" + uuid);}} catch (Exception e) {e.printStackTrace();} finally {if (null != jedis){jedis.close();}}}
}
直接复制就可以使用,亲测,(小弟初来乍到,如有问题,还请多多指点)