分布式集合

Map

Redisson 分布式的 Map 对象,实现了
java.util.Map 接口。
Map 的大小由 Redis 限制为 4 294 967 295

版本的 Map 对象
在集群模式中支持 数据分区

Redisson 分布式的 Map 可通过独立的 MapCache 对象支持 eviction。
它也实现了 java.util.concurrent.ConcurrentMap
java.util.Map 接口。
Redisson 有一个基于 Map 和 MapCache 对象的
Spring Cache 集成

当前 Redis 实现中没有 map 项的 eviction 功能。
因此,过期的项由 org.redisson.EvictionScheduler 来清理。
它一次可移除 100 条过期项。
任务的调度时间会根据上次任务中删除的过期项数量自动调整,时间在 1 秒到 2 个小时内。
因此若清理任务每次删除了 100 项数据,它将每秒钟执行一次(最小的执行延迟)。
但如果当前过期项数量比前一次少,则执行延迟将扩大为 1.5 倍。

  1. RMapCache<String, SomeObject> map = redisson.getMapCache("anyMap");
  2. // ttl = 10 minutes,
  3. map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES);
  4. // ttl = 10 minutes, maxIdleTime = 10 seconds
  5. map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES, 10, TimeUnit.SECONDS);
  6. // ttl = 3 seconds
  7. map.putIfAbsent("key2", new SomeObject(), 3, TimeUnit.SECONDS);
  8. // ttl = 40 seconds, maxIdleTime = 10 seconds
  9. map.putIfAbsent("key2", new SomeObject(), 40, TimeUnit.SECONDS, 10, TimeUnit.SECONDS);

MultiMap

Redisson 分布式的 MultiMap 对象允许给每个键绑定多个值。
键的数量限制由 Redis 限制为 4 294 967 295

基于 Set 的 MultiMap 不允许每个键中的值有重复。

  1. RSetMultimap<SimpleKey, SimpleValue> map = redisson.getSetMultimap("myMultimap");
  2. map.put(new SimpleKey("0"), new SimpleValue("1"));
  3. map.put(new SimpleKey("0"), new SimpleValue("2"));
  4. map.put(new SimpleKey("3"), new SimpleValue("4"));
  5. Set<SimpleValue> allValues = map.get(new SimpleKey("0"));
  6. List<SimpleValue> newValues = Arrays.asList(new SimpleValue("7"), new SimpleValue("6"), new SimpleValue("5"));
  7. Set<SimpleValue> oldValues = map.replaceValues(new SimpleKey("0"), newValues);

基于 List 的 MultiMap 会存储插入的顺序且允许键对应的值中存在重复。

  1. RListMultimap<SimpleKey, SimpleValue> map = redisson.getListMultimap("test1");
  2. map.put(new SimpleKey("0"), new SimpleValue("1"));
  3. map.put(new SimpleKey("0"), new SimpleValue("2"));
  4. map.put(new SimpleKey("0"), new SimpleValue("1"));
  5. map.put(new SimpleKey("3"), new SimpleValue("4"));
  6. List<SimpleValue> allValues = map.get(new SimpleKey("0"));
  7. Collection<SimpleValue> newValues = Arrays.asList(new SimpleValue("7"), new SimpleValue("6"), new SimpleValue("5"));
  8. List<SimpleValue> oldValues = map.replaceValues(new SimpleKey("0"), newValues);
  9. List<SimpleValue> removedValues = map.removeAll(new SimpleKey("0"));

Multimap 对象可通过独立的 MultimapCache 对象来支持 eviction。
它对基于 Set 和 List 的 MultiMap 分别有 RSetMultimapCacheRListMultimapCache 对象。

RSetMultimapCache 示例:

  1. RSetMultimapCache<String, String> multimap = redisson.getSetMultimapCache("myMultimap");
  2. map.put("1", "a");
  3. map.put("1", "b");
  4. map.put("1", "c");
  5. map.put("2", "e");
  6. map.put("2", "f");
  7. map.expireKey("2", 10, TimeUnit.MINUTES);

Set

Redisson 分布式的 Set 对象,实现了 java.util.Set 接口。
它通过元素状态比较来保持元素的独立性。
Set 大小由 Redis 限制为 4 294 967 295

Redisson PRO 版本的 Set 对象
在集群模式中支持 。

Redisson 分布式的 Set 对象可通过独立的 SetCache 对象来支持 eviction。
它也实现了 java.util.Set 接口。

