一.你需要准备
- spring-4.1.7.RELEASE.jar
- redisson-all-2.10.5.jar
在整合redisson之前,我们是在你的项目已经整合了redis的基础上进行的,关于spring整合redis,我们这里不再赘述;
二.整合redisson
2.1 Redisson配置类
import org.redisson.Redisson;
import org.redisson.config.Config;
/**
* @author: Milogenius
* @create: 2019-08-08 17:05
* @description: 配置Redisson
**/
public class RedissonManager {
private static Config config = new Config();
/**
* 声明Redisson对象
*/
private static Redisson redisson = null;
static{
config.useSingleServer().setAddress("redis://" + "127.0.0.1" + ":" + "6379").setPassword("milo");
redisson = (Redisson)Redisson.create(config);
}
/**
* 获取redisson对象的方法
* @return
*/
public static Redisson getRedisson(){
return redisson;
}
}
2.2 Redisson分布式锁工具类
import com.xwtech.olcs.base.redisson.RedissonManager;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;
/**
* @author: Milogenius
* @create: 2019-08-08 17:06
* @description: Redisson分布式锁
**/
public class DistributedRedisLock {
/**
* 从配置类中获取redisson对象
*/
private static Redisson redisson = RedissonManager.getRedisson();
/**
* 锁名称前缀[一般建议:锁名称前缀+service名称+方法名称,目的是为了防止重复]
*/
private static final String LOCK_TITLE = "redisLock_";
/**
* 加锁
* @param lockName 锁名称
* @return
*/
public static boolean acquire(String lockName){
//声明key对象
String key = LOCK_TITLE + lockName;
//获取锁对象
RLock mylock = redisson.getLock(key);
//加锁,并且设置锁过期时间,防止死锁的产生
mylock.lock(2, TimeUnit.MINUTES);
System.err.println("======lock======"+ Thread.currentThread().getName());
//加锁成功
return true;
}
/**
* 锁释放
* @param lockName 锁名称
*/
public static void release(String lockName){
//必须是和加锁时的同一个key
String key = LOCK_TITLE + lockName;
//获取所对象
RLock mylock = redisson.getLock(key);
//释放锁(解锁)
mylock.unlock();
System.err.println("======unlock======"+ Thread.currentThread().getName());
}
}
三.实战操作
3.1测试类
在测试类中,我们让线程休眠10s,模拟处理业务逻辑,我们在浏览器打开三个窗口,分别请求当前地址;
@Controller
@RequestMapping("test")
public class RedissonTest {
/**
* 日志
*/
private static final Logger logger = LoggerFactory.getLogger(RedissonTest.class);
@RequestMapping("redisson.do")
@ResponseBody
public String redissonTest(){
String key = "test123";
//加锁
DistributedRedisLock.acquire(key);
logger.info("进入方法");
try {
logger.info("当前线程名称:"+Thread.currentThread().getName());
//do something[等待10s]
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.info("方法结束");
//释放锁
DistributedRedisLock.release(key);
return "success";
}
}
3.2测试结果
通过日志可以发现,三次请求依次执行
说明:由于环境限制,我们本地无法测试分布式环境下的场景,需要大家自测;