Redisson库对Redis数据类型以及常用的数据增删改查操作做了封装,这里我们简单介绍一下其中比较常用的内容。
Redisson库对键的操作都位于RKeys
接口中。
RKeys rKeys = client.getKeys();
// 匹配查询Key
Iterable<String> keys = rKeys.getKeysByPattern("stu*");
// 删除Key
rKeys.delete("student");
Redisson提供了RBucket
接口,它可以存储任何可序列化的Java对象,对象会以初始化配置中指定的序列化方式存储到Redis中。
// 获取对象桶
RBucket<Student> bucket = client.getBucket("student");
// 存储数据到桶
bucket.set(student);
bucket.expire(Duration.ofSeconds(3));
// 从桶中获取数据
Student s = bucket.get();
// 删除桶
bucket.delete();
上面代码中,我们存储数据时还指定了一个expire
过期时间,该方法接收Duration
对象作为参数,我们这里指定了3秒的过期时间。
RMap
是一个分布式的集合,它实现了java.util.concurrent.ConcurrentMap
和java.util.Map
接口。类似RBucket
,RMap
也能以指定泛型参数的方式存储任何可序列化的Java对象,在Redis中RMap
会以Hash类型存储。
// 获取RMap
RMap<String, Student> map = client.getMap("studentMap");
// 存入数据到RMap
map.put("s1", student1);
map.put("s2", student2);
map.expire(Duration.ofSeconds(3));
// 从RMap中获取数据
Student s = map.get("s1");
// 从RMap中删除数据
map.remove("s1");
// 删除RMap
map.delete();
这里注意不要弄错RMap
和RBucket
的使用场景,RMap
每一次操作键值对都会访问Redis服务器,如果我们只是存取一个完整的对象,不要用RMap
而应该使用RBucket
。
RTopic
接口封装了Redis的订阅发布功能。
// 获取RTopic
RTopic topic = client.getTopic("topic");
// 设置RTopic监听
topic.addListener(String.class, (charSequence, s) -> {
// 收到消息
System.out.println(s);
});
上面代码我们获取了一个话题,并进行了监听。addListener
方法的第二个参数接收MessageListener
对象,其回调方法为public void onMessage(String channel, SomeObject message)
。
// 获取RTopic
RTopic topic = client.getTopic("topic");
// 发布消息
topic.publish("你好");
在另一个线程或分布式实例中,我们获取话题,并发布了一条信息。
RAtomicLong
是一个支持分布式的原子长整数,采用锁的方式读写存储在Redis中的值。
RAtomicLong atomicLong = client.getAtomicLong("cnt");
// 设置值
atomicLong.set(100);
// 获取值
long value = atomicLong.get();
// 删除值
atomicLong.delete();
RLongAdder
是一个支持分布式的累加器,如果是累加操作其并发性能比直接使用RAtomicLong
强得多。但要注意RLongAdder
底层实现和RAtomicLong
不同,它并没有在Redis中实际存储数据。如果一个持有累加器的RedissonClient
销毁或退出,它累加的值也会失去。
// 获取RLongAdder
RLongAdder longAdder = client.getLongAdder("cnt");
// 累加器增加100
longAdder.add(100);
// 累加器增加1
longAdder.increment();
// 读取累加器当前值
long l = longAdder.sum();
Redisson实现了分布式限流器RRateLimiter
。限流器会按照指定的时间间隔发放允许调用一段代码的“许可”,分布式程序会尝试获取“许可”,如果尝试获取“许可”失败,则代表已触发限流,这样就能实现流量控制了。
// 获取限流器
RRateLimiter rateLimiter = client.getRateLimiter("rateLimiter");
// 设置限流器每5秒产生1个许可
rateLimiter.setRate(RateType.OVERALL, 1, 5, RateIntervalUnit.SECONDS);
// 试图获取许可(阻塞方式)
rateLimiter.acquire();
// 试图获取许可(非阻塞方式)
boolean result = rateLimiter.tryAcquire();
上面代码中,我们设置了限流器每5秒产生1个许可,获取许可时可以采用阻塞和非阻塞的方式,阻塞方式会在获取到许可前阻塞当前线程;非阻塞方式能够根据当前是否成功获取令牌返回true
或false
。此外,acquire()
和tryAcquire()
方法都支持一个长整型参数,表示需要获取的许可数量。