新聞中心
慢性癥:Redis模糊查詢之苦

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比龍城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式龍城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋龍城地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
Redis 是一款常用的鍵值存儲系統(tǒng),也常被用作數(shù)據(jù)庫、緩存、消息隊列等。其中模糊查詢是一項常用的功能,但諸如 `LIKE` 這樣的模糊查詢并不是 Redis 的本職工作,這就導(dǎo)致了 Redis 在模糊查詢上的一些局限性。在實際使用中,我們可能會遇到 Redis 模糊查詢性能差、慢、缺乏靈活度等一些問題。
一、純 Redis 模糊查詢
1.1 Redis `KEYS` 命令
我們都知道 Redis 有一個 `KEYS` 命令可以用來搜索以某個模式開頭的鍵值。例如,如果有以下幾個鍵:
foo:bar:baz
foo:qux:baz
foo:bar:buz
baz:qux:foo
我們使用 `KEYS foo:*` 查詢,便可以找到所有以 `foo:` 開頭的鍵:
foo:bar:baz
foo:qux:baz
foo:bar:buz
但是,`KEYS` 命令是阻塞性的,執(zhí)行時會阻塞其他 Redis 客戶端的操作,如果我們的 Redis 中有大量的鍵值對,則慢查詢就變得非常明顯。
1.2 Redis 數(shù)據(jù)結(jié)構(gòu)的查詢能力
除了 `KEYS` 命令外,Redis 中的 Sorted Set 以及 Set 集合等數(shù)據(jù)類型也可以實現(xiàn)模糊查詢。例如,如果有一個 Sorted Set `myset`,存儲了以下數(shù)據(jù):
ZADD myset 1 foo
ZADD myset 2 bar
ZADD myset 3 baz
ZADD myset 4 qux
ZADD myset 5 buz
我們可以使用 `ZRANGEBYLEX myset [f [o` 查詢以 f 開頭的值:
> ZRANGEBYLEX myset [f [o
1) "foo"
2) "qux"
但是,這里也有一些限制。這些數(shù)據(jù)結(jié)構(gòu)的查詢方式都是有限制的,不如 SQL 中的模糊查詢豐富靈活;這些查詢都是基于字符串的匹配,不支持模式匹配,無法匹配多個字段。
二、Redis 與 Lua 腳本的模糊查詢
為了解決模糊查詢的問題,我們可以將查找邏輯寫入到 Lua 腳本中,通過 EVAL 命令執(zhí)行,這樣可以減輕 Redis 在查詢過程中的壓力。下面我們來看一個例子:
-- 腳本名稱:scan_keys.lua
local cursor = 0
local pattern = ARGV[1]
local result = {}
repeat
local keys = redis.call('SCAN', cursor, 'MATCH', pattern)
cursor = tonumber(keys[1])
local data = keys[2]
for _, key in iprs(data) do
table.insert(result, key)
end
until cursor == 0
return result
這個腳本使用 Redis 的 `SCAN` 命令進(jìn)行模糊查詢,每次查詢 10000 個鍵值,直到全部查詢完畢為止。我們可以這樣調(diào)用該腳本:
EVAL sha1('scan_keys.lua') 0 'foo:*'
其中,`0` 表示不使用 key,`foo:*` 表示查詢以 `foo:` 開頭的鍵值。
這種方式比純 Redis 查詢效率要高,但仍然存在一些問題。Lua 腳本可能比原汁原味的 Redis 命令慢;Lua 腳本過長可能會導(dǎo)致客戶端和服務(wù)器之間的通訊帶寬被耗盡;該腳本仍然需要掃描整個 Redis 數(shù)據(jù)庫,對于大型數(shù)據(jù)集,仍會產(chǎn)生較大的負(fù)擔(dān)。
三、Redis 與 Redisearch 的模糊查詢
對于企業(yè)級別的 Redis 查詢,Redisearch 是一個不錯的建議。Redisearch 是一個基于 Redis 的全文搜索引擎,支持模糊查詢、原子全文搜索、高亮以及排名等功能。其中,針對模糊查詢,Redisearch 提供了以下功能:
FT.SEARCH
FT.SUGGGET [FUZZY [MAX RESULTS ] [PREFIX]]
其中,`FT.SEARCH` 支持基于某個查詢的全文搜索,支持模糊查詢、原子全文搜索以及排名等功能;`FT.SUGGGET` 則支持自動完成,支持模糊匹配和前綴匹配。
例如,我們使用以下命令創(chuàng)建一個索引:
FT.CREATE myindex ON NOFIELDS PREFIX 1 "foo:" SCHEMA name TEXT
然后,我們可以使用以下命令進(jìn)行模糊查詢:
FT.SEARCH myindex foo* LIMIT 0 100
其中,`foo*` 表示以 `foo` 開頭的字符串,`LIMIT 0 100` 表示查詢結(jié)果從 0 開始,返回 100 個結(jié)果。
Redisearch 的優(yōu)點在于模糊查詢效率高、精度高,支持前綴匹配、模糊匹配等靈活查詢方式。但是缺點是需要預(yù)先創(chuàng)建索引,在數(shù)據(jù)集變化后需要及時維護索引,否則可能會導(dǎo)致查詢失敗。
總體而言,Redis 模糊查詢在性能和靈活度上都有不足之處,我們需要根據(jù)實際情況選擇適合的查詢方式。了解以上幾種方法,我們可以在實際使用中根據(jù)實際需要和數(shù)據(jù)集大小選擇最適合自己的查詢方式。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享文章:慢性癥Redis模糊查詢之苦(redis模糊查詢很慢)
標(biāo)題路徑:http://m.fisionsoft.com.cn/article/cophsii.html


咨詢
建站咨詢
