上期分享了LevelDB Java&Go实践内容,按照惯例,我自然不会傻傻地使用原生API,肯定要进行一番封装。经过一段时间的尝试和测试,功能终于稳定下来。
这次我不仅封装了LevelDB API,还进行了一定程度的拓展,分别拓展了存储类型int类型和原有value上追加的功能,使得LevelDB更像Redis。
封装
本次依旧采取之前base对象的思路,将每一个LevelDB封装到一个自定义的类里面,通过类方法的封装来个性化实现各个功能。封装完成之后,至少收获了两个好处:1. 再也不用将String字符串和byte数组转来转去了;2. 统一了语法之后,代码看起来整洁多了。
下面是我对原生API的封装:
/**
* LevelDB数据库操作类
*/
class LevelBase extends SourceCode {
static Iq80DBFactory factory = Iq80DBFactory.factory
static Options options = new Options()
DB db
/**
* 创建对象
* @param path
*/
LevelBase(String path) {
db = factory.open(new File(getLongFile(path)), options)
}
/**
* 获取value
* @param key
* @return
*/
def get(String key) {
new String(db.get(bytes(key)), DEFAULT_CHARSET)
}
/**
* 存储数据
* @param key
* @param value
* @return
*/
def put(String key, String value) {
db.put(bytes(key), bytes(value))
}
/**
* 删除某个值
* @param key
* @return
*/
def del(String key) {
db.delete(bytes(key))
}
/**
* 获取所有key
* @return
*/
def keys() {
def keys = []
DBIterator iterator = db.iterator();
while (iterator.hasNext()) {
Map.Entry<byte[], byte[]> next = iterator.next();
keys << next.key
}
return keys
}
/**
* 关闭
* @return
*/
def close() {
db.close()
}
}
功能拓展
首先我拓展了value值的范围,兼容了value值是int类型的,这里想不到太好的办法,只能在int和String之间转来转去。以后我根据com.funtester.db.redis.RedisBase
类中的功能,对照拓展了:自增、自减、增减数值、追加和删除片段。同样的也是在String和byte数组转来转去。
增减方法我加了锁,为了在性能测试中避免线程不安全。此处没有确定,等后面实践时候再修改。
/**
* 获取int类型
* @param key
* @return
*/
def getInt(String key) {
return changeStringToInt(get(key))
}
/**
* 在原来的结果上追加
* @param key
* @param content
* @return
*/
def append(String key, String content) {
put(key, get(key) + content)
}
/**
* 在原来的结果中删除
* @param key
* @param content
* @return
*/
def cut(String key, String content) {
put(key, get(key) - content)
}
/**
* put int类型的值
* @param key
* @param value
* @return
*/
def putInt(String key, int value) {
db.put(bytes(key), bytes(value + EMPTY))
}
/**
* 自增
* @param key
* @return
*/
def incr(String key) {
add(key, 1)
}
/**
* 自减
* @param key
* @return
*/
def decr(String key) {
minus(key, 1)
}
/**
* value 值增加
* @param key
* @param i
* @return
*/
def add(String key, int i) {
synchronized (this) {
putInt(key, getInt(key) + i)
}
}
/**
* value 值减少
* @param key
* @param i
* @return
*/
def minus(String key, int i) {
add(key, -i)
}
本期就分享Java的实践和拓展,下期再分享Go语言实践和LevelDB在测试工作中应用的几种场景,欢迎大家持续关注FunTester。