写点什么

LevelDB 封装和功能拓展

作者:FunTester
  • 2021 年 12 月 16 日
  • 本文字数:1895 字

    阅读完需:约 6 分钟

上期分享了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。

欢迎关注 FunTester,Have Fun ~ Tester !

发布于: 5 小时前阅读数: 5
用户头像

FunTester

关注

公众号:FunTester,650+原创,欢迎关注 2020.10.20 加入

Have Fun,Tester! 公众号FunTester,坚持原创文章的测试人。 FunTester测试框架作者,DCS_FunTester分布式性能测试框架作者。

评论

发布
暂无评论
LevelDB封装和功能拓展