最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Redis實(shí)現(xiàn)模糊匹配查詢方案

 更新時(shí)間:2025年09月09日 09:20:50   作者:大摩羯先生  
本文探討了使用Redis進(jìn)行高效模糊查詢的設(shè)計(jì)與實(shí)現(xiàn),包括利用Hash表存儲(chǔ)數(shù)據(jù)、通過hscan命令進(jìn)行安全無公害的模糊搜索,以及特殊字符處理策略,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

最近在做一個(gè)模糊匹配查詢的需求,剖析需求本質(zhì)無非就是根據(jù)入?yún)砟:ヅ湎嚓P(guān)數(shù)據(jù)進(jìn)行返回展示。

由于數(shù)據(jù)是存儲(chǔ)在數(shù)據(jù)庫(kù)的,簡(jiǎn)單實(shí)現(xiàn)的話可以考慮使用DB的SQL來進(jìn)行模糊匹配查詢,比較考量的就是如何控制你的SQL以及如果能夠高效命中索引來優(yōu)化SQL來實(shí)現(xiàn)快速查詢了。

由于是全查詢的業(yè)務(wù),而且業(yè)務(wù)場(chǎng)景對(duì)服務(wù)響應(yīng)是有一定要求的,如果簡(jiǎn)單的使用數(shù)據(jù)庫(kù)恐怕后續(xù)峰值難以抗住且也會(huì)影響其他同庫(kù)的讀寫操作,所以這次打算還是使用緩存來解決這種全查詢場(chǎng)景。

Redis的性能非常棒,而且支持多種數(shù)據(jù)結(jié)構(gòu)供開發(fā)者存儲(chǔ)和調(diào)用,而且提供了大量API對(duì)開發(fā)非常友好,而且這些API的內(nèi)部算法也是非常考究的,真的是開發(fā)利器。

1、需求背景

按照漢字以最左匹配原則進(jìn)行模糊匹配,每次返回不超過固定數(shù)量的匹配詞即可。

2、設(shè)計(jì)分析

首先要分析設(shè)計(jì)要解決哪些問題:

Q:高并發(fā)場(chǎng)景下,如何保證服務(wù)可靠且快速響應(yīng)

A:使用Redis做全查詢緩存,DB做數(shù)據(jù)持久化,所有請(qǐng)求打到緩存,保護(hù)DB;若緩存失效,把請(qǐng)求攔截直接返回,發(fā)送MQ異步請(qǐng)求DB數(shù)據(jù)更新緩存;若緩存異常,代碼做兜底控制,如果可以置入動(dòng)態(tài)配置來控制是否兜底查DB,極端情況下直接服務(wù)降級(jí)處理不走DB。

Q:使用Redis哪種數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ)數(shù)據(jù)?

A:首先要考慮需要返回哪些數(shù)據(jù),且這些數(shù)據(jù)的查詢可以支持模糊查詢;由于需求只需要返回名稱和對(duì)應(yīng)ID,決定采用Hash表進(jìn)行存儲(chǔ);且hash表支持模糊查詢命令。

3、數(shù)據(jù)存儲(chǔ)

關(guān)于Redis的命令可以參考http://doc.redisfans.com/index.html

在應(yīng)用啟動(dòng)時(shí),使用hmset進(jìn)行批量全量緩存數(shù)據(jù)更新,這里有個(gè)細(xì)節(jié)點(diǎn),由于是分布式部署,如果不加限制默認(rèn)每臺(tái)機(jī)器啟動(dòng)都會(huì)更新一遍,其實(shí)是沒有必要的,可以做一個(gè)全局分布式鎖進(jìn)行判斷和控制,這個(gè)不難實(shí)現(xiàn)不再細(xì)說。

HMSET key field value [field value ...]

要模糊查什么就把模糊查的作為field就可以了,由于我這里只需要兩個(gè)字段,我就借用哈希表的數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ)了,如果需要更多字段可以研究使用有序集合或者其他數(shù)據(jù)結(jié)構(gòu)。

