欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

redis作為數據庫的緩存,但redis不支持sql查詢?如何解決?

林國瑞2年前16瀏覽0評論

OnceDB是基于Redis實現的全文搜索數據庫,可以像SQL數據庫那樣創建輔助索引,提高條件搜索的性能。

OnceDB并不改變Redis的數據存儲結構,Redis數據庫文件可以直接在OnceDB中操作,然后再返回Redis中使用。

#索引搜索

##搜索原理

全文搜索的性能比較差,可通過創建索引的辦法提高性能,辦法是為索引字段創建一個有序列表,然后在條件查詢時,對這些有序列表做交集查詢操作。

#創建4條Hash數據

hmsetarticle:001posterdotavisit21keyjs
hmsetarticle:002posterdotavisit11keyc
hmsetarticle:003posterlikevisit34keyjs
hmsetarticle:004posterlikevisit44keyc

然后我們為上面的字段創建索引,權重分數設為:202000201,一個關于時間的整數,值為article的ID值

#維護索引

zadd*article.poster:dota2020020100120200201002
zadd*article.poster:like2020020100320200201004
zadd*article.key:js2020020100120200201003
zadd*article.key:c2020020100220200201004

#visit的索引直接使用其值為權重分數

zadd*article.visit21001110023400344004

```

##按索引查詢

求*article.key:js和*article.poster:dota兩個索引的交集,并存放在*tmp1有序列表中:

```

zinterstore*tmp12*article.key:js*article.poster:dota
>1

```

然后*tmp1存放的就是滿足key=js和poster=dota條件的ID集合:

```

zrange*tmp10-1
>001

```

可使用zrangehmget指令打印相應的HASH值:

```

zrangehmget*tmp10-1article:keyposter
1)001
2)40400402
3)js
4)dota
5)
6)

```

其結果與直接全文搜索key=js和poster=dota的搜索結果相同

```

hsearcharticle:*key=jsposter=dota
1)article:001
2)js
3)dota

```

##搜索范圍

比如要搜索visit數量在20到30之間,key=js的數據,可通過控制權重的方法實現

創建臨時索引,只取*article.visit的權重和key=js的數據

```

zinterstore*tmp22*article.key:js*article.visitweights01
>2

```

取20~30之間的數據

```

zrangebyscore*tmp22030
>001

```

可使用zrangehmgetbyscore打印出對應的hash數據:

```

zrangehmgetbyscore*tmp22030article:keyvisit
1)001
2)21
3)js
4)21
5)
6)

```

其結果與使用全文搜索的結果一致:

```

hsearcharticle:*visit>=20visit<=30key=js
1)article:001
2)21
3)
4)js

```

因為里面有兩個相同的字段,visit>=20visit<=30,搜索結果只會輸出一個,第3行重復的字段會輸出空。

OnceDB更多擴展指令可查看:[OnceDB搜索、查詢、計算、求和指令

https://oncedb.com/wiki/view/oncedb-server.zh-CN/data_instruction

#自動索引

Redis索引的創建和維護并不十分方便,OnceDB在數據修改時可選擇自動創建輔助索引。

##創建索引:upsertschemafieldoperatorvalue...

使用upsert/insert/update指令和特殊的操作符可自動創建索引:

如上文的例子可寫成:

```

upsertarticleid@001poster?dotavisit/21key?js
upsertarticleid@002poster?dotavisit/11key?c
upsertarticleid@003poster?likevisit/34key?js
upsertarticleid@004poster?likevisit/44key?c

```

操作符:

>@:主鍵

>?:分組索引

>/:排序索引

操作后會自動創建:*article*article.poster:dota*article.poster:like*article.visit*article.key:js*article.key:c等索引。

##多條件索引查詢:findschemafromtofieldoperatorvalue...

含有索引的字段,可使用find命令通過索引字段查詢出來,比如查詢:key=js和poster=dota的數據,可通過"?"指明這兩個字段是分組索引:

```

findarticle0-1key?jsposter?dota
1)1
2)article:001
3)js
4)dota

```

1:代表符合條件的數據總數,如果是-1則代表使用了全文搜索,性能較差。

##索引范圍查詢

可添加@指定索引范圍,并使用+指定使用哪個索引字段的分數權重范圍。

```

findarticle0@20-1@30key?jsvisit/+*
1)1
2)article:001
3)js
4)21

```

##刪除自動索引

OnceDB不存儲索引定義,刪除時需要手動指出哪些字段含有索引,需要指定字段名和索引操作符即可。

```

removearticle@001key?poster?visit/

```

還可以自定義索引名稱,權重分數,更多說明可查看:

OnceDB數據修改和查詢幫助文檔

https://oncedb.com/wiki/view/oncedb-server.zh-CN/data_modify_and_query