欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis的分頁(yè)+多條件模糊查詢組合實(shí)現(xiàn)方案

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-11-20 14:26 ? 次閱讀

Redis是一個(gè)高效的內(nèi)存數(shù)據(jù)庫(kù),它支持包括String、List、Set、SortedSet和Hash等數(shù)據(jù)類型的存儲(chǔ),在Redis中通常根據(jù)數(shù)據(jù)的key查詢其value值,Redis沒(méi)有模糊條件查詢,在面對(duì)一些需要分頁(yè)、排序以及條件查詢的場(chǎng)景時(shí)(如評(píng)論,時(shí)間線,檢索等),只憑借Redis所提供的功能就不太好不處理了。

本文不對(duì)Redis的特性做過(guò)多贅述。由于之前基于業(yè)務(wù)問(wèn)題需要實(shí)現(xiàn)基于Redis的條件查詢和分頁(yè)功能,在百度上查詢了不少文章,基本不是只有分頁(yè)功能就是只有條件查詢功能的實(shí)現(xiàn),缺少兩者組合的解決方案。因此,本文將基于Redis提供條件查詢+分頁(yè)的技術(shù)解決方案。

注:本文只提供實(shí)現(xiàn)思路,并不提供實(shí)現(xiàn)的代碼

本文將從四個(gè)部分進(jìn)行說(shuō)明:

分頁(yè)實(shí)現(xiàn)

模糊條件查詢實(shí)現(xiàn)

分頁(yè)和模糊條件查詢的組合實(shí)現(xiàn)

優(yōu)化方案

大家可以直接跳到自己需要的部分進(jìn)行閱讀。

Redis的分頁(yè)實(shí)現(xiàn)

我們通常習(xí)慣于在Mysql、Oracle這樣持久化數(shù)據(jù)庫(kù)中實(shí)現(xiàn)分頁(yè)查詢,但是基于某些特殊的業(yè)務(wù)場(chǎng)景下,我們的數(shù)據(jù)并未持久化到了數(shù)據(jù)庫(kù)中或是出于查詢速度上的考慮將熱點(diǎn)數(shù)據(jù)加載到了緩存數(shù)據(jù)庫(kù)中。因此,我們可能需要基于Redis這樣的緩存數(shù)據(jù)庫(kù)去進(jìn)行分頁(yè)查詢。

Redis的分頁(yè)查詢的實(shí)現(xiàn)是基于Redis提供的ZSet數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,ZSet全稱為Sorted Set,該結(jié)構(gòu)主要存儲(chǔ)有序集合。下面是它的指令描述以及該指令在分頁(yè)實(shí)現(xiàn)中的作用:

ZADD :SortedSet的添加元素指令ZADD key score member [[score,member]…]會(huì)給每個(gè)添加的元素member綁定一個(gè)用于排序的值score,SortedSet就會(huì)根據(jù)score值的大小對(duì)元素進(jìn)行排序。我們?yōu)橥ǔA?xí)慣于將數(shù)據(jù)的時(shí)間屬性當(dāng)作score用于排序,當(dāng)然大家也可以根據(jù)具體的業(yè)務(wù)場(chǎng)景去選擇排序的目標(biāo)。

ZREVRANGE :SortedSet中的指令ZREVRANGE key start stop可以返回指定區(qū)間內(nèi)的成員,可以用來(lái)做分頁(yè)。

ZREM :SortedSet的指令ZREM key member可以根據(jù)key移除指定的成員,能滿足刪評(píng)論的要求。

所以SortedSet用來(lái)做分頁(yè)是非常適合的。下面是分頁(yè)實(shí)現(xiàn)的演示圖,包含插入新記錄后的查詢情況。

01f81b84-8749-11ee-939d-92fbcf53809c.png

事實(shí)上,Redis中的List結(jié)構(gòu)也是可以實(shí)現(xiàn)分頁(yè),但List無(wú)法實(shí)現(xiàn)自動(dòng)排序,并且Zset還可以根據(jù)score進(jìn)行數(shù)據(jù)篩選,取出目標(biāo)score區(qū)間內(nèi)數(shù)據(jù)。

所以在實(shí)現(xiàn)上,ZSet往往更加適合我們。當(dāng)然如果你需要插入重復(fù)數(shù)據(jù)的情況下,分頁(yè)就可能就需要借助List來(lái)實(shí)現(xiàn)了。具體使用那種結(jié)構(gòu)來(lái)實(shí)現(xiàn)分頁(yè)還是需要根據(jù)實(shí)際的業(yè)務(wù)場(chǎng)景來(lái)進(jìn)行選擇的。

Redis的多條件模糊查詢實(shí)現(xiàn)

