聊聊claudb的keys command
序
本文主要研究一下claudb的keys command
KeysCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/KeysCommand.java
@ReadOnly
@Command("keys")
@ParamLength(1)
public class KeysCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
GlobPattern pattern = createPattern(request.getParam(0));
ImmutableSet<SafeString> keys = db.entrySet()
.filter(matchPattern(pattern))
.filter(filterExpired(Instant.now()).negate())
.map(Tuple2::get1)
.map(DatabaseKey::getValue);
return convert(keys);
}
private GlobPattern createPattern(SafeString param) {
return new GlobPattern(param.toString());
}
private Matcher1<Tuple2<DatabaseKey, DatabaseValue>> filterExpired(Instant now) {
return entry -> entry.get2().isExpired(now);
}
private Matcher1<Tuple2<DatabaseKey, DatabaseValue>> matchPattern(GlobPattern pattern) {
return entry -> pattern.match(entry.get1().toString());
}
}
- KeysCommand实现了DBCommand接口,其execute方法先通过createPattern创建GlobPattern,之后遍历db.entrySet(),过滤出matchPattern的,再过滤出非expired的,最后返回
DeleteCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/DeleteCommand.java
@Command("del")
@ParamLength(1)
public class DeleteCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
int removed = 0;
for (SafeString key : request.getParams()) {
DatabaseValue value = db.remove(safeKey(key));
if (value != null) {
removed += 1;
}
}
return integer(removed);
}
}
- DeleteCommand实现了DBCommand接口,其execute方法遍历request.getParams()执行db.remove(safeKey(key)),最后返回integer(removed)
ExistsCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/ExistsCommand.java
@ReadOnly
@Command("exists")
@ParamLength(1)
public class ExistsCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
DatabaseValue value = db.get(safeKey(request.getParam(0)));
return integer(value != null ? !value.isExpired(Instant.now()) : false);
}
}
- ExistsCommand实现了DBCommand接口,其execute方法先通过db.get(safeKey(request.getParam(0)))获取DatabaseValue,之后判断是否null,非null的话再判断是否expired,非expired的返回true
TypeCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/TypeCommand.java
@ReadOnly
@Command("type")
@ParamLength(1)
public class TypeCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
DatabaseValue value = db.get(safeKey(request.getParam(0)));
if (value != null) {
return status(value.getType().text());
} else {
return status(DataType.NONE.text());
}
}
}
- TypeCommand实现了DBCommand接口,其execute方法先通过db.get(safeKey(request.getParam(0)))获取DatabaseValue,若不为null则返回status(value.getType().text()),否则返回status(DataType.NONE.text())
RenameCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/RenameCommand.java
@Command("rename")
@ParamLength(2)
public class RenameCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
if (db.rename(safeKey(request.getParam(0)), safeKey(request.getParam(1)))) {
return responseOk();
} else {
return error("ERR no such key");
}
}
}
- RenameCommand实现了DBCommand接口,其execute方法执行db.rename
ExpireCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/ExpireCommand.java
@Command("expire")
@ParamLength(2)
public class ExpireCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
try {
DatabaseValue value = db.get(safeKey(request.getParam(0)));
if (value != null) {
db.put(safeKey(request.getParam(0)), value.expiredAt(parsetTtl(request.getParam(1))));
}
return integer(value != null);
} catch (NumberFormatException e) {
return error("ERR value is not an integer or out of range");
}
}
private int parsetTtl(SafeString param) {
return Integer.parseInt(param.toString());
}
}
- ExpireCommand实现了DBCommand接口,其execute方法先通过db.get(safeKey(request.getParam(0)))获取DatabaseValue,若不为null则执行value.expiredAt(parsetTtl(request.getParam(1))),然后put进去
PersistCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/PersistCommand.java
@Command("persist")
@ParamLength(1)
public class PersistCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
DatabaseValue value = db.get(safeKey(request.getParam(0)));
if (value != null) {
db.put(safeKey(request.getParam(0)), value.noExpire());
}
return integer(value != null);
}
}
- PersistCommand方法实现了DBCommand接口,其execute方法先通过db.get(safeKey(request.getParam(0)))获取DatabaseValue,若不为null则执行db.put(safeKey(request.getParam(0)), value.noExpire())
TimeToLiveCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/TimeToLiveCommand.java
public abstract class TimeToLiveCommand implements DBCommand {
@Override
public RedisToken execute(Database db, Request request) {
DatabaseValue value = db.get(safeKey(request.getParam(0)));
if (value != null) {
return keyExists(value);
} else {
return notExists();
}
}
protected abstract int timeToLive(DatabaseValue value, Instant now);
private RedisToken keyExists(DatabaseValue value) {
if (value.getExpiredAt() != null) {
return hasExpiredAt(value);
} else {
return integer(-1);
}
}
private RedisToken hasExpiredAt(DatabaseValue value) {
Instant now = Instant.now();
if (!value.isExpired(now)) {
return integer(timeToLive(value, now));
} else {
return notExists();
}
}
private RedisToken notExists() {
return integer(-2);
}
}
- TimeToLiveCommand声明实现DBCommand接口,其execute接口先通过db.get(safeKey(request.getParam(0)))获取DatabaseValue,若为null则返回notExists,若不为null则执行keyExists;keyExists方法在value.getExpiredAt()不为null时执行hasExpiredAt方法;hasExpiredAt方法在value.isExpired(now)为false时返回integer(timeToLive(value, now));timeToLive方法为抽象方法,需要子类实现
TimeToLiveMillisCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/TimeToLiveMillisCommand.java
@Command("pttl")
@ParamLength(1)
public class TimeToLiveMillisCommand extends TimeToLiveCommand {
@Override
protected int timeToLive(DatabaseValue value, Instant now) {
return (int) value.timeToLiveMillis(now);
}
}
- TimeToLiveMillisCommand实现了TimeToLiveCommand接口,其timeToLive方法返回value.timeToLiveMillis(now)
TimeToLiveSecondsCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/TimeToLiveSecondsCommand.java
@Command("ttl")
@ParamLength(1)
public class TimeToLiveSecondsCommand extends TimeToLiveCommand {
@Override
protected int timeToLive(DatabaseValue value, Instant now) {
return value.timeToLiveSeconds(now);
}
}
- TimeToLiveSecondsCommand实现了TimeToLiveCommand接口,其timeToLive方法返回value.timeToLiveSeconds(now)
小结
claudb keys相关的command有KeysCommand、DeleteCommand、ExistsCommand、TypeCommand、RenameCommand、ExpireCommand、PersistCommand、TimeToLiveMillisCommand、TimeToLiveSecondsCommand
doc
- KeysCommand
- 使用pt工具检测MySQL主从延迟(r12笔记第7天)
- WordPress发布/更新文章、提交/审核评论自动清理VeryCloud缓存
- MySQL中的binlog和redo浅析(r12笔记第5天)
- WordPress发布/更新文章、提交/审核评论自动清理腾讯云CDN缓存
- 使用sysbench压力测试MySQL(一)(r11笔记第3天)
- 分享一下php7和其他php多版本共存的配置教程
- 使用sysbench压力测试MySQL(二)
- 使用sysbench压力测试MySQL(三)(r12笔记第6天)
- 解决IE响应式的解决方案css3-mediaqueries.js不生效问题
- MySQL传输表空间小结(r12笔记第2天)
- swingbench压测Oracle小记(r12笔记第20天)
- 分享最近对网站外链跳转页面代码的一些改善
- swingbench压测Oracle小记(r12笔记第19天)
- Oracle闪回原理测试(三)(r12笔记第16天)
- 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 数组属性和方法
- Linux内核设备驱动地址映射笔记整理
- Linux中的who命令实例介绍
- Linux十个新手命令分享
- Linux 内核通用链表学习小结
- 从零开始针对 .NET 应用的 DevOps 运营实践 - 运行环境搭建
- 面试问我,创建多少个线程合适?我该怎么说
- C语言链表实例--玩转链表
- 帝国CMS怎么利用灵动标签循环调用多个栏目下的文章
- PHP 加密 Password Hashing API基础知识点
- php libevent 功能与使用方法详解
- 对Python3中bytes和HexStr之间的转换详解
- 用python代码将tiff图片存储到jpg的方法
- php下的原生ajax请求用法实例分析
- php 中的信号处理操作实例详解
- php多进程中的阻塞与非阻塞操作实例分析