Java版的Redis (一)

2014-11-24 08:22:21 · 作者: · 浏览: 7

Redis是一个基于Key-value结构的Nosql数据库,它支持各种常见的数据结构以及非常方便的操作,
与其说它是一个数据库,不如说它是一个保存各种数据结构的服务器。今天闲来没事,用Java集合类
实现了Redis的一些基本功能,算是温习下Java了。


1.Redis入门


Redis的Key键值为字符串,但是Value值支持许多种类型,如String字符串,List链表,Set无序集合,
SortedSet有序集合,甚至是Hash表。


各种数据结构通过不同的存取方法来区分。如Set/Get直接将值存为String,LPush/LPop/LRange将
值存到一个链表中,SAdd/ZAdd则区分了无序和有序集合。


下面我们来看下在Java中使用基本的集合类如何实现这些简单而方便的操作。


2.Java版的Redis


代码的组织结构如下图:


[java]
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.unmarsh