Redis是key-value類型的內(nèi)存數(shù)據(jù)庫(kù),通過(guò)key直接取數(shù)據(jù)雖然很方便,但是并未提供像mysql那樣方便的sql條件查詢支持。因此我們需要借助Redis提供的結(jié)構(gòu)和功能去自己實(shí)現(xiàn)模糊條件查詢功能。

事實(shí)上,Redis的模糊條件查詢是基于Hash實(shí)現(xiàn)的,我們可以將數(shù)據(jù)的某些條件值作為hash的key值,并數(shù)據(jù)本身作為value進(jìn)行存儲(chǔ)。然后通過(guò)Hash提供的HSCAN指令去遍歷所有的key進(jìn)行篩選,得到我們符合條件的所有key值(hscan可以進(jìn)行模式匹配)。

為了方便,我們通常將符合條件的key全部放入到一個(gè)Set或是List中。這樣一來(lái),我們就可以根據(jù)得到的key值去取出相應(yīng)的數(shù)據(jù)了。下面是模糊查詢的演示圖(其中field中的命名規(guī)則為:<姓名>:<性別>,value為用戶詳情的json串)。

查詢所有性別為女的用戶

0205c4f0-8749-11ee-939d-92fbcf53809c.png

查詢所有名字中姓阿的用戶

02136eca-8749-11ee-939d-92fbcf53809c.png

HSCAN雖然為我們提供了模式匹配的功能,但這種匹配是基于遍歷實(shí)現(xiàn)的,每一次匹配都需要遍歷全部的key,效率上并不高。因此在下面一節(jié)會(huì)這方面進(jìn)行補(bǔ)充,本節(jié)只談如何實(shí)現(xiàn)模糊匹配。

Redis的分頁(yè)+多條件模糊查詢組合實(shí)現(xiàn)

前面分別單獨(dú)敘述了如何實(shí)現(xiàn)Redis的分頁(yè)和多條件某查詢。在實(shí)際使用中,單獨(dú)使用ZSet實(shí)現(xiàn)分頁(yè)已經(jīng)能夠展現(xiàn)不錯(cuò)的性能了,但存在一個(gè)問(wèn)題是我們所分頁(yè)的數(shù)據(jù)往往是伴隨著一些動(dòng)態(tài)的篩選條件的,而ZSet并不提供這樣的功能。

面對(duì)這種情況,我們通常有兩種解決方案:

如果數(shù)據(jù)已經(jīng)存儲(chǔ)在了持久化數(shù)據(jù)庫(kù)中,我們可以每次在數(shù)據(jù)庫(kù)中做好條件查詢?cè)賹?shù)據(jù)放入Redis中進(jìn)行分頁(yè)。

在Redis中實(shí)現(xiàn)多條件模糊查詢并分頁(yè)。

前者方案其實(shí)是一個(gè)不錯(cuò)的選擇,但缺點(diǎn)在于數(shù)據(jù)有時(shí)候并不一定都在持久化數(shù)據(jù)庫(kù)中。在有些業(yè)務(wù)場(chǎng)景下,我們的數(shù)據(jù)為了展現(xiàn)更好的并發(fā)性以及高響應(yīng),我們的數(shù)據(jù)會(huì)先放置在緩存數(shù)據(jù)庫(kù)中,等到某個(gè)時(shí)間或者滿足某種條件時(shí)再持久化到數(shù)據(jù)庫(kù)中。

在這種情況下我們第一個(gè)方案就不起作用了,需要使用第二個(gè)方案。因此,下面將介紹如何實(shí)現(xiàn)多條件模糊查詢的基礎(chǔ)上進(jìn)行分頁(yè)。

實(shí)現(xiàn)思路

首先我們可以采用多條件模糊查詢章節(jié)所說(shuō)的方式,將我們所涉及到的條件字段作為hash的field,而數(shù)據(jù)的內(nèi)容則作為對(duì)應(yīng)value進(jìn)行存儲(chǔ)(一般以json格式存儲(chǔ),方便反序列化)。

我們需要實(shí)現(xiàn)約定好查詢的格式,用前面一節(jié)的例子來(lái)說(shuō),field中的命名規(guī)則為:<姓名>:<性別>,我們每次可以通過(guò)"*"來(lái)實(shí)現(xiàn)我們希望的模糊匹配條件,比如“*:*:男”就是匹配所有男性數(shù)據(jù),“100*:*:*”就是匹配所有id前綴為100的用戶。

當(dāng)我們拿到了匹配串后我們先去Redis中尋找是否存在以該匹配串為key的ZSet,如果沒(méi)有則通過(guò)Redis提供的HSCAN遍歷所有hash的field,得到所有符合條件的field,并將其放入一個(gè)ZSet集合,同時(shí)將這個(gè)集合的key設(shè)置為我們的條件匹配串。如果已經(jīng)存在了,則直接對(duì)這個(gè)ZSet進(jìn)行分頁(yè)查詢即可。對(duì)ZSet進(jìn)行分頁(yè)的方式已經(jīng)在前面敘述過(guò)了。通過(guò)這樣的方式我們就實(shí)現(xiàn)了最簡(jiǎn)單的分頁(yè)+多條件模糊查詢。

