项目作者: senlinmuvs

项目描述 :
Operate the kv db like relation db. A batch find update delete kv db (SSDB) tool.
高级语言: Go
项目地址: git://github.com/senlinmuvs/xdb.git
创建时间: 2021-04-19T12:16:58Z
项目社区:https://github.com/senlinmuvs/xdb

开源协议:Apache License 2.0

下载


XDB

像操作关系数据库一样操作kv数据库

批量查改删数据工具。支持连key(类似连表),条件查询,字段选择。KV转关系必然有性能损失的,适合离线数据管理,批量处理用。

图形界面工具xdbgui

  1. sen@x:/mnt/c/code/go/xdb$ xdb -x "find h:user:%d{id(0,100000011)}(id,ut)"
  2. id ut
  3. 100000001 1610539080041
  4. 100000002 1610539080041
  5. 100000003 1610539080041
  6. 100000004 1610539080041
  7. 100000005 1610539080041
  8. 100000006 1610539080041
  9. 100000007 1610539080041
  10. 100000008 1610539080041
  11. 100000009 1610539080041
  12. 100000010 1610539080041
  13. xdb count: 10

执行一批xdb命令:

  1. sen@x:/mnt/c/code/go/xdb$ xdb -f test.xdb

test.xdb file:

  1. del z:pks:uid:%d
  2. del z:pks:bylst
  3. del maxid:pk
  4. ...

常用操作

find

find key{条件}(要显示的字段)

{条件}:”&”表示and,”;”表示or。暂时多条件只能同时表达一种关系。

(字段):多字段逗号相隔,所有字段可用*表示

只有命令、源key、目标key之间有空格,key本身不能有空格

  1. #查找所有以h:pk开头的hash key,条件:hash条目cont=x并且img为空串
  2. find h:pk:%d{cont=x&img=}(*)
  3. #查找所有以h:pk:开头的hash key,条件:key上点位符%s处的值满足正则/[^\d]+/
  4. find h:pk:%s{%0/[^\d]+/}

cp

cp 复制的源key 复制的目标key

  1. 复制数据到另一个库
  2. cp -p 8888 -p2 8889 z:user:%d z:user:%d
  3. ------------------------------------------
  4. 先查找以h:user:开头的hash,把查找到的每条hashhrtBid值填入后面的z:bk:@hrtBid:st:%d:pks再查找并把找到的zset数据复制到目标key中。
  5. 目标key中%0是引用源key上第0个点位符的值,所以这里是每个h:user:%d的%d对应值,即uid
  6. cp h:user:%d|z:bk:@hrtBid:st:%d:pks z:user:%0:hrtpks:by:lst

set

set 需要查找的key 需要set的key

find后修改kv

  1. set h:user:%d zyh:@zyh:uid,%0

find后修改zset

  1. #先查找h:user:%d,把每个hash的第0个点位符的值,即uid填入目标key的%0上,最后把找到的目标zset用后面的数据(即100000010,1608707314083)更新
  2. set h:user:%d z:user:%0:follows:by:lst,100000010,1608707314083
  3. set h:user:%d{jut[1610539080041,)} z:user:by:lst,%0,1610539080041

hset

hset 需要查找的key 需要hset的key

find后修改hash

  1. #查找模板h:work:%d,然后把hash字段img用内置函数UnQuote()处理去除引号
  2. hset h:work:%d img=UnQuote()
  3. #查找模板h:pk:%d,再把hash字段st用内置函数DelField()处理,即删除st字段
  4. hset h:pk:%d st=DelField()
  5. #查找模板h:user:%d,条件为ut<1的,ut字段赋值为ct字段的值
  6. hset h:user:%d ut(,1)=@ct

del

del 要删除的目标key

  1. #删除所有以h:pk:开头且%s位置匹配/[^\d]+/正则的hash数据
  2. del h:pk:%s{%0/[^\d]+/}
  3. #删除所有以h:bk:开头的,并且条件为hash字段stat值在区间(,1),即小于1
  4. del h:bk:%d{stat(,1)}
  5. #删除所有key匹配此模板的kv
  6. del tag:%s:id
  7. #删除所有key匹配此模板的zset
  8. del z:work:%d:tagIds
  9. #删除所有key匹配模板z:user:%d:pks,且条件为:
  10. zsetkey值连接另一个key(h:pk:@key)后,且h:pk:@keyid字段=0
  11. del z:user:%d:pks{h:pk:@key(@id=0)}

import

import 要导入的文件路径 目标key

  • 导入文件user.csv: 第一行为字段,\t分隔
  • user.csv的数据导入h:user:%0,%0引用user.csv第一列数据
    ```
    xdb -x “import file:///mnt/c/user.csv h:user:%0” -uq | tee log

-uq 表示去掉值的引号

  1. ## export
  2. #### 导出没有专门的命令,直接用find加tee命令就可导出
  3. 把查找到的所有h:pk:开头的hash的全部字段导出到u.csv
  4. (*)表示全部字段,(id,name)则表示idname字段

xdb -x “find h:pk:%d(*)” -nct -qu | tee u.csv
xdb -x “find h:pk:%d(id,name)” -nct -qu | tee u.csv

-nct 表示结尾不输出统计信息
-qu 表示给结果加上引号

  1. ## 直接执行原生命令
  2. /开头表示执行原生命令,-表示空参数

xdb -x “/hgetall h:user:1”
xdb -x “/zscan z:pks - - - 10”

  1. # 符号
  2. ### ()
  3. 条件值区间或字段选择
  4. ### {}
  5. 条件
  6. ### @
  7. 引用前导hash字段,如前面的:
  8. set h:user:%d zyh:@zyh:uid,%0
  9. @zyh表示引用前面这个h:user:%d的字段zyh
  10. ### |
  11. key操作
  12. ### &
  13. 条件and关系符
  14. ### ;
  15. 条件or关系符
  16. ### %
  17. key中值占位符
  18. * %d表示数字
  19. * %s表示字符串
  20. * %0,%1等表示引用第0个或第1个占位符上的值
  21. # key风格
  22. * h:开头表示hash
  23. * z:开头表示zset
  24. * q:开头表示queue
  25. * 无前缀表示kv
  26. 其它风格程序里有常量可设置
  27. 不同的key尽量保证key的前缀有区别,这样能更快查找,因为查找时当发现当前扫描key前缀与上一个不相同时会立刻停止扫描,否则继续查找,如:

z:u:%d:items:bylst

下面这个要好些
z:u:items:%d:bylst
```