package twitter.streaming.trident; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import redis.clients.jedis.Jedis; import storm.trident.state.State; import storm.trident.state.StateFactory; import storm.trident.state.map.CachedMap; import storm.trident.state.map.IBackingMap; import storm.trident.state.map.MapState; import storm.trident.state.map.NonTransactionalMap; import storm.trident.state.map.SnapshottableMap; import backtype.storm.tuple.Values; public class RedisState implements IBackingMap<Long> { Jedis jedis = new Jedis("localhost"); public static class Factory implements StateFactory { @Override public State makeState(Map conf, int partitionIndex, int numPartitions) { CachedMap c = new CachedMap(new RedisState(), 1000); MapState ms = NonTransactionalMap.build(c); return new SnapshottableMap(ms, new Values("")); } } @Override public List<Long> multiGet(List<List<Object>> keys) { if(keys.size() == 0) return new ArrayList<Long>(); String[] skeys = new String[keys.size()]; int i = 0; for (List<Object> key : keys) { skeys[i++] = (String) key.get(0); } List<Long> longs = new ArrayList<Long>(); List<String> strs = jedis.hmget("hashs", skeys); for (String string : strs) { if(string == null) longs.add(0L); else longs.add(Long.parseLong(string)); } return longs; } @Override public void multiPut(List<List<Object>> keys, List<Long> vals) { Map<String, String> map = new HashMap<String, String>(); int i = 0; for (List<Object> key : keys) { String sKey = key.get(0).toString(); String sVal = vals.get(i).toString(); map.put(sKey, sVal); i++; } jedis.hmset("hashs", map); } }