021eb51e-8749-11ee-939d-92fbcf53809c.png

上圖中,由于并未在緩存數(shù)據(jù)庫(kù)中找到符合的ZSet集合,我們將根據(jù)匹配串生成一個(gè)新的集合用于分頁(yè)。

性能優(yōu)化方案

雖然上文實(shí)現(xiàn)了多條件模糊查詢+分頁(yè)的功能,但是在時(shí)間開(kāi)發(fā)中,我們不能無(wú)限制的生成新的集合,因?yàn)槠ヅ浯呛芏鄻踊?,這會(huì)給緩存帶來(lái)巨大的壓力。

因此我們?cè)谏杉蠒r(shí)可以賦予這個(gè)集合一個(gè)過(guò)期時(shí)間,到期集合會(huì)自動(dòng)銷毀。因?yàn)楦鶕?jù)時(shí)間局部性原理,我們?cè)谝欢螘r(shí)間內(nèi)不訪問(wèn)的數(shù)據(jù)大概率在很長(zhǎng)一頓時(shí)間內(nèi)也不會(huì)再訪問(wèn)。而對(duì)于命中的集合,我們將更新其過(guò)期時(shí)間。

同時(shí),我們數(shù)據(jù)的實(shí)時(shí)性也是一個(gè)問(wèn)題,因?yàn)槲覀兊募鲜窃谏杉蠒r(shí)的Hash內(nèi)容決定的,對(duì)于新插入到Hash的數(shù)據(jù),集合是無(wú)法探知的,因此有兩種解決方案:

第一種是插入到Hash時(shí)同時(shí)再插入到其他相應(yīng)的集合中,保證數(shù)據(jù)一直是最新的,這種方式需要增加特殊前綴用于識(shí)別,否則我們也不清楚到底要插入到哪些集合中。

第二種方式是定時(shí)更新,這種方式比較省力,但無(wú)法保證分頁(yè)數(shù)據(jù)的實(shí)時(shí)性。因此具體怎么選擇還是取決于業(yè)務(wù)場(chǎng)景。

總結(jié)

本文大概地描述了實(shí)現(xiàn)分頁(yè)和多條件模糊查詢的方案,希望能夠?qū)Υ蠹矣兴鶐椭?/p>

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3851

    瀏覽量

    64710
  • Oracle
    +關(guān)注

    關(guān)注

    2

    文章

    296

    瀏覽量

    35244
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    830

    瀏覽量

    26755
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    379

    瀏覽量

    10959