当前 Redis 实现中没有 set 值的 eviction 功能。
因此,过期的项由 org.redisson.EvictionScheduler 来清理。
它一次可移除 100 条过期项。
任务的调度时间会根据上次任务中删除的过期项数量自动调整,时间在 1 秒到 2 个小时内。
因此若清理任务每次删除了 100 项数据,它将每秒钟执行一次(最小的执行延迟)。
但如果当前过期项数量比前一次少,则执行延迟将扩大为 1.5 倍。

  1. RSetCache<SomeObject> set = redisson.getSetCache("anySet");
  2. // ttl = 10 seconds
  3. set.add(new SomeObject(), 10, TimeUnit.SECONDS);

Redisson 分布式的 SortedSet 对象,实现了 java.util.SortedSet 接口。
它通过比较器来排列元素并保持唯一性。

  1. RSortedSet<Integer> set = redisson.getSortedSet("anySet");
  2. set.trySetComparator(new MyComparator()); // set object comparator
  3. set.add(3);
  4. set.add(1);
  5. set.add(2);
  6. set.removeAsync(0);
  7. set.addAsync(5);

ScoredSortedSet

Redisson 分布式的 ScoredSortedSet 对象。
它通过在元素插入时定义的分数来排列元素,
通过元素状态的比较来保持元素的唯一性。

  1. RScoredSortedSet<SomeObject> set = redisson.getScoredSortedSet("simple");
  2. set.add(0.13, new SomeObject(a, b));
  3. set.add(0.302, new SomeObject(g, d));
  4. set.pollFirst();
  5. set.pollLast();
  6. int index = set.rank(new SomeObject(g, d)); // get element index
  7. Double score = set.getScore(new SomeObject(g, d)); // get element score

LexSortedSet

  1. RLexSortedSet set = redisson.getLexSortedSet("simple");
  2. set.add("d");
  3. set.addAsync("e");
  4. set.add("f");
  5. set.lexRangeTail("d", false);
  6. set.lexCountHead("e");
  7. set.lexRange("d", true, "z", false);

List

Redisson 分布式的 List 对象,实现了 java.util.List 接口。
它保留元素的插入顺序。
List 大小由 Redis 限制为 4 294 967 295

Redisson 分布式的 Queue 对象,实现了 java.util.Queue 接口。
Queue 大小由 Redis 限制为 4 294 967 295

  1. RQueue<SomeObject> queue = redisson.getQueue("anyQueue");
  2. queue.add(new SomeObject());
  3. SomeObject obj = queue.peek();
  4. SomeObject someObj = queue.poll();

Deque

Redisson 分布式的 Deque 对象,实现了 java.util.Deque 接口。
Deque 大小由 Redis 限制为 4 294 967 295

  1. RDeque<SomeObject> queue = redisson.getDeque("anyDeque");
  2. queue.addFirst(new SomeObject());
  3. queue.addLast(new SomeObject());
  4. SomeObject obj = queue.removeFirst();
  5. SomeObject someObj = queue.removeLast();

BlockingQueue

Redisson 分布式的 BlockingQueue 对象,实现了 java.util.concurrent.BlockingQueue 接口。
BlockingQueue 大小由 Redis 限制为 4 294 967 295

  1. RBlockingQueue<SomeObject> queue = redisson.getBlockingQueue("anyQueue");
  2. queue.offer(new SomeObject());
  3. SomeObject obj = queue.peek();
  4. SomeObject someObj = queue.poll();
  5. SomeObject ob = queue.poll(10, TimeUnit.MINUTES);

pollpollFromAnypollLastAndOfferFirstTotake 方法
在重连到 Redis 服务器或 Redis 服务器故障恢复时会自动被重新订阅。

BlockingDeque

Redisson 分布式的 BlockingDeque 对象,实现了 java.util.concurrent.BlockingDeque 接口。
BlockingDeque 大小由 Redis 限制为 4 294 967 295

  1. RBlockingDeque<Integer> deque = redisson.getBlockingDeque("anyDeque");
  2. deque.putFirst(1);
  3. deque.putLast(2);
  4. Integer firstValue = queue.takeFirst();
  5. Integer lastValue = queue.takeLast();
  6. Integer lastValue = queue.pollLast(3, TimeUnit.MINUTES);

pollpollFromAny、 和 take 方法
在重连到 Redis 服务器或 Redis 服务器故障恢复时会自动被重新订阅。