4、數(shù)據(jù)模糊查詢

使用hscan進(jìn)行模糊查詢,可以使用,優(yōu)缺點(diǎn)分析參考http://doc.redisfans.com/key/scan.html#scan

HSCAN key cursor [MATCH pattern] [COUNT count]

由于hscan使用了游標(biāo),是一個(gè)增量式命令,每次查詢都是返回一部分?jǐn)?shù)據(jù),所以不會(huì)像keys類命令hang住Redis導(dǎo)致服務(wù)短暫停滯,所以它是安全無公害的,只要運(yùn)用得當(dāng),在生產(chǎn)環(huán)境是可以放心使用的,關(guān)于缺點(diǎn)要參考:

  • 同一個(gè)元素可能會(huì)被返回多次。 處理重復(fù)元素的工作交由應(yīng)用程序負(fù)責(zé), 比如說, 可以考慮將迭代返回的元素僅僅用于可以安全地重復(fù)執(zhí)行多次的操作上。
  • 如果一個(gè)元素是在迭代過程中被添加到數(shù)據(jù)集的, 又或者是在迭代過程中從數(shù)據(jù)集中被刪除的, 那么這個(gè)元素可能會(huì)被返回, 也可能不會(huì), 這是未定義的(undefined)。

在使用過程中仔細(xì)研究這個(gè)命令的底層實(shí)現(xiàn),根據(jù)實(shí)際業(yè)務(wù)場(chǎng)景去使用。

業(yè)務(wù)底層還是需要封裝下hscan命令,由于是游標(biāo)查詢,最開始cursor我們都設(shè)置為0就好,每次從0開始查詢,count來控制每次遍歷的數(shù)量,由于這個(gè)命令執(zhí)行的時(shí)間復(fù)雜度是O(N),所以count越大,每次執(zhí)行時(shí)間理論上會(huì)越長(zhǎng),可以根據(jù)實(shí)際場(chǎng)景進(jìn)行調(diào)整,在遍歷時(shí)候判斷返回的游標(biāo)cursor是否為0,如果為0代表整個(gè)遍歷結(jié)束。

目前只使用到最左匹配模糊查詢,如上圖,我試了下最右匹配、中間模糊也是可以查詢到的,可以支持后續(xù)其他業(yè)務(wù)訴求。

5、特殊字符處理

由于一般我們檢索的名稱是漢字,存儲(chǔ)到Redis可能會(huì)有環(huán)境問題導(dǎo)致亂碼,我目前的處理是把漢字轉(zhuǎn)ASCII碼進(jìn)行存儲(chǔ),同樣查詢的時(shí)候也是轉(zhuǎn)ASCII碼進(jìn)行查詢,這樣可以解決漢字或者編碼帶來的亂碼問題。

補(bǔ)充:Redis 數(shù)據(jù)庫(kù)keys 命令的模糊查詢

Redis 數(shù)據(jù)庫(kù)keys 命令的模糊查詢

1、支持的通配符

第一種:*
第二種:?
第三種:[]

2、* 通配符

1、單個(gè) * 模式

// 查詢所有的key
keys * 

2、雙 * 模式,匹配任意多個(gè)字符

// key中含有keyword 的key
keys *keyword*

3、?通配符

作用是匹配一個(gè)字符

1、單個(gè)?匹配

// 你知道前面的一些字母,忘記了最后一個(gè)字母
keys hell?

2、多?匹配

// 你只記得第一個(gè)字母是h,他的長(zhǎng)度是5
keys h????

4、[ ]匹配

作用是匹配括號(hào)內(nèi)的一個(gè)字符

// 你知道前面四個(gè)字母,最后一個(gè)字母有可能是o p t 其中的一個(gè)
keys hell[opt]

