版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50890032
Redis实现键对应多值
作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs
Redis服务器提供了很多流行的数据结构,比如Map、List、Set……
而在项目开发中,可能会遇到更复杂的需求,需要更复杂的数据结构,比如一个键对应存储多个值,要实现这样的需求,最好的办法就是实现Multimap数据结构。
首先需要自己构建这样的数据结构,如下:
Map<MyKey, Set<MyObject>> setMultimap = new HashMap<>();
void put(MyKey key, MyObject obj) {
Set<MyObject> list = setMultimap.get(key);
if (set == null) {
set = new HashSet<>();
setMultimap.put(key, obj);
}
set.add(obj);
}
void remove(MyObject obj) {
set<MyObject> set = setMultimap.get(key);
if (set != null) {
set.remove(obj);
}
}
要使得Redis支持此数据结构,还需做很多工作:创建Redis连接、执行Redis命令、在Redis的map键和Redis的list值之间建立单向关系等。
如果Redis的Java客户端驱动使用Redisson框架(不使用Jedis),那么实现以上工作非常简单。Redisson可以帮助开发者完成这些繁琐的工作,Redisson实现了标准的Java对象集合,包括:Map、List、Set、Lock…,还提供了Multimap对象。
http://redisson.org/
Redisson框架提供了两种Multimap对象:
- RListMultimap:基于List的Multimap,键绑定的值存储于List结构中。
- RSetMultimap:基于Set的Multimap,键绑定的值存储于Set结构中。
下面看看使用RSetMultimap的例子:
Config config = new Config();
config.useClusterServers()
// redis cluster nodes
.addNodeAddress("127.0.0.1:7000", "127.0.0.1:7001");
RedissonClient redisson = Redisson.create(config);
RSetMultimap<String, String> setMultimap = redisson.getSetMultimap("myFish");
// Adding items
setMultimap.put("favoriteFish", "Flagfin");
setMultimap.put("favoriteFish", "Shiner");
setMultimap.put("favoriteFish", "Ladyfish");
setMultimap.put("oceanFish", "Shark");
setMultimap.put("oceanFish", "Ocean sunfish");
// Removing item
setMultimap.remove("oceanFish", "Shark");
setMultimap.remove("favoriteFish", "Flagfin");
// Getting all items
Set<String> favoriteFish = setMultimap.get("favoriteFish");
// Getting size
// total entries amount
setMultimap.size(); // 5
// total values amount by key
setMultimap.get("favoriteFish").size(); // 3
// check entry existence
setMultimap.containsEntry("favoriteFish", "Ladyfish");
// and so on ...
值得注意的是,Redisson对象类型可以是任意类型,不局限于字符串。