{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問(wèn)答專(zhuān)欄Q & A COLUMN

redis作為數(shù)據(jù)庫(kù)的緩存,但redis不支持sql查詢?如何解決?

caohaoyucaohaoyu 回答0 收藏1
收藏問(wèn)題

1條回答

dantezhao

dantezhao

回答于2022-06-28 13:45

OnceDB是基于Redis實(shí)現(xiàn)的全文搜索數(shù)據(jù)庫(kù),可以像SQL數(shù)據(jù)庫(kù)那樣創(chuàng)建輔助索引,提高條件搜索的性能。

OnceDB并不改變Redis的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),Redis數(shù)據(jù)庫(kù)文件可以直接在OnceDB中操作,然后再返回Redis中使用。

# 索引搜索

## 搜索原理

全文搜索的性能比較差,可通過(guò)創(chuàng)建索引的辦法提高性能,辦法是為索引字段創(chuàng)建一個(gè)有序列表,然后在條件查詢時(shí),對(duì)這些有序列表做交集查詢操作。


# 創(chuàng)建4條 Hash 數(shù)據(jù)

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


然后我們?yōu)樯厦娴淖侄蝿?chuàng)建索引,權(quán)重分?jǐn)?shù)設(shè)為: 202000201,一個(gè)關(guān)于時(shí)間的整數(shù),值為article的ID值


# 維護(hù)索引

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 的索引直接使用其值為權(quán)重分?jǐn)?shù)

zadd *article.visit 21 001 11 002 34 003 44 004

```

## 按索引查詢

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

```

zinterstore *tmp1 2 *article.key:js *article.poster:dota
> 1

```

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

```

zrange *tmp1 0 -1
> 001

```

可使用zrangehmget指令打印相應(yīng)的HASH值:

```

zrangehmget *tmp1 0 -1 article: key poster
1) 001
2) 40400402
3) js
4) dota
5)
6)

```

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

```

hsearch article:* key = js poster = dota
1) article:001
2) js
3) dota

```

## 搜索范圍

比如要搜索 visit 數(shù)量在 20 到 30 之間,key = js 的數(shù)據(jù),可通過(guò)控制權(quán)重的方法實(shí)現(xiàn)

創(chuàng)建臨時(shí)索引,只取 *article.visit 的權(quán)重 和 key = js 的數(shù)據(jù)

```

zinterstore *tmp2 2 *article.key:js *article.visit weights 0 1
> 2

```

取 20 ~ 30 之間的數(shù)據(jù)

```

zrangebyscore *tmp2 20 30
> 001

```

可使用 zrangehmgetbyscore 打印出對(duì)應(yīng)的hash數(shù)據(jù):

```

zrangehmgetbyscore *tmp2 20 30 article: key visit
1) 001
2) 21
3) js
4) 21
5)
6)

```

其結(jié)果與使用全文搜索的結(jié)果一致:

```

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

```

因?yàn)槔锩嬗袃蓚€(gè)相同的字段,visit >= 20 visit <= 30,搜索結(jié)果只會(huì)輸出一個(gè),第3行重復(fù)的字段會(huì)輸出空。

OnceDB更多擴(kuò)展指令可查看: [OnceDB 搜索、查詢、計(jì)算、求和指令

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

# 自動(dòng)索引

Redis索引的創(chuàng)建和維護(hù)并不十分方便,OnceDB 在數(shù)據(jù)修改時(shí)可選擇自動(dòng)創(chuàng)建輔助索引。

## 創(chuàng)建索引:upsert schema field operator value ...

使用 upsert/insert/update 指令和特殊的操作符可自動(dòng)創(chuàng)建索引:

如上文的例子可寫(xiě)成:

```

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

```

操作符:

> @ : 主鍵

> ? : 分組索引

> / : 排序索引

操作后會(huì)自動(dòng)創(chuàng)建: *article *article.poster:dota *article.poster:like *article.visit *article.key:js *article.key:c 等索引。

## 多條件索引查詢:find schema from to field operator value ...

含有索引的字段,可使用 find 命令通過(guò)索引字段查詢出來(lái),比如查詢:key = js 和 poster = dota 的數(shù)據(jù),可通過(guò) "?" 指明這兩個(gè)字段是分組索引:

```

find article 0 -1 key ? js poster ? dota
1) 1
2) article:001
3) js
4) dota

```

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

## 索引范圍查詢

可添加 @ 指定索引范圍,并使用 + 指定使用哪個(gè)索引字段的分?jǐn)?shù)權(quán)重范圍。

```

find article 0@20 -1@30 key ? js visit /+ *
1) 1
2) article:001
3) js
4) 21

```

## 刪除自動(dòng)索引

OnceDB不存儲(chǔ)索引定義,刪除時(shí)需要手動(dòng)指出哪些字段含有索引,需要指定字段名和索引操作符即可。

```

remove article @ 001 key ? poster ? visit /

```

還可以自定義索引名稱(chēng),權(quán)重分?jǐn)?shù),更多說(shuō)明可查看:

OnceDB數(shù)據(jù)修改和查詢幫助文檔

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

評(píng)論0 贊同0
  •  加載中...

最新活動(dòng)

您已邀請(qǐng)0人回答 查看邀請(qǐng)

我的邀請(qǐng)列表

  • 擅長(zhǎng)該話題
  • 回答過(guò)該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說(shuō)句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<