到此這篇關(guān)于使用Redis實(shí)現(xiàn)模糊匹配查詢方案的文章就介紹到這了,更多相關(guān)Redis模糊匹配查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis教程之代理ip池設(shè)計(jì)方法詳解

    Redis教程之代理ip池設(shè)計(jì)方法詳解

    這篇文章主要介紹了Redis實(shí)現(xiàn)代理ip池的設(shè)計(jì)方法,文中給出了詳細(xì)的介紹與示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。
    2017-01-01
  • Redis緩存鍵清理問題解決

    Redis緩存鍵清理問題解決

    對(duì)于使用redis作為緩存服務(wù)器的開發(fā)者而言,定期清除redis中的緩存數(shù)據(jù)是非常必要的,本文主要介紹了Redis緩存鍵清理問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • redis的模糊查詢提高效率的核心策略

    redis的模糊查詢提高效率的核心策略

    Redis是一個(gè)高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),經(jīng)常用于緩存、消息隊(duì)列等場(chǎng)景,然而,Redis?本身并不直接支持復(fù)雜的查詢,比如多條件模糊查詢,下面給大家講解redis的模糊查詢提高效率的核心策略,感興趣的朋友一起看看吧
    2025-07-07
  • Deepin UOS編譯安裝Redis的實(shí)現(xiàn)步驟

    Deepin UOS編譯安裝Redis的實(shí)現(xiàn)步驟

    本文主要介紹了Deepin UOS編譯安裝Redis的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 使用Jedis面臨的非線程安全問題詳解

    使用Jedis面臨的非線程安全問題詳解

    網(wǎng)上都說jedis實(shí)例是非線程安全的,常常通過JedisPool連接池去管理實(shí)例,在多線程情況下讓每個(gè)線程有自己獨(dú)立的jedis實(shí)例,但都沒有具體說明為啥jedis實(shí)例時(shí)非線程安全的,本文就來和大家詳細(xì)說說
    2022-12-12
  • 多維度深入分析Redis的5種基本數(shù)據(jù)結(jié)構(gòu)

    多維度深入分析Redis的5種基本數(shù)據(jù)結(jié)構(gòu)

    此篇文章主要對(duì)Redis的5種基本數(shù)據(jù)類型,即字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted?Set),從使用場(chǎng)景和底層結(jié)構(gòu)出發(fā),進(jìn)行多維度深入分析。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Redis教程(十三):管線詳解

    Redis教程(十三):管線詳解

    這篇文章主要介紹了Redis教程(十三):管線詳解,本文講解了請(qǐng)求應(yīng)答協(xié)議和RTT、管線(pipelining)、Benchmark等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • redis集群實(shí)現(xiàn)清理前綴相同的key

    redis集群實(shí)現(xiàn)清理前綴相同的key

    這篇文章主要介紹了redis集群實(shí)現(xiàn)清理前綴相同的key,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Redis 數(shù)據(jù)庫(kù)忘記密碼找回或重置的解決方法

    Redis 數(shù)據(jù)庫(kù)忘記密碼找回或重置的解決方法

    對(duì)于 Redis 數(shù)據(jù)庫(kù),如果忘記了密碼,可以通過密碼重置來找回密碼,今天通過本文給大家分享Redis 數(shù)據(jù)庫(kù)忘記密碼找回或重置的解決方法,感興趣的朋友一起看看吧
    2024-01-01
  • RedisTemplate常用操作方法總結(jié)(set、hash、list、string等)

    RedisTemplate常用操作方法總結(jié)(set、hash、list、string等)

    本文主要介紹了RedisTemplate常用操作方法總結(jié),主要包括了6種常用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論

横山县| 邯郸县| 元氏县| 于田县| 福建省| 道孚县| 宝兴县| 民乐县| 昔阳县| 呼伦贝尔市| 云梦县| 商水县| 武鸣县| 崇阳县| 于都县| 池州市| 库伦旗| 锦州市| 西吉县| 本溪市| 综艺| 舟曲县| 韶关市| 宿州市| 军事| 康乐县| 双牌县| 隆尧县| 巴中市| 高阳县| 邛崃市| 天津市| 紫云| 资源县| 诸暨市| 楚雄市| 久治县| 钟祥市| 大港区| 岳西县| 夏津县|