package com.realtimecep.pilots.analytics.sns.trident;
import backtype.storm.task.IMetricsContext;
import backtype.storm.tuple.Values;
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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Redis State Management Class.
* <p/>
*
* @author <a href="iamtedwon@gmail.com">Ted Won</a>
* @version 0.1.0
*/
public class RedisState implements IBackingMap<Long> {
Jedis jedis = new Jedis("localhost");
public static class Factory implements StateFactory {
@Override
public State makeState(Map conf, IMetricsContext iMetricsContext, 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);
}
}