Java Multimaps With Redis
Redis server provides many popular data structures like map, list, set... In practice, however, you may face more complicated requirements, such as storing several values per key, for example. The best practice for that would be implementing the Multimap.
Join the DZone community and get the full member experience.
Join For FreeRedis server provides many popular data structures like map, list, set...
In practice, however, you as Java developer may face more complicated requirements, such as storing several values per key, for example. The best practice for that would be implementing the Redis based Multimap on Java.
You may need to spend some time to code such structure by yourself. Java code may look like this:
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);
}
}
Getting this to work on top of Redis requires much more extra work: create Redis connection, execute Redis command, establish one-way relation between Redis map key and Redis list name, and so on ...
Or no work at all if you are using the Redisson - Redis based In-Memory Data Grid for Java. It takes care of all the tedious jobs for you. With implementation of a set of standard Java objects: Map, List, Set, Lock ... backed by Redis, it offers Multimap object too.
There are two flavors of Multimap objects available:
RListMultimap - List based multimap, values bounded to key stored in List structure.
RSetMultimap - Set-based multimap, values bounded to key stored in Set structure.
Let's take a look at the following Java code of using the Redis based RSetMultimap object:
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 ...
It's important to note that in Redisson object type can be any Java type, not limited to only String.
Opinions expressed by DZone contributors are their own.
Comments