前言:
在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 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 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中每个元素的寿命。
Redission中的Multimap对象在Java中实现Multimap集合。多重映射是可以多次存储同一个键的映射。
基于redisson集包括(RSetMultimap、RListMultimap)。下面的代码示例:
RListMultimap 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 allValues = map.get(new SimpleKey("0"));
Collection newValues = Arrays.asList(new SimpleValue("7"), new SimpleValue("6"), new SimpleValue("5"));
List oldValues = map.replaceValues(new SimpleKey("0"), newValues);
List removedValues = map.removeAll(new SimpleKey("0"));
redisson中的multimapcache对象提供对缓存收回的支持。与multipmap对象一样,它也包含rsetmultipmapcache和rlistmultipmapcache:
RSetMultimapCache 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);
RSet 实现Java java.util.Set ,下面的示例代码创建一个rset对象,然后添加和删除元素:
RSet set = redisson.getSet("anySet");
set.add(new SomeObject());
set.remove(new SomeObject());
如下面的示例代码所示,结合 Lock/ReadWriteLock/Semaphore/CountDownLatch 配合RSet进行使用:
RSet set = redisson.getSet("anySet");
MyObject value = new MyObject();
RLock lock = set.getLock(value);
lock.lock();
try {
// process value ...
} finally {
lock.unlock();
}
除了通用集之外,Redisson还为Redis提供了对具有重要功能的集的支持:
●数据分区:Redisson中的数据分区最大化了可用内存的使用。
●移除:允许您定义集合中每个元素的生存期
RList 实现Java java.util.List,与java集合的原始列表一样,Redission中的列表按插入的顺序保存元素。
下面的示例代码创建一个RList对象,然后添加和删除一个元素:
RList list = redisson.getList("anyList");
list.add(new SomeObject());
list.get(0);
list.remove(new SomeObject());
SortedSet 实现Java java.util.SortedSet , 它需要一个比较器Comparator 比较函数来排序元素并保持它们的唯一性。
下面的示例代码将创建一个RSortedSet对象和一个comparator函数,然后将几个元素及其分数一起插入:
RSortedSet 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);
redisson中的RScoredSortedSet接口用于按元素插入过程中定义的分数对元素进行排序。通过比较器Comparator比较保持元素的唯一性。
下面的示例代码创建一个RScoredSortedSet对象,并将几个元素及其分数插入其中:
RScoredSortedSet 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();
原文链接: https://dzone.com/articles/distributed-java-collections-in-redis-with-redisso