redisson 是基于redis的擴(kuò)展庫,使得redis除了應(yīng)用于緩存以外,還能做隊(duì)列等數(shù)據(jù)結(jié)構(gòu),直接使用的分布式鎖,以及人物調(diào)度器等。
redisson支持異步API,為了演示方便我這里用同步API。這里初始化一個(gè)單機(jī)的redis連接
Config config = new Config();
config.useSingleServer().setPassword("redis123")
// use "rediss://" for SSL connection
.setAddress("redis://192.168.0.100:9736");
RedissonClient redisson = Redisson.create(config);
BitSet
BitSet是一個(gè)bit數(shù)據(jù)集,類似bit數(shù)組,和Set接口沒啥關(guān)系。對于存儲(chǔ)一些需要按位操作的數(shù)據(jù)是很理想的數(shù)據(jù)結(jié)構(gòu)。對應(yīng)于Java中 Java.util.BitSet
在redis中,初始化一個(gè)Bitset
RBitSet set = redisson.getBitSet("simpleBitset"); // 獲取
set.set(0, true); // 設(shè)置某一位
set.set(1812, false);
set.clear(0); // 清除
set.and("anotherBitset"); // 與操作,參數(shù)為另一個(gè)bitset的key值,
set.xor("anotherBitset"); // 異或操作
原子性整形和浮點(diǎn)
在分布式系統(tǒng)中,原子性的整形或者浮點(diǎn)的適用性很強(qiáng),redisson提供了直接的API來操作這類數(shù)據(jù)。也支持原子性的CAS操作。
RAtomicLong atomicLong = redisson.getAtomicLong("myAtomicLong");
atomicLong.set(3);
atomicLong.incrementAndGet();
atomicLong.compareAndSet(4, 2);
atomicLong.get();
RAtomicDouble atomicDouble =
redisson.getAtomicDouble("myAtomicDouble");
atomicDouble.set(2.81);
atomicDouble.addAndGet(4.11);
atomicDouble.get();
訂閱和發(fā)布消息
RTopic topic = redisson.getTopic("anyTopic");
topic.addListener(SomeObject.class, new MessageListener<SomeObject>() {
@Override
public void onMessage(String channel, SomeObject message) {
//...
}
});
// 在其他的進(jìn)程或者線程中
RTopic topic = redisson.getTopic("anyTopic");
long clientsReceivedMessage = topic.publish(new SomeObject());
LongAdder
這個(gè)類的功能類似于AtomicLong,但是LongAdder的高并發(fā)時(shí)性能會(huì)好很多,非常適合高并發(fā)時(shí)的計(jì)數(shù)。(DoubleAdder類似)
RLongAdder longAdder = redisson.getLongAdder("myLongAdder");
longAdder.add(12);
longAdder.increment();
longAdder.decrement();
longAdder.sum();
RateLimiter
這個(gè)類的目的在于實(shí)現(xiàn)一些速度限制實(shí)現(xiàn)。但是acquire會(huì)阻塞線程,而且不保證公平性。
RRateLimiter limiter = redisson.getRateLimiter("myLimiter");
limiter.trySetRate(RateType.OVERALL, 5, 2, RateIntervalUnit.SECONDS);
limiter.acquire(3);
Reliable Topic 可靠的消息訂閱發(fā)布
RIdGenerator Id生成器
這個(gè)Id生成器生成一般情況下遞增的整數(shù)值,效率比較高。
RIdGenerator generator = redisson.getIdGenerator("generator");
generator.tryInit(12000000, 20000);
for(int i = 0; i < 100; i++) {
long id = generator.nextId();
LOGGER.debug("id is {}", id);
}
參考文檔 redisson文檔