package com.cdai.studio.redis;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.TreeSet;
@SuppressWarnings("unchecked")
public class RedisDB {
private Persistence persistence = new Persistence();
private Serializer serializer = new Serializer();
private static final Object[] NULL = new Object[0];
// =================================================
//String value
// =================================================
public void Set(String key, Object value) {
persistence.put(key, serializer.marshal(value));
}
public Object Get(String key) {
return serializer.unmarshal(persistence.get(key));
}
public Object[] MGet(String... keys) {
Object[] values = new Object[keys.length];
for (int i = 0; i < keys.length; i++)
values = Get(keys);
return values;
}
public int Incr(String key) {
Object value = Get(key);
Integer valueRef = (value == null) ? 1 : (Integer) value;
Set(key, valueRef + 1);
return valueRef;
}
// =================================================
//List value
// =================================================
public void LPush(String key, Object... values) {
Object list = persistence.get(key);
if (list == null)
list = new LinkedList();
else
list = serializer.unmarshal(list);
LinkedList listRef = (LinkedList) list;
for (Object value : values)
listRef.addFirst(value);
persistence.put(key, serializer.marshal(list));
}
public void RPush(String key, Object... values) {
Object list = persistence.get(key);
if (list == null)
list = new LinkedList();
else
list = serializer.unmarshal(list);
LinkedList listRef = (LinkedList) list;
for (Object value : values)
listRef.addLast(value);
persistence.put(key, serializer.marshal(list));
}
public Object[] LRange(String key, int start, int end) {
Object list = persistence.get(key);
if (list == null)
return NULL;
LinkedList listRef = (LinkedList) serializer.unmarshal(list);
if (end > listRef.size())
end = listRef.size();
return listRef.subList(start, end).toArray();
}
// =================================================
//Unsorted Set value
// =================================================
public void SAdd(String key, Object... values) {
Object set = persistence.get(key);
if (set == null)
set = new HashSet();
else
set = serializer.unmarshal(set);
HashSet setRef = (HashSet) set;
for (Object value : values)
setRef.add(value);
persistence.put(key, serializer.marshal(set));
}
public Object[] SMembers(String key) {
Object set = persistence.get(key);
if (set == null)
return NULL;
set = serializer.unmarshal(set);
return ((HashSet) set).toArray();
}
public Object[] SInter(String key1, String key2) {
Object set1 = persistence.get(key1);
Object set2 = persistence.get(key2);
if (set1 == null || set2 == null)
return NULL;
HashSet set1Ref = (HashSet) serializer.unmarshal(set1);
HashSet set2Ref = (HashSet) serializer.unmarshal(set2);
set1Ref.retainAll(set2Ref);
return set1Ref.toArray();
}
public Object[] SDiff(String key1, String key2) {
Object set1 = persistence.get(key1);
Object set2 = persistence.get(key2);
if (set1 == null || set2 == null)
return NULL;
HashSet set1Ref = (HashSet) serializer.unmarshal(set1);
HashSet set2Ref = (HashSet) serializer.unmarshal(set2);
set1Ref.removeAll(set2Ref);
return set1Ref.toArray();
}
// =================================================
//Sorted Set value
// =================================================
public void ZAdd(String key, Object... values) {
Object set = persistence.get(key);
if (set == null)
set = new TreeSet();
else
set = serializer.unmarshal(set);
TreeSet setRef = (TreeSet) set;
for (Object value : values)
setRef.add(value);
persistence.put(key, serializer.marshal(set));
}
public Object[] SRange(String key, Object from) {
Object set = persistence.get(key);
if (set == null)
return NULL;
set = serializer.unmarshal(set);
return ((TreeSet) set).tailSet(from).toArray();
}
package com.cdai.studio.redis;
import java.util.Arrays;
public class RedisTest {
public static void main(String[] args) {
RedisDB redis = new RedisDB();
// 1.Create user follow relationship
redis.SAdd("users", "A", "B", "C");
// User A follows B, C
redis.SAdd("users:A:following", "B", "C");
redis.SAdd("users:B:followers", "A");
redis.SAdd("users:C:followers", "A");
// User C follows B
redis.SAdd("users:C:following", "B");
redis.SAdd("users:B:followers", "C");
// 2.1 B send tweet
int tid = redis.Incr("tweets:next_id");
redis.Set("tweets:" + tid, "B publish hello");
redis.LPush("global:timeline", tid);
redis.LPush("users:B:timeline", tid);
for (Object follower : redis.SMembers("users:B:followers"))
redis.LPush("users:" + follower + ":timeline", tid);
// 2.2 C send tweet
tid = redis.Incr("tweets:next_id");
redis.Set("tweets:" + tid, "C publish world");
redis.LPush("global:timeline", tid);
redis.LPush("users:C:timeline", tid);
for (Object follower : redis.SMembers("users:C:followers"))
redis.LPush("users:" + follower + ":timeline", tid);
Object[] tids = redis.LRange("global:timeline", 0, 9);
String[] tweetids = new String[tids.length];
for (int i = 0; i < tids.length; i++)
tweetids = "tweets:" + tids;
System.out.println(Arrays.toString(redis.MGet(tweetids)));
}
}