• Redisson—分布式对象


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

    1. RMap map = redisson.getMap("mymap");
    2. map.getName(); // = mymap

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

    1. RKeys keys = redisson.getKeys();
    2. Iterable<String> allKeys = keys.getKeys();
    3. Iterable<String> foundedKeys = keys.getKeysByPattern('key*');
    4. long numOfDeletedKeys = keys.delete("obj1", "obj2", "obj3");
    5. long deletedKeysAmount = keys.deleteByPattern("test?");
    6. String randomKey = keys.randomKey();
    7. long keysAmount = keys.count();

    6.1. 通用对象桶(Object Bucket)

    Redisson的分布式RBucketJava对象是一种通用对象桶可以用来存放任类型的对象。 除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. RBucket<AnyObject> bucket = redisson.getBucket("anyObject");
    2. bucket.set(new AnyObject(1));
    3. AnyObject obj = bucket.get();
    4. bucket.trySet(new AnyObject(3));
    5. bucket.compareAndSet(new AnyObject(4), new AnyObject(5));
    6. bucket.getAndSet(new AnyObject(6));

    还可以通过RBuckets接口实现批量操作多个RBucket对象:

    1. RBuckets buckets = redisson.getBuckets();
    2. List<RBucket<V>> foundBuckets = buckets.find("myBucket*");
    3. Map<String, V> loadedBuckets = buckets.get("myBucket1", "myBucket2", "myBucket3");
    4. Map<String, Object> map = new HashMap<>();
    5. map.put("myBucket1", new MyObject());
    6. map.put("myBucket2", new MyObject());
    7. // 利用Redis的事务特性,同时保存所有的通用对象桶,如果任意一个通用对象桶已经存在则放弃保存其他所有数据。
    8. buckets.trySet(map);
    9. // 同时保存全部通用对象桶。
    10. buckets.set(map);

    6.2. 二进制流(Binary Stream)

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

    1. RBinaryStream stream = redisson.getBinaryStream("anyStream");
    2. byte[] content = ...
    3. stream.set(content);
    4. InputStream is = stream.getInputStream();
    5. byte[] readBuffer = new byte[512];
    6. is.read(readBuffer);
    7. OutputStream os = stream.getOuputStream();
    8. byte[] contentToWrite = ...
    9. os.write(contentToWrite);

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

    Redisson的分布式RGeo Java对象是一种专门用来储存与地理位置有关的对象桶。除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. RGeo<String> geo = redisson.getGeo("test");
    2. geo.add(new GeoEntry(13.361389, 38.115556, "Palermo"),
    3. new GeoEntry(15.087269, 37.502669, "Catania"));
    4. geo.addAsync(37.618423, 55.751244, "Moscow");
    5. Double distance = geo.dist("Palermo", "Catania", GeoUnit.METERS);
    6. geo.hashAsync("Palermo", "Catania");
    7. Map<String, GeoPosition> positions = geo.pos("test2", "Palermo", "test3", "Catania", "test1");
    8. List<String> cities = geo.radius(15, 37, 200, GeoUnit.KILOMETERS);
    9. Map<String, GeoPosition> citiesWithPositions = geo.radiusWithPosition(15, 37, 200, GeoUnit.KILOMETERS);

    6.4. BitSet

    Redisson的分布式RBitSetJava对象采用了与java.util.BiteSet类似结构的设计风格。可以理解为它是一个分布式的可伸缩式位向量。需要注意的是RBitSet的大小受Redis限制,最大长度为4 294 967 295。除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. RBitSet set = redisson.getBitSet("simpleBitset");
    2. set.set(0, true);
    3. set.set(1812, false);
    4. set.clear(0);
    5. set.addAsync("e");
    6. set.xor("anotherBitset");

    6.4.1. BitSet数据分片(Sharding)(分布式RoaringBitMap)

    基于Redis的Redisson集群分布式BitSet通过RClusteredBitSet接口,为集群状态下的Redis环境提供了BitSet数据分片的功能。通过优化后更加有效的分布式RoaringBitMap算法,突破了原有的BitSet大小限制,达到了集群物理内存容量大小。在这里可以获取更多的内部信息。

    1. RClusteredBitSet set = redisson.getClusteredBitSet("simpleBitset");
    2. set.set(0, true);
    3. set.set(1812, false);
    4. set.clear(0);
    5. set.addAsync("e");
    6. set.xor("anotherBitset");

    该功能仅限于Redisson PRO版本。

    6.5. 原子整长形(AtomicLong)

    Redisson的分布式整长形RAtomicLong对象和Java中的java.util.concurrent.atomic.AtomicLong对象类似。除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. RAtomicLong atomicLong = redisson.getAtomicLong("myAtomicLong");
    2. atomicLong.set(3);
    3. atomicLong.incrementAndGet();
    4. atomicLong.get();

    6.6. 原子双精度浮点(AtomicDouble)

    Redisson还提供了分布式原子双精度浮点RAtomicDouble,弥补了Java自身的不足。除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. RAtomicDouble atomicDouble = redisson.getAtomicDouble("myAtomicDouble");
    2. atomicDouble.set(2.81);
    3. atomicDouble.addAndGet(4.11);
    4. atomicDouble.get();

    6.7. 话题(订阅分发)

    Redisson的分布式话题[RTopic](http://static.javadoc.io/org.redisson/redisson/3.10.0/org/redisson/api/RTopic.html对象实现了发布、订阅的机制。除了同步接口外,还提供了异步([Async](http://static.javadoc.io/org.redisson/redisson/3.10.0/org/redisson/api/RTopicAsync.html))、反射式([Reactive](http://static.javadoc.io/org.redisson/redisson/3.10.0/org/redisson/api/RTopicReactive.html))和[RxJava2](http://static.javadoc.io/org.redisson/redisson/3.10.0/org/redisson/api/RTopicRx.html)标准的接口。

    1. RTopic topic = redisson.getTopic("anyTopic");
    2. topic.addListener(SomeObject.class, new MessageListener<SomeObject>() {
    3. @Override
    4. public void onMessage(String channel, SomeObject message) {
    5. //...
    6. }
    7. });
    8. // 在其他线程或JVM节点
    9. RTopic topic = redisson.getTopic("anyTopic");
    10. long clientsReceivedMessage = topic.publish(new SomeObject());

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

    6.7.1. 模糊话题

    Redisson的模糊话题RPatternTopic对象可以通过正式表达式来订阅多个话题。除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. // 订阅所有满足`topic1.*`表达式的话题
    2. RPatternTopic topic1 = redisson.getPatternTopic("topic1.*");
    3. int listenerId = topic1.addListener(Message.class, new PatternMessageListener<Message>() {
    4. @Override
    5. public void onMessage(String pattern, String channel, Message msg) {
    6. Assert.fail();
    7. }
    8. });

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

    6.8. 布隆过滤器(Bloom Filter)

    Redisson利用Redis实现了Java分布式布隆过滤器(Bloom Filter)。所含最大比特数量为2^32。

    1. RBloomFilter<SomeObject> bloomFilter = redisson.getBloomFilter("sample");
    2. // 初始化布隆过滤器,预计统计元素数量为55000000,期望误差率为0.03
    3. bloomFilter.tryInit(55000000L, 0.03);
    4. bloomFilter.add(new SomeObject("field1Value", "field2Value"));
    5. bloomFilter.add(new SomeObject("field5Value", "field8Value"));
    6. bloomFilter.contains(new SomeObject("field1Value", "field8Value"));

    6.8.1. 布隆过滤器数据分片(Sharding)

    基于Redis的Redisson集群分布式布隆过滤器通过RClusteredBloomFilter接口,为集群状态下的Redis环境提供了布隆过滤器数据分片的功能。 通过优化后更加有效的算法,通过压缩未使用的比特位来释放集群内存空间。每个对象的状态都将被分布在整个集群中。所含最大比特数量为2^64。在这里可以获取更多的内部信息。

    1. RClusteredBloomFilter<SomeObject> bloomFilter = redisson.getClusteredBloomFilter("sample");
    2. // 采用以下参数创建布隆过滤器
    3. // expectedInsertions = 255000000
    4. // falseProbability = 0.03
    5. bloomFilter.tryInit(255000000L, 0.03);
    6. bloomFilter.add(new SomeObject("field1Value", "field2Value"));
    7. bloomFilter.add(new SomeObject("field5Value", "field8Value"));
    8. bloomFilter.contains(new SomeObject("field1Value", "field8Value"));

    该功能仅限于Redisson PRO版本。

    6.9. 基数估计算法(HyperLogLog)

    Redisson利用Redis实现了Java分布式基数估计算法(HyperLogLog)对象。该对象可以在有限的空间内通过概率算法统计大量的数据。除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. RHyperLogLog<Integer> log = redisson.getHyperLogLog("log");
    2. log.add(1);
    3. log.add(2);
    4. log.add(3);
    5. log.count();

    6.10. 整长型累加器(LongAdder)

    基于Redis的Redisson分布式整长型累加器(LongAdder)采用了与java.util.concurrent.atomic.LongAdder类似的接口。通过利用客户端内置的LongAdder对象,为分布式环境下递增和递减操作提供了很高得性能。据统计其性能最高比分布式AtomicLong对象快 12000 倍。完美适用于分布式统计计量场景。

    1. RLongAdder atomicLong = redisson.getLongAdder("myLongAdder");
    2. atomicLong.add(12);
    3. atomicLong.increment();
    4. atomicLong.decrement();
    5. atomicLong.sum();

    当不再使用整长型累加器对象的时候应该自行手动销毁,如果Redisson对象被关闭(shutdown)了,则不用手动销毁。

    1. RLongAdder atomicLong = ...
    2. atomicLong.destroy();

    6.11. 双精度浮点累加器(DoubleAdder)

    基于Redis的Redisson分布式双精度浮点累加器(DoubleAdder)采用了与java.util.concurrent.atomic.DoubleAdder类似的接口。通过利用客户端内置的DoubleAdder对象,为分布式环境下递增和递减操作提供了很高得性能。据统计其性能最高比分布式AtomicDouble对象快 12000 倍。完美适用于分布式统计计量场景。

    1. RLongDouble atomicDouble = redisson.getLongDouble("myLongDouble");
    2. atomicDouble.add(12);
    3. atomicDouble.increment();
    4. atomicDouble.decrement();
    5. atomicDouble.sum();

    当不再使用双精度浮点累加器对象的时候应该自行手动销毁,如果Redisson对象被关闭(shutdown)了,则不用手动销毁。

    1. RLongDouble atomicDouble = ...
    2. _b6d2063_
    3. atomicDouble.destroy();

    6.12. 限流器(RateLimiter)

    基于Redis的分布式限流器(RateLimiter)可以用来在分布式环境下现在请求方的调用频率。既适用于不同Redisson实例下的多线程限流,也适用于相同Redisson实例下的多线程限流。该算法不保证公平性。除了同步接口外,还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。

    1. RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
    2. // 初始化
    3. // 最大流速 =1秒钟产生10个令牌
    4. rateLimiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);
    5. CountDownLatch latch = new CountDownLatch(2);
    6. limiter.acquire(3);
    7. // ...
    8. Thread t = new Thread(() -> {
    9. limiter.acquire(2);
    10. // ...
    11. });

  • 相关阅读:
    看一眼就会马上收藏的宝藏设计网站
    自定义类型:结构体,枚举,联合的学习
    基于springboot+vue的在线音乐播放系统
    (ACM模式时)C++的输入输出需要注意的点
    编译锐尔科技A33开发板, openssl报错
    第一个select选择不同选项,给第二个select赋不同值
    62进制在短链接场景的妙用
    什么品牌的台灯适合学生用?适合学生党用的台灯推荐
    数据库: 存储过程
    初识设计模式 - 桥接模式
  • 原文地址:https://blog.csdn.net/leesinbad/article/details/133553253