分布式对象
每一个Redisson对象绑定在以对象名为key的Redis中,能够通过 getName
方法获取。
RMap map = redisson.getMap("mymap");
map.getName(); // = mymap
所有对Redis keys的操作都包含在RKeys
接口中。
RKeys keys = redisson.getKeys();
Iterable<String> allKeys = keys.getKeys();
Iterable<String> foundedKeys = keys.getKeysByPattern('key*');
long numOfDeletedKeys = keys.delete("obj1", "obj2", "obj3");
long deletedKeysAmount = keys.deleteByPattern("test?");
String randomKey = keys.randomKey();
long keysAmount = keys.count();
5.1. 对象
Redisson 分布式 RBucket 对象是持有对所有任何对象的引用。
RBucket<AnyObject> bucket = redisson.getBucket("anyObject");
bucket.set(new AnyObject(1));
AnyObject obj = bucket.get();
bucket.trySet(new AnyObject(3));
bucket.compareAndSet(new AnyObject(4), new AnyObject(5));
bucket.getAndSet(new AnyObject(6));
5.2. 二级制集合
Redisson 分布式二进制集合是一个可伸缩的bits向量。二进制集合的大小受Redis最大数限制为4 294 967 295。
RBitSet set = redisson.getBitSet("simpleBitset");
set.set(0, true);
set.set(1812, false);
set.clear(0);
set.addAsync("e");
set.xor("anotherBitset");
5.3. 锁
Redisson 分布式可重入排他锁实现了 java.util.concurrent.locks.Lock
接口,同时支持TTL。
Redisson redisson = Redisson.create();
RLock lock = redisson.getLock("anyLock");
// Most familiar locking method
lock.lock();
// Lock time-to-live support
// releases lock automatically after 10 seconds
// if unlock method not invoked
lock.lock(10, TimeUnit.SECONDS);
// Wait for 100 seconds and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();
5.4. 多个锁
Redisson 多个锁对象组将多个RLock对象合并,将他们作为一个锁进行处理。每一个RLock对象可能属于不同的Redisson实例。
RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
lock.lock();
5.5. 读写锁
Redisson 分布式可重入读写锁实现了java.util.concurrent.locks.ReadWriteLock
接口,同时支持TTL。可以包含多个读锁的拥有者,但只能包含一个写锁。
RReadWriteLock rwlock = redisson.getLock("anyRWLock");
// Most familiar locking method
rwlock.readLock().lock();
// or
rwlock.writeLock().lock();
// Lock time-to-live support
// releases lock automatically after 10 seconds
// if unlock method not invoked
rwlock.readLock().lock(10, TimeUnit.SECONDS);
// or
rwlock.writeLock().lock(10, TimeUnit.SECONDS);
// Wait for 100 seconds and automatically unlock it after 10 seconds
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
// or
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();
5.6. 信号量
Redisson 分布式信号量对象和java.util.concurrent.Semaphore
实例拥有相同的结构。
RSemaphore semaphore = redisson.getSemaphore("semaphore");
semaphore.acquire();
semaphore.acquire(23);
semaphore.tryAcquire();
semaphore.tryAcquire(23, TimeUnit.SECONDS);
semaphore.release(10);
semaphore.release();
5.7. 原子性长整形
Redisson 分布式长整形对象与 java.util.concurrent.atomic.AtomicLong
实例拥有相同的结构。
RAtomicLong atomicLong = redisson.getAtomicLong("myAtomicLong");
atomicLong.set(3);
atomicLong.incrementAndGet();
atomicLong.get();
5.8. 原子性浮点数
Redisson 分布式原子性浮点数对象。
RAtomicDouble atomicDouble = redisson.getAtomicDouble("myAtomicDouble");
atomicDouble.set(2.81);
atomicDouble.addAndGet(4.11);
atomicDouble.get();
5.9. 倒计时锁存
Redisson 分布式倒计时锁存对象拥有与java.util.concurrent.CountDownLatch
实例相同的结构。
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.trySetCount(1);
latch.await();
// in other thread or other JVM
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.countDown();
5.10. 话题
Redisson 分布式话题对象实现了发布 / 订阅的机制。
RTopic<SomeObject> topic = redisson.getTopic("anyTopic");
topic.addListener(new MessageListener<SomeObject>() {
@Override
public void onMessage(String channel, SomeObject message) {
//...
}
});
// in other thread or JVM
RTopic<SomeObject> topic = redisson.getTopic("anyTopic");
long clientsReceivedMessage = topic.publish(new SomeObject());
话题监听器会重新订阅,当任何的redis连接重连或者是redis服务故障恢复之后。
5.10.1. 话题模式
Redisson 话题模式对象订阅与多个话题通过指定的模式。
// subscribe to all topics by `topic1.*` pattern
RPatternTopic<Message> topic1 = redisson.getPatternTopic("topic1.*");
int listenerId = topic1.addListener(new PatternMessageListener<Message>() {
@Override
public void onMessage(String pattern, String channel, Message msg) {
Assert.fail();
}
});
话题模式监听器会重新订阅,当任何的redis连接重连或者是redis服务故障恢复之后。
5.11. 布隆过滤器
Redisson 分布式布隆过滤器。
RBloomFilter<SomeObject> bloomFilter = redisson.getBloomFilter("sample");
// initialize bloom filter with
// expectedInsertions = 55000000
// falseProbability = 0.03
bloomFilter.tryInit(55000000L, 0.03);
bloomFilter.add(new SomeObject("field1Value", "field2Value"));
bloomFilter.add(new SomeObject("field5Value", "field8Value"));
bloomFilter.contains(new SomeObject("field1Value", "field8Value"));
5.12. 超级日志
Redisson 分布式超级日志。
RHyperLogLog<Integer> log = redisson.getHyperLogLog("log");
log.add(1);
log.add(2);
log.add(3);
log.count();
5.13. 远程服务
Redisson 分布式远程服务允许执行对象的方法通过在不同Redisson对象上的远程接口。可以正确处理使用POJO的对象,方法参数和结果对象。
远程服务提供了两种不同类型的RRemoteService实例:
- 服务端实例执行远程的方法 (工作者接口)。 示例: ```java RRemoteService remoteService = redisson.getRemoteService(); SomeServiceImpl someServiceImpl = new SomeServiceImpl();
// register remote service before any remote invocation // can handle only 1 invocation concurrently remoteService.register(SomeServiceInterface.class, someServiceImpl);
// register remote service able to handle up to 12 invocations concurrently remoteService.register(SomeServiceInterface.class, someServiceImpl, 12);
* 客户端实例,调用远程对象。 示例:
```java
RRemoteService remoteService = redisson.getRemoteService();
SomeServiceInterface service = remoteService.get(SomeServiceInterface.class);
String result = service.doSomeStuff(1L, "secondParam", new AnyParam());
客户端和服务器两端的实例应该包含相同的远程接口,同时需要使用相同的服务器连接配置进行redisson实例的备份。对客户端或者是远程的实例数目没有上线约束。 (注意: 然后redisson不强制任何的限制, redis的约束仍然适用.)
远程的调用能够被以并行的方式执行。并行执行的总数目是通过如下的计算方法得出的:(可以使用执行器的总和) = (服务端的实例数目)*(在服务注册时定义的执行器数目)
命令超过这个数目将会排队进行下一个可用的执行器。