基于Redis的Redission分布式集合

原文链接: https://dzone.com/articles/distributed-java-collections-in-redis-with-redisso


前言:

         在Java中,集合是任何对象组的术语,这些对象被称为集合的元素。集合接口描述了如何实现特定类型集合的一般公式。Java中的集合的一些示例是:

● Map

● Set

● List

● SortedSet

● SortedMap

当使用多线程程序时,确保不同的线程不同时访问同一集合是很重要的。当这种情况发生时,可能会导致比赛条件、错误和其他意外行为。

为了解决这些问题,程序员使用Redisson和其他分布式框架。Redisson是一个Java框架,它在Redis服务器的内部提供分布式对象和服务。它允许多个线程同时访问redis中的同一集合。

Java使用Redission集合使用:

Redssion为Java提供了许多不同的分布式集合在Java中的实现。这些分布式集合可以跨多个线程共享,甚至可以在多个JVM中共享。

下面,我们将与Redisson讨论Redis中分布式集合的不同选项,以及使用每个集合的正确使用。

Map:

Redssion的Rmap 实现 java.util.concurrent.ConcurrentMap and java.util.Map ,映射是键-值对的集合,其中键不能重复。此实现按元素的插入顺序保留元素。以下是使用示例:

RMap<String, SomeObject> map = redisson.getMap("anyMap");
SomeObject prevObject = map.put("123", new SomeObject());
SomeObject currentObject = map.putIfAbsent("323", new SomeObject());
SomeObject obj = map.remove("123")

如下面的示例代码所示,您也可以使用 Lock/ReadWriteLock/Semaphore/CountDownLatch 结合RMap进行使用:

RMap<MyKey, MyValue> map = redisson.getMap("anyMap");
MyKey k = new MyKey();
RLock keyLock = map.getLock(k);
keyLock.lock();
try {
    MyValue v = map.get(k);
    // process value ...
} finally {
    keyLock.unlock();
}

除了通用Map之外,Redisson还支持基于Redis的Map,这些Map具有三个不同的重要功能:

●本地缓存:在多次读取Map时非常有用。

●数据分区:最大限度地利用可用内存。

●回收:允许您定义Map中每个元素的寿命。

Multimap:

Redission中的Multimap对象在Java中实现Multimap集合。多重映射是可以多次存储同一个键的映射。

基于redisson集包括(RSetMultimap、RListMultimap)。下面的代码示例:

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

redisson中的multimapcache对象提供对缓存收回的支持。与multipmap对象一样,它也包含rsetmultipmapcache和rlistmultipmapcache:


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

Set

RSet 实现Java java.util.Set ,下面的示例代码创建一个rset对象,然后添加和删除元素:


RSet<SomeObject> set = redisson.getSet("anySet");
set.add(new SomeObject());
set.remove(new SomeObject());

如下面的示例代码所示,结合 Lock/ReadWriteLock/Semaphore/CountDownLatch 配合RSet进行使用:


RSet<MyObject> set = redisson.getSet("anySet");
MyObject value = new MyObject();
RLock lock = set.getLock(value);
lock.lock();
try {
    // process value ...
} finally {
   lock.unlock();
}

除了通用集之外,Redisson还为Redis提供了对具有重要功能的集的支持:

●数据分区:Redisson中的数据分区最大化了可用内存的使用。

●移除:允许您定义集合中每个元素的生存期

List

RList 实现Java  java.util.List,与java集合的原始列表一样,Redission中的列表按插入的顺序保存元素。

下面的示例代码创建一个RList对象,然后添加和删除一个元素:

RList<SomeObject> list = redisson.getList("anyList");
list.add(new SomeObject());
list.get(0);
list.remove(new SomeObject());

SortedSet

SortedSet 实现Java  java.util.SortedSet , 它需要一个比较器Comparator 比较函数来排序元素并保持它们的唯一性。

下面的示例代码将创建一个RSortedSet对象和一个comparator函数,然后将几个元素及其分数一起插入:


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

ScoredSortedSet

redisson中的RScoredSortedSet接口用于按元素插入过程中定义的分数对元素进行排序。通过比较器Comparator比较保持元素的唯一性。

下面的示例代码创建一个RScoredSortedSet对象,并将几个元素及其分数插入其中:


RScoredSortedSet<SomeObject> set = redisson.getScoredSortedSet("simple");
set.add(0.13, new SomeObject(a, b));
set.addAsync(0.251, new SomeObject(c, d));
set.add(0.302, new SomeObject(g, d));
set.pollFirst();
set.pollLast();

猜你喜欢

转载自blog.csdn.net/u011663149/article/details/87875421