redisson应用之分布式对象

2023-11-18 09:53:37 浏览数 (1)

redisson的分布式对象应用

每个Redisson对象实例都会有一个与之对应的Redis数据实例,可以通过调用getName方法来取得Redis数据实例的名称(key)。

RMap map = redisson.getMap("mymap");

map.getName(); // = mymap

所有与Redis key相关的操作都归纳在RKeys这个接口里:

RKeys keys = redisson.getKeys();

Iterable allKeys = keys.getKeys();

Iterable foundedKeys = keys.getKeysByPattern('key*');

long numOfDeletedKeys = keys.delete("obj1", "obj2", "obj3");

long deletedKeysAmount = keys.deleteByPattern("test?");

String randomKey = keys.randomKey();

long keysAmount = keys.count();

1. 通用对象桶(Object Bucket)

Redisson的分布式RBucketJava对象是一种通用对象桶可以用来存放任类型的对象。

RBucket 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));

2. 二进制流(Binary Stream)

Redisson的分布式RBinaryStream Java对象同时提供了InputStream接口和OutputStream接口的实现。流的最大容量受Redis主节点的内存大小限制。

RBinaryStream stream = redisson.getBinaryStream("anyStream");

byte[] content = ...

stream.set(content);

InputStream is = stream.getInputStream();

byte[] readBuffer = new byte[512];

is.read(readBuffer);

OutputStream os = stream.getOuputStream();

byte[] contentToWrite = ...

os.write(contentToWrite);

3. 地理空间对象桶(Geospatial Bucket)

Redisson的分布式RGeoJava对象是一种专门用来储存与地理位置有关的对象桶。

RGeo geo = redisson.getGeo("test");

geo.add(new GeoEntry(13.361389, 38.115556, "Palermo"),

        new GeoEntry(15.087269, 37.502669, "Catania"));

geo.addAsync(37.618423, 55.751244, "Moscow");

Double distance = geo.dist("Palermo", "Catania", GeoUnit.METERS);

geo.hashAsync("Palermo", "Catania");

Map positions = geo.pos("test2", "Palermo", "test3", "Catania", "test1");

List cities = geo.radius(15, 37, 200, GeoUnit.KILOMETERS);

Map citiesWithPositions = geo.radiusWithPosition(15, 37, 200, GeoUnit.KILOMETERS);

4. BitSet

Redisson的分布式RBitSetJava对象采用了与java.util.BiteSet类似结构的设计风格。可以理解为它是一个分布式的可伸缩式位向量。需要注意的是RBitSet的大小受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. 原子整长形(AtomicLong)

Redisson的分布式整长形RAtomicLong对象和Java中的java.util.concurrent.atomic.AtomicLong对象类似。

RAtomicLong atomicLong = redisson.getAtomicLong("myAtomicLong");

atomicLong.set(3);

atomicLong.incrementAndGet();

atomicLong.get();

6. 原子双精度浮点数(AtomicDouble)

Redisson还提供了分布式原子双精度浮点数RAtomicDouble,弥补了Java自身的不足。

RAtomicDouble atomicDouble = redisson.getAtomicDouble("myAtomicDouble");

atomicDouble.set(2.81);

atomicDouble.addAndGet(4.11);

atomicDouble.get();

7. 话题(订阅分发)

Redisson的分布式话题RTopic对象实现了发布、订阅的机制。

RTopic topic = redisson.getTopic("anyTopic");

topic.addListener(new MessageListener() {

    @Override

    public void onMessage(String channel, SomeObject message) {

        //...

    }

});

// 在其他线程或JVM节点

RTopic topic = redisson.getTopic("anyTopic");

long clientsReceivedMessage = topic.publish(new SomeObject());

在Redis节点故障转移(主从切换)或断线重连以后,所有的话题监听器将自动完成话题的重新订阅。

7.1. 模糊话题

Redisson的模糊话题RPatternTopic对象可以通过正式表达式来订阅多个话题。

// 订阅所有满足`topic1.*`表达式的话题

RPatternTopic topic1 = redisson.getPatternTopic("topic1.*");

int listenerId = topic1.addListener(new PatternMessageListener() {

    @Override

    public void onMessage(String pattern, String channel, Message msg) {

         Assert.fail();

    }

});

在Redis节点故障转移(主从切换)或断线重连以后,所有的模糊话题监听器将自动完成话题的重新订阅。

8. 布隆过滤器(Bloom Filter)

Redisson利用Redis实现了Java分布式布隆过滤器(Bloom Filter)。

RBloomFilter bloomFilter = redisson.getBloomFilter("sample");

// 初始化布隆过滤器,预计统计元素数量为55000000,期望误差率为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"));

6.9. 基数估计算法(HyperLogLog)

Redisson利用Redis实现了Java分布式基数估计算法(HyperLogLog)对象。

RHyperLogLog log = redisson.getHyperLogLog("log");

log.add(1);

log.add(2);

log.add(3);

log.count();

wiki地址:https://github.com/redisson/redisson/wiki

0 人点赞