聊聊claudb的Database
时间:2022-07-23
本文章向大家介绍聊聊claudb的Database,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
序
本文主要研究一下claudb的Database
Database
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/Database.java
public interface Database {
int size();
boolean isEmpty();
boolean containsKey(DatabaseKey key);
DatabaseValue get(DatabaseKey key);
DatabaseValue put(DatabaseKey key, DatabaseValue value);
DatabaseValue remove(DatabaseKey key);
void clear();
ImmutableSet<DatabaseKey> keySet();
Sequence<DatabaseValue> values();
ImmutableSet<Tuple2<DatabaseKey, DatabaseValue>> entrySet();
default SafeString getString(SafeString key) {
return getOrDefault(safeKey(key), DatabaseValue.EMPTY_STRING).getString();
}
default ImmutableList<SafeString> getList(SafeString key) {
return getOrDefault(safeKey(key), DatabaseValue.EMPTY_LIST).getList();
}
default ImmutableSet<SafeString> getSet(SafeString key) {
return getOrDefault(safeKey(key), DatabaseValue.EMPTY_SET).getSet();
}
default NavigableSet<Entry<Double, SafeString>> getSortedSet(SafeString key) {
return getOrDefault(safeKey(key), DatabaseValue.EMPTY_ZSET).getSortedSet();
}
default ImmutableMap<SafeString, SafeString> getHash(SafeString key) {
return getOrDefault(safeKey(key), DatabaseValue.EMPTY_HASH).getHash();
}
default void putAll(ImmutableMap<? extends DatabaseKey, ? extends DatabaseValue> map) {
map.forEach(this::put);
}
default DatabaseValue putIfAbsent(DatabaseKey key, DatabaseValue value) {
DatabaseValue oldValue = get(key);
if (oldValue == null) {
oldValue = put(key, value);
}
return oldValue;
}
default DatabaseValue merge(DatabaseKey key, DatabaseValue value,
BiFunction<DatabaseValue, DatabaseValue, DatabaseValue> remappingFunction) {
DatabaseValue oldValue = get(key);
DatabaseValue newValue = oldValue == null ? value : remappingFunction.apply(oldValue, value);
if(newValue == null) {
remove(key);
} else {
put(key, newValue);
}
return newValue;
}
default DatabaseValue getOrDefault(DatabaseKey key, DatabaseValue defaultValue) {
DatabaseValue value = get(key);
return (value != null || containsKey(key)) ? value : defaultValue;
}
default boolean isType(DatabaseKey key, DataType type) {
DatabaseValue value = get(key);
return value != null ? value.getType() == type : true;
}
default boolean rename(DatabaseKey from, DatabaseKey to) {
DatabaseValue value = remove(from);
if (value != null) {
put(to, value);
return true;
}
return false;
}
default void overrideAll(ImmutableMap<DatabaseKey, DatabaseValue> value) {
clear();
putAll(value);
}
default ImmutableSet<DatabaseKey> evictableKeys(Instant now) {
return entrySet()
.filter(entry -> entry.get2().isExpired(now))
.map(Tuple2::get1);
}
}
- Database接口定义了size、isEmpty、containsKey、get、put、remove、clear、keySet、values、entrySet方法;同时还提供了getString、getList、getSet、getSortedSet、getHash、putAll、putIfAbsent、merge、getOrDefault、isType、rename、overrideAll、evictableKeys这几个default方法
OnHeapDatabase
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/OnHeapDatabase.java
public class OnHeapDatabase implements Database {
private final Map<DatabaseKey, DatabaseValue> cache;
public OnHeapDatabase(Map<DatabaseKey, DatabaseValue> cache) {
this.cache = cache;
}
@Override
public int size() {
return cache.size();
}
@Override
public boolean isEmpty() {
return cache.isEmpty();
}
@Override
public boolean containsKey(DatabaseKey key) {
return cache.containsKey(key);
}
@Override
public DatabaseValue get(DatabaseKey key) {
DatabaseValue value = cache.get(key);
if (value != null) {
if (!value.isExpired(Instant.now())) {
return value;
}
cache.remove(key);
}
return null;
}
@Override
public DatabaseValue put(DatabaseKey key, DatabaseValue value) {
DatabaseValue oldValue = cache.remove(key);
cache.put(key, value);
return oldValue;
}
@Override
public DatabaseValue remove(DatabaseKey key) {
return cache.remove(key);
}
@Override
public void clear() {
cache.clear();
}
@Override
public ImmutableSet<DatabaseKey> keySet() {
return ImmutableSet.from(cache.keySet());
}
@Override
public Sequence<DatabaseValue> values() {
return ImmutableSet.from(cache.values());
}
@Override
public ImmutableSet<Tuple2<DatabaseKey, DatabaseValue>> entrySet() {
return ImmutableSet.from(cache.entrySet()).map(Tuple::from);
}
}
- OnHeapDatabase实现了Database接口,它使用Map结构作为cache;其get方法在取出value不为null时会判断该value是否过期,如果过期则移除该key,返回null;其put方法会先执行remove获取oldValue,在put进去新值,最后返回oldValue
OffHeapDatabase
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/OffHeapDatabase.java
public class OffHeapDatabase implements Database {
private OHCache<DatabaseKey, DatabaseValue> cache;
public OffHeapDatabase(OHCache<DatabaseKey, DatabaseValue> cache) {
this.cache = cache;
}
@Override
public int size() {
return (int) cache.size();
}
@Override
public boolean isEmpty() {
return cache.size() == 0;
}
@Override
public boolean containsKey(DatabaseKey key) {
return cache.containsKey(key);
}
@Override
public DatabaseValue get(DatabaseKey key) {
DatabaseValue value = cache.get(key);
if (value != null) {
if (!value.isExpired(Instant.now())) {
return value;
}
cache.remove(key);
}
return null;
}
@Override
public DatabaseValue put(DatabaseKey key, DatabaseValue value) {
cache.put(key, value);
return value;
}
@Override
public DatabaseValue remove(DatabaseKey key) {
DatabaseValue value = get(key);
cache.remove(key);
return value;
}
@Override
public void clear() {
cache.clear();
}
@Override
public ImmutableSet<DatabaseKey> keySet() {
Set<DatabaseKey> keys = new HashSet<>();
try (CloseableIterator<DatabaseKey> iterator = cache.keyIterator()) {
while (iterator.hasNext()) {
keys.add(iterator.next());
}
} catch(IOException e) {
throw new UncheckedIOException(e);
}
return ImmutableSet.from(keys);
}
@Override
public Sequence<DatabaseValue> values() {
List<DatabaseValue> values = new LinkedList<>();
for (DatabaseKey key : keySet()) {
values.add(cache.get(key));
}
return ImmutableList.from(values);
}
@Override
public ImmutableSet<Tuple2<DatabaseKey, DatabaseValue>> entrySet() {
return keySet().map(key -> Tuple.of(key, get(key)));
}
}
- OffHeapDatabase实现了Database接口,它使用OHCache作为cache,其get方法在取出value不为null时会判断该value是否过期,如果过期则移除该key,返回null;其put方法直接往cache覆盖该key,返回的是新值
DatabaseFactory
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/DatabaseFactory.java
public interface DatabaseFactory {
Database create(String name);
void clear();
}
- DatabaseFactory接口定义了create、clear方法
OnHeapDatabaseFactory
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/OnHeapDatabaseFactory.java
public class OnHeapDatabaseFactory implements DatabaseFactory {
@Override
public Database create(String name) {
return new OnHeapDatabase(new HashMap<>());
}
@Override
public void clear() {
// nothing to clear
}
}
- OnHeapDatabaseFactory实现了DatabaseFactory接口,其create使用HashMap创建OnHeapDatabase
OffHeapDatabaseFactory
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/OffHeapDatabaseFactory.java
public class OffHeapDatabaseFactory implements DatabaseFactory {
@Override
public Database create(String name) {
return new OffHeapDatabase(createCache());
}
private OHCache<DatabaseKey, DatabaseValue> createCache() {
return builder()
.eviction(Eviction.NONE)
.throwOOME(true)
.keySerializer(new FSTSerializer<>())
.valueSerializer(new FSTSerializer<>())
.build();
}
private OHCacheBuilder<DatabaseKey, DatabaseValue> builder() {
return OHCacheBuilder.newBuilder();
}
@Override
public void clear() {
// nothing to do
}
private static class FSTSerializer<E> implements CacheSerializer<E> {
private static final FSTConfiguration FST = FSTConfiguration.createDefaultConfiguration();
static {
FST.registerClass(DatabaseValue.class);
FST.registerClass(DatabaseKey.class);
FST.registerClass(SafeString.class);
FST.registerClass(SortedSet.class);
}
@Override
public void serialize(E value, ByteBuffer buf) {
byte[] array = FST.asByteArray(value);
buf.putInt(array.length);
buf.put(array);
}
@SuppressWarnings("unchecked")
@Override
public E deserialize(ByteBuffer buf) {
int length = buf.getInt();
byte[] array = new byte[length];
buf.get(array);
return (E) FST.asObject(array);
}
@Override
public int serializedSize(E value) {
return FST.asByteArray(value).length + Integer.BYTES;
}
}
}
- OffHeapDatabaseFactory实现了DatabaseFactory接口,其create方法创建的是OffHeapDatabase;其createCache方法使用OHCacheBuilder来构造OHCache,其eviction为NONE,其throwOOME为true;其keySerializer及valueSerializer均为FSTSerializer
小结
claudb提供了OnHeapDatabase、OffHeapDatabase两种实现,前者使用HashMap,后者使用OHCache
doc
- WordPress用Windows主机设置伪静态方法
- PHP页面跳转代码
- 分布式事务 TCC-Transaction 源码解析 —— 调试环境搭建
- 机器学习入门——使用python进行监督学习
- 推荐算法的介绍,第一部分——协同过滤与奇异值分解
- 在ASP中实现UNIX时间戳
- 【学术】厉害了我的哥,国外技术大咖仿造了谷歌的Arts &Culture,找到古代的“你”
- 【技巧】应赛技巧,教你如何在Kaggle比赛中排在前1%
- 熔断器 Hystrix 源码解析 —— 命令执行(一)之正常执行逻辑
- 智能主题检测与无监督机器学习:识别颜色教程
- 如何下载安装Weka机器学习工作平台
- Dubbo 源码解析 —— LoadBalance
- 如何处理机器学习中类的不平衡问题
- 【死磕Java并发】—– Java内存模型之重排序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Vue.js】Vue.js组件库Element中的时间选择器、日期选择器、日期时间选择器和颜色选择器
- 【Vue.js】Vue.js的Chrome浏览器开发插件DevTools的安装步骤
- 训练提速60%!只需5行代码,PyTorch 1.6即将原生支持自动混合精度训练。
- TensorFlow 模型剪枝
- 机器人如何使用 RRT 进行路径规划?
- 高效 PyTorch:6个训练Tips
- 机器学习与情绪交易(附代码)
- 社区前端游戏框架LollipopCreator v1.0.X正式开源
- 社区开源框架音效管理模块:AudioManager详解
- 社区开源框架音效管理模块:AvatarManager详解
- vue-element-admin实现一个可编辑的table
- vue+element实现一个excel表格下载的功能
- vue的select下拉框多选项-multiple属性
- HBase基准测试
- Shell数组的使用