01 搭建redis服务
我是在自己的云服务通过docker搭建了一个单机的redis服务
docker run -d --rm --name redis5 -p 6379:6379 redis --requirepass "123456"
02 创建应用
1.在pom.xml文件导入redisson依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.11.5</version>
</dependency>
2.配置连接redis的信息
我们有两种方式配置连接redis,其它配置方式参考官方文档
第1种,通过application.properties
文件去配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
第2种,通过@bean
的方式配置
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;
/**
* @author 594781919@qq.com
* @date 2019-11-26
**/
@Configuration
public class RedissonConfig {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379")
.setPassword("123456");
return Redisson.create(config);
}
}
03 现在我们就可以使用redisson客户端
1.缓存数据
下面我们主要测试了redis的两种数据结构,分别是string
和list
,其它数据结构的使用方式类似。大家可以参考官方文档
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedissonTest {
@Resource
private RedissonClient redissonClient;
@Test
public void testBucket() {
RBucket<Object> bucket = redissonClient.getBucket("name", StringCodec.INSTANCE);
Object o = bucket.get();
System.out.println(o);
}
@Test
public void testList() {
RList<String> interests = redissonClient.getList("interests");
interests.add("篮球");
interests.add("爬山");
interests.add("编程");
}
}
2.分布式锁
官方文档提供了很全的使用方式。
下面我就以简单的分布式锁的使用作为测试。
代码还是很简单,第1步,获取锁;第2步,加锁;第3步,释放锁。
测试时,我们可以起一个服务,然后同时访问"/lock1"和"/lock2"或者起两个服务,一个服务访问"/lock1",另一个服务访问"/lock2"。
通过控制台的打印我们就能发现分布式锁达到我们想要的效果。
@Resource
private RedissonClient redissonClient;
@GetMapping("/lock1")
public String lock1() {
// 1.获取分布式锁
RLock lock = redissonClient.getLock("my:lock");
// 2.进行加锁操作
lock.lock();
System.out.println(LocalDateTime.now() + " lock1 locked");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
Thread.currentThread().interrupt();
}
// 3.释放锁资源
lock.unlock();
System.out.println(LocalDateTime.now() + "lock1 unlocked");
return "lock1";
}
@GetMapping("/lock2")
public String lock2() {
RLock lock = redissonClient.getLock("my:lock");
lock.lock();
System.out.println(LocalDateTime.now() + " lock2 locked");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
lock.unlock();
System.out.println(LocalDateTime.now() + " lock2 unlocked");
return "lock2";
}
03 总结
Redisson底层采用的是Netty 框架,支持异步的操作方式。
API很全,对redis的操作基本都能满足我们的开发需求。