Redis的基本数据类型不支持多条件查询、全文搜索等,因此我们对Redis源码进行了修改,通过辅助索引将Redis转化为可以像SQL数据一样使用的数据库。
这个项目主页是https://oncedb.com
OnceDB 不会改变 Redis 的数据存储结构。Redis数据库文件可以直接在OnceDB中操作,然后返回Redis使用。
索引搜索
创建索引
全文搜索的性能很差。您可以通过创建索引来提高性能。方法是为索引字段创建有序列表,然后在进行条件查询时对这些有序列表进行交集查询操作。
# Create hash data
hmset article:001 poster dota visit 21 key js
hmset article:002 poster dota visit 11 key c
hmset article:003 poster like visit 34 key js
hmset article:004 poster like visit 44 key c
然后我们为上述字段创建索引,权重分数设置为:202000201,一个关于时间的整数,值为文章的ID值
# Create indexed
zadd *article.poster:dota 20200201 001 20200201 002
zadd *article.poster:like 20200201 003 20200201 004
zadd *article.key:js 20200201 001 20200201 003
zadd *article.key:c 20200201 002 20200201 004
# "visit" using its value as the weight score
zadd *article.visit 21 001 11 002 34 003 44 004
按索引查询
找到 *article.key:js 和 *article.poster:dota 两个索引的交集,并将它们存储在 *tmp1 有序列表中:
zinterstore *tmp1 2 *article.key:js *article.poster:dota
> 1
然后*tmp1存储满足key=js和poster=dota条件的ID集合:
zrange *tmp1 0 -1
> 001
可以使用 zrangehmget 命令打印对应的 HASH 值:
zrangehmget *tmp1 0 -1 article: key poster
1) 001
2) 40400402
3) js
4) dota
5)
6)
结果与直接全文搜索key = js 和poster = dota 一样
hsearch article:* key = js poster = dota
1) article:001
2) js
3) dota
搜索范围
比如要搜索访问次数在20到30之间的数据,key=js,可以通过控制权重来实现
创建临时索引,只取*article.visit的权重和key=js的数据
zinterstore *tmp2 2 *article.key:js *article.visit weights 0 1
> 2
获取 20 到 30 之间的数据
zrangebyscore *tmp2 20 30
> 001
您可以使用 zrangehmgetbyscore 打印相应的哈希数据:
zrangehmgetbyscore *tmp2 20 30 article: key visit
1) 001
2) 21
3) js
4) 21
5)
6)
结果与使用全文搜索的结果一致:
hsearch article:* visit >= 20 visit <= 30 key = js
1) article:001
2) 21
3)
4) js
因为有两个相同的字段,visit> = 20 visit <= 30,所以搜索结果只会输出一个,第三行重复的字段会输出空。
更多OnceDB扩展指令可查看:OnceDB中的搜索、查询、计算、求和指令
自动索引
Redis索引的创建和维护不是很方便。OnceDB 可以选择在数据修改时自动创建辅助索引。
创建索引:upsert schema field operator value ...
使用 upsert / insert / update 指令和特殊运算符自动创建索引:
上面的例子可以写成:
upsert article id @ 001 poster ? dota visit / 21 key ? js
upsert article id @ 002 poster ? dota visit / 11 key ? c
upsert article id @ 003 poster ? like visit / 34 key ? js
upsert article id @ 004 poster ? like visit / 44 key ? c
操作员:
@:主键 ?:组索引 /:排序索引
操作后自动创建索引: *article *article.poster:dota *article.poster:like *article.visit *article.key:js *article.key:c
多条件索引查询:查找schema from to field operator value ...
对于有索引的字段,可以使用 find 命令通过索引字段进行查询。例如查询:key = js 和poster = dota 的数据。您可以使用 ”?” 表示这两个字段是分组索引:
find article 0 -1 key ? js poster ? dota
1) 1
2) article:001
3) js
4) dota
1代表数据总量。如果为-1,则表示使用全文搜索,性能较差。
索引范围查询
您可以添加 @ 来指定索引范围,并使用 + 来指定将哪个索引字段用于分数权重范围。
find article 0@20 -1@30 key ? js visit /+ *
1) 1
2) article:001
3) js
4) 21
删除索引
OnceDB 不存储索引定义。删除时需要手动指明哪些字段包含索引。您需要指定字段名称和索引运算符。
remove article @ 001 key ? poster ? visit /
您还可以自定义索引名称和权重分数。更多说明请参见:OnceDB数据修改和查询帮助文档