面试官问我,除了Jedis还知道什么操作Redis的Java 客户端开发包,我就见过Lettuce和Jedis两个,而且我还没想起来Lettuce这个单词……然后,面试凉凉。那今天就来学习一下,第三个常见的强大的Java 客户端开发包Redisson。
一、Redisson介绍
https://github.com/redisson/redisson/ Redisson的项目主页已经对Redisson做了详细的介绍,这里就不用过多的赘述了。简单的来说就是,Redisson是一个强大的Java 客户端开发包,相比之下其他客户端提供的功能还仅仅停留在作为数据库驱动,而Redisson将原生的Redis Hash,List,Set,String,Geo,HyperLogLog等数据结构封装为Java里大家最熟悉的映射(Map),列表(List),集(Set),通用对象桶(Object Bucket),地理空间对象桶(Geospatial Bucket),基数估计算法(HyperLogLog)等结构,在这基础上还提供了分布式的多值映射(Multimap),本地缓存映射(LocalCachedMap),有序集(SortedSet),计分排序集(ScoredSortedSet),字典排序集(LexSortedSet),列队(Queue),阻塞队列(Blocking Queue),有界阻塞列队(Bounded Blocking Queue),双端队列(Deque),阻塞双端列队(Blocking Deque),阻塞公平列队(Blocking Fair Queue),延迟列队(Delayed Queue),布隆过滤器(Bloom Filter),原子整长形(AtomicLong),原子双精度浮点数(AtomicDouble),BitSet等Redis原本没有的分布式数据结构。不仅如此,Redisson还实现了Redis文档中提到像分布式锁Lock这样的更高阶应用场景。事实上Redisson并没有不止步于此,在分布式锁的基础上还提供了联锁(MultiLock),读写锁(ReadWriteLock),公平锁(Fair Lock),红锁(RedLock),信号量(Semaphore),可过期性信号量(PermitExpirableSemaphore)和闭锁(CountDownLatch)这些实际当中对多线程高并发应用至关重要的基本部件。
二、Redisson整合SpringBoot
1、导包
org.redisson
redisson-spring-boot-starter
3.13.4
org.springframework.boot
spring-boot-starter-data-redis
2、配置
在Resouces下创建Redisson-config.yml配置文件。
singleServerConfig:idleConnectionTimeout:10000connectTimeout:10000timeout:3000retryAttempts:3retryInterval:1500password:subscriptionsPerConnection:5clientName:nulladdress:"redis://192.168.56.254:6379"subscriptionConnectionMinimumIdleSize:1subscriptionConnectionPoolSize:50connectionMinimumIdleSize:32connectionPoolSize:64database:0dnsMonitoringInterval:5000threads:0nettyThreads:0codec:class:org.redisson.codec.JsonJacksonCodectransportMode:"NIO"
Bean方式加载配置文件。
@Configuration
public class RedissonConfiguration {
@Bean
public RedissonClient redisson() throws IOException {
File file = ResourceUtils.getFile("classpath:redisson-config.yml");
Config config = Config.fromYAML(file);
return Redisson.create(config);
}
}
3、使用
@SpringBootTest
class RedissonApplicationTests {
@Autowired
private RedissonClient redissonClient;
@Autowired
private RedisTemplate redisTemplate;
@Test
void testSet() {
//序列化正常,存储正常
Person person = new Person();
person.setId("001");
person.setName("Tom");
redissonClient.getBucket("test").set(person);
}
@Test
void testGet() {
//反序列化正常,取值正常
RBucket bucket = redissonClient.getBucket("test");
Person person = bucket.get();
System.out.println(person.getId() + " " + person.getName());
}
@Test
void testTemplate() {
//redisTemplate正常使用
redisTemplate.opsForValue().set("testTemplate", "testTemplate");
System.out.println(redisTemplate.opsForValue().get("testTemplate"));
}
@Test
void testLock(){
//分布式锁
RLock lock = redissonClient.getLock("testLock");
try {
lock.lock();
// TODO: 2020/9/27
}finally {
lock.unlock();
}
}
}
三、总结
Redisson是一个非常强大好用的Java操作Redis客户端,他为我们封装了很多基于Redis的功能实现,使得开发者不用过多的关注Redis而专注于业务的开发。以上只是初步介绍了Redisson如何使用,如果需要深入了解还需参考官方文档进行开发。