文章目录
java
package com.xd.cubemall.product.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRedissonConfig {
/**
* 注册RedissonClient对象
*/
@Bean(destroyMethod="shutdown")
RedissonClient redissonClient(){
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
使用Redisson演示可重入锁
java
/**
* 使用Redisson演示可重入锁
* @return
*/
@ResponseBody
@GetMapping("/hello")
public String hello(){
//获取一把锁
RLock lock = redissonClient.getLock("my-lock");
//加锁
lock.lock();
try{
System.out.println("加锁成功,执行业务。。。" + Thread.currentThread().getId());
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
} finally {
//解锁
System.out.println("解锁。。。" + Thread.currentThread().getId());
lock.unlock();
}
return "hello";
}
读写锁
java
@GetMapping("/write")
@ResponseBody
public String writeValue(){
//获取一把锁
RReadWriteLock lock = redissonClient.getReadWriteLock("rw-lock");
// 加 写锁
String s = "";
RLock writeLock = lock.writeLock();
try{
//1.改数据加 写锁,读数据加 读锁
writeLock.lock();
System.out.println("写锁加锁成功..." + Thread.currentThread().getId());
s = UUID.randomUUID().toString();
Thread.sleep(15000);
redisTemplate.opsForValue().set("writeValue",s);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放锁
writeLock.unlock();
System.out.println("写锁。。释放。。"+Thread.currentThread().getId());
}
return s;
}
@GetMapping("/read")
@ResponseBody
public String readValue(){
RReadWriteLock lock = redissonClient.getReadWriteLock("rw-lock");
String s = "";
//加 读锁
RLock readLock = lock.readLock();
readLock.lock();
try {
System.out.println("读锁...加锁成功..."+Thread.currentThread().getId());
s = redisTemplate.opsForValue().get("writeValue");
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
System.out.println("读锁。。释放。。。"+Thread.currentThread().getId());
}
return s;
}
信号量
java
@GetMapping("/park")
@ResponseBody
public String park() throws InterruptedException {
RSemaphore semaphore = redissonClient.getSemaphore("park");
//当车位减少为0时,还想获取车位,必须要等go()调用时,释放一个车位,才能进行执行
semaphore.acquire();//占有一个车位
return "ok";
}
@GetMapping("/go")
@ResponseBody
public String go() {
RSemaphore semaphore = redissonClient.getSemaphore("park");
semaphore.release();
return "ok";
}
闭锁
java
@ResponseBody
@GetMapping("/lockDoor")
public String lockDoor() throws InterruptedException {
RCountDownLatch door = redissonClient.getCountDownLatch("door");
door.trySetCount(5);
door.await();//等待其他闭锁都完成
return "关门了";
}
@ResponseBody
@GetMapping("/gogogo/{id}")
public String gogogo(@PathVariable("id") Long id) {
RCountDownLatch door = redissonClient.getCountDownLatch("door");
door.countDown();//计数-1
return id + "桌的人都走了。。。";
}
获取三级分类redisson分布式锁
java
@Autowired
private RedissonClient redissonClient;
/**
* 获取三级分类(redisson分布式锁)
* @return
*/
public List<CategoryVo> getCategoryJsonFromWithRedissonLock() {
String uuid = UUID.randomUUID().toString();
//1.占分布式
RLock lock = redissonClient.getLock("CategoryJson-lock");
lock.lock();
List<CategoryVo> dataFromDb = null;
try {
dataFromDb = getDataFromDb();
} finally {
lock.unlock();
}
return dataFromDb;
}