原文標(biāo)題:Redis實(shí)現(xiàn)分頁(yè)+多條件模糊查詢組合方案!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    labview 多條件結(jié)構(gòu)

    1.請(qǐng)問(wèn)一下條件結(jié)構(gòu)怎樣多條件輸入,比如說(shuō)隨機(jī)數(shù)節(jié)點(diǎn)隨機(jī)產(chǎn)生0到1的數(shù),當(dāng)我獲取到0.2,0.55,0.9三個(gè)數(shù)的時(shí)候,開(kāi)始執(zhí)行后面的程序。這個(gè)多條件不同步怎么實(shí)現(xiàn)的呢
    發(fā)表于 04-06 20:26

    JPA分頁(yè)查詢的常用方法

    JPA分頁(yè)查詢條件分頁(yè)查詢
    發(fā)表于 10-23 17:10

    Labview里面多列列表框 如何多條件查詢

    討教一個(gè)問(wèn)題: 多條件查詢. 前面板有一個(gè)多列列表框, 需要對(duì)其中5個(gè)列的內(nèi)容進(jìn)行查詢, 比方說(shuō)這 5列 分別是 籍貫, 性別, 入職日期, 省份, 成績(jī).. 可能查詢
    發(fā)表于 06-05 14:14

    XML數(shù)據(jù)分頁(yè)索引技術(shù)研究

    對(duì)海量XML文檔的索引查詢技術(shù)進(jìn)行研究,提出一種XML數(shù)據(jù)分頁(yè)索引查詢實(shí)現(xiàn)方法。該方法把頁(yè)面元素標(biāo)記數(shù)量作為數(shù)據(jù)分頁(yè)依據(jù),建立XML數(shù)據(jù)的
    發(fā)表于 03-31 10:07 ?10次下載

    Delphi教程之標(biāo)準(zhǔn)/模糊查詢

    Delphi教程之標(biāo)準(zhǔn)/模糊查詢,學(xué)習(xí)Delphi的必備資料。
    發(fā)表于 03-31 11:29 ?2次下載

    Jquery簡(jiǎn)單分頁(yè)實(shí)現(xiàn)

    這篇文章主要介紹了Jquery簡(jiǎn)單分頁(yè)實(shí)現(xiàn)方法,實(shí)例分析了jquery分頁(yè)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下。
    發(fā)表于 11-28 11:55 ?1095次閱讀

    多條件型非對(duì)稱跨加密系統(tǒng)的代理重加密方案

    方將信息加密成IBBE密文,一次性發(fā)送給多個(gè)接收方,其中任一接收方又可以授權(quán)給代理者一個(gè)多條件型的重加密密鑰,代理者利用該多條件型重加密密鑰,能將符合多個(gè)條件的原始密文重加密成一個(gè)新的接收方可以解密的IBE密文。該
    發(fā)表于 12-12 11:25 ?0次下載

    三維模型多條件組合檢索研究

    3個(gè)因素的基礎(chǔ)上,對(duì)本體的語(yǔ)義相似度計(jì)算原理進(jìn)行了研究,同時(shí)對(duì)產(chǎn)品類別、功能或特性進(jìn)行了相似度計(jì)算,實(shí)現(xiàn)了以類別一功能一特性為檢索條件組合式擴(kuò)展查詢
    發(fā)表于 03-26 10:20 ?0次下載
    三維模型<b class='flag-5'>多條件</b><b class='flag-5'>組合</b>檢索研究

    SQL存儲(chǔ)過(guò)程進(jìn)行多條件查詢實(shí)例說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是SQL數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程進(jìn)行多條件查詢實(shí)例說(shuō)明。
    發(fā)表于 09-17 10:29 ?2次下載

    MyBatis流式查詢輕松幫你解決分頁(yè)慢的問(wèn)題

    結(jié)果。流式查詢的好處是能夠降低內(nèi)存使用。 如果沒(méi)有流式查詢,我們想要從數(shù)據(jù)庫(kù)取 1000 萬(wàn)條記錄而又沒(méi)有足夠的內(nèi)存時(shí),就不得不分頁(yè)查詢,而分頁(yè)
    的頭像 發(fā)表于 08-04 15:52 ?4267次閱讀

    聊聊分頁(yè)列表緩存設(shè)計(jì)

    這是最簡(jiǎn)單易懂的方案,我們按照不同的分頁(yè)條件查詢出結(jié)果后,直接緩存分頁(yè)結(jié)果 。
    的頭像 發(fā)表于 06-06 18:25 ?767次閱讀
    聊聊<b class='flag-5'>分頁(yè)</b>列表緩存設(shè)計(jì)

    python if 多條件并列判斷

    一下Python中最常用的多條件判斷方法——邏輯運(yùn)算符。邏輯運(yùn)算符包括and、or和not。我們可以將多個(gè)條件使用邏輯運(yùn)算符鏈接起來(lái),以實(shí)現(xiàn)多條件并列判斷。 and運(yùn)算符:只有所有
    的頭像 發(fā)表于 11-21 16:40 ?1934次閱讀

    sql語(yǔ)句where條件查詢

    的細(xì)節(jié),包括使用的操作符、條件組合、多張表的查詢條件的性能優(yōu)化等方面。 首先,讓我們了解一下WHERE子句中常用的操作符。在SQL中,常用的操作符包括: 比較操作符: 等于(=):
    的頭像 發(fā)表于 11-23 11:28 ?1290次閱讀

    mybatis邏輯分頁(yè)和物理分頁(yè)的區(qū)別

    這兩種分頁(yè)方式的區(qū)別。 邏輯分頁(yè)是在數(shù)據(jù)庫(kù)中執(zhí)行查詢時(shí)使用的一種分頁(yè)方式。這種方式是通過(guò)在查詢語(yǔ)句中添加LIMIT或OFFSET關(guān)鍵字來(lái)限制
    的頭像 發(fā)表于 12-03 14:54 ?984次閱讀

    分庫(kù)分表后復(fù)雜查詢的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬表構(gòu)建技術(shù)實(shí)踐

    分表,通過(guò)分庫(kù)分表應(yīng)對(duì)存系統(tǒng)讀寫性能瓶頸和存儲(chǔ)瓶頸;分庫(kù)分表幫我們解決問(wèn)題的同時(shí),也帶來(lái)了復(fù)雜性;比如多條件分頁(yè)查詢,多條件的聯(lián)表查詢變得
    的頭像 發(fā)表于 06-25 18:30 ?913次閱讀
    分庫(kù)分表后復(fù)雜<b class='flag-5'>查詢</b>的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬表構(gòu)建技術(shù)實(shí)踐