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[i] = Get(keys[i]);
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.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
class Serializer {
Object marshal(Object object) {
if (object == null)
return null;
return new BytesWrapper((Serializable) object);
}
Object unmarshal(Object object) {
if (object == null)
return null;
return ((BytesWrapper) object).readObject();
}
}
class BytesWrapper {
private byte[] bytes;
BytesWrapper(T object) {
writeBytes(object);
}
void writeBytes(T object) {
try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream output = new ObjectOutputStream(buffer);
output.writeObject(object);
output.flush();
bytes = buffer.toByteArray();
output.close();
}
catch (IOException e) {
e.printStackTrace();
throw new IllegalStateException(e);
}
}
Object readObject() {
try {
ObjectInputStream input = new ObjectInputStream(new ByteArrayInputStream(bytes));
Object object = input.readObject();
input.close();
return object;
}
catch (Exception e) {
e.printStackTrace();
throw new IllegalStateException(e);
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(bytes);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BytesWrapper other = (BytesWrapper) obj;
if (!Arrays.equals(bytes, other.bytes))
return false;
return true;
}
}package com.cdai.studio.redis;
import java.util.HashMap;
class Persistence {
private HashMap storage =
new HashMap();
void put(String key, Object value) {
storage.put(key, value);
}
Object get(String key) {
return storage.get(key);
}
}