在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Redis的分頁+多條件模糊查詢組合實現方案

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-11-20 14:26 ? 次閱讀

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

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

注:本文只提供實現思路,并不提供實現的代碼

本文將從四個部分進行說明:

分頁實現

模糊條件查詢實現

分頁和模糊條件查詢的組合實現

優化方案

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

Redis的分頁實現

我們通常習慣于在Mysql、Oracle這樣持久化數據庫中實現分頁查詢,但是基于某些特殊的業務場景下,我們的數據并未持久化到了數據庫中或是出于查詢速度上的考慮將熱點數據加載到了緩存數據庫中。因此,我們可能需要基于Redis這樣的緩存數據庫去進行分頁查詢。

Redis的分頁查詢的實現是基于Redis提供的ZSet數據結構實現的,ZSet全稱為Sorted Set,該結構主要存儲有序集合。下面是它的指令描述以及該指令在分頁實現中的作用:

ZADD :SortedSet的添加元素指令ZADD key score member [[score,member]…]會給每個添加的元素member綁定一個用于排序的值score,SortedSet就會根據score值的大小對元素進行排序。我們為通常習慣于將數據的時間屬性當作score用于排序,當然大家也可以根據具體的業務場景去選擇排序的目標。

ZREVRANGE :SortedSet中的指令ZREVRANGE key start stop可以返回指定區間內的成員,可以用來做分頁。

ZREM :SortedSet的指令ZREM key member可以根據key移除指定的成員,能滿足刪評論的要求。

所以SortedSet用來做分頁是非常適合的。下面是分頁實現的演示圖,包含插入新記錄后的查詢情況。

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

事實上,Redis中的List結構也是可以實現分頁,但List無法實現自動排序,并且Zset還可以根據score進行數據篩選,取出目標score區間內數據。

所以在實現上,ZSet往往更加適合我們。當然如果你需要插入重復數據的情況下,分頁就可能就需要借助List來實現了。具體使用那種結構來實現分頁還是需要根據實際的業務場景來進行選擇的。

Redis的多條件模糊查詢實現

Redis是key-value類型的內存數據庫,通過key直接取數據雖然很方便,但是并未提供像mysql那樣方便的sql條件查詢支持。因此我們需要借助Redis提供的結構和功能去自己實現模糊條件查詢功能。

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

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

查詢所有性別為女的用戶

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

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

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

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

Redis的分頁+多條件模糊查詢組合實現

前面分別單獨敘述了如何實現Redis的分頁和多條件某查詢。在實際使用中,單獨使用ZSet實現分頁已經能夠展現不錯的性能了,但存在一個問題是我們所分頁的數據往往是伴隨著一些動態的篩選條件的,而ZSet并不提供這樣的功能。

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

如果數據已經存儲在了持久化數據庫中,我們可以每次在數據庫中做好條件查詢再將數據放入Redis中進行分頁。

在Redis中實現多條件模糊查詢并分頁。

前者方案其實是一個不錯的選擇,但缺點在于數據有時候并不一定都在持久化數據庫中。在有些業務場景下,我們的數據為了展現更好的并發性以及高響應,我們的數據會先放置在緩存數據庫中,等到某個時間或者滿足某種條件時再持久化到數據庫中。

在這種情況下我們第一個方案就不起作用了,需要使用第二個方案。因此,下面將介紹如何實現多條件模糊查詢的基礎上進行分頁。

實現思路

首先我們可以采用多條件模糊查詢章節所說的方式,將我們所涉及到的條件字段作為hash的field,而數據的內容則作為對應value進行存儲(一般以json格式存儲,方便反序列化)。

我們需要實現約定好查詢的格式,用前面一節的例子來說,field中的命名規則為:<姓名>:<性別>,我們每次可以通過"*"來實現我們希望的模糊匹配條件,比如“*:*:男”就是匹配所有男性數據,“100*:*:*”就是匹配所有id前綴為100的用戶。

當我們拿到了匹配串后我們先去Redis中尋找是否存在以該匹配串為key的ZSet,如果沒有則通過Redis提供的HSCAN遍歷所有hash的field,得到所有符合條件的field,并將其放入一個ZSet集合,同時將這個集合的key設置為我們的條件匹配串。如果已經存在了,則直接對這個ZSet進行分頁查詢即可。對ZSet進行分頁的方式已經在前面敘述過了。通過這樣的方式我們就實現了最簡單的分頁+多條件模糊查詢。

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

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

性能優化方案

雖然上文實現了多條件模糊查詢+分頁的功能,但是在時間開發中,我們不能無限制的生成新的集合,因為匹配串是很多樣化的,這會給緩存帶來巨大的壓力。

因此我們在生成集合時可以賦予這個集合一個過期時間,到期集合會自動銷毀。因為根據時間局部性原理,我們在一段時間內不訪問的數據大概率在很長一頓時間內也不會再訪問。而對于命中的集合,我們將更新其過期時間。

同時,我們數據的實時性也是一個問題,因為我們的集合是在生成集合時的Hash內容決定的,對于新插入到Hash的數據,集合是無法探知的,因此有兩種解決方案:

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

第二種方式是定時更新,這種方式比較省力,但無法保證分頁數據的實時性。因此具體怎么選擇還是取決于業務場景。

總結

本文大概地描述了實現分頁和多條件模糊查詢的方案,希望能夠對大家有所幫助。

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3901

    瀏覽量

    65777
  • Oracle
    +關注

    關注

    2

    文章

    299

    瀏覽量

    35818
  • MySQL
    +關注

    關注

    1

    文章

    849

    瀏覽量

    27539
  • Redis
    +關注

    關注

    0

    文章

    385

    瀏覽量

    11325

原文標題:Redis實現分頁+多條件模糊查詢組合方案!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    labview 多條件結構

    1.請問一下條件結構怎樣多條件輸入,比如說隨機數節點隨機產生0到1的數,當我獲取到0.2,0.55,0.9三個數的時候,開始執行后面的程序。這個多條件不同步怎么實現的呢
    發表于 04-06 20:26

    JPA分頁查詢的常用方法

    JPA分頁查詢條件分頁查詢
    發表于 10-23 17:10

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

    討教一個問題: 多條件查詢. 前面板有一個多列列表框, 需要對其中5個列的內容進行查詢, 比方說這 5列 分別是 籍貫, 性別, 入職日期, 省份, 成績.. 可能查詢
    發表于 06-05 14:14

    XML數據分頁索引技術研究

    對海量XML文檔的索引查詢技術進行研究,提出一種XML數據分頁索引查詢實現方法。該方法把頁面元素標記數量作為數據分頁依據,建立XML數據的
    發表于 03-31 10:07 ?10次下載

    Delphi教程之標準/模糊查詢

    Delphi教程之標準/模糊查詢,學習Delphi的必備資料。
    發表于 03-31 11:29 ?2次下載

    Jquery簡單分頁實現

    這篇文章主要介紹了Jquery簡單分頁實現方法,實例分析了jquery分頁的相關實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下。
    發表于 11-28 11:55 ?1133次閱讀

    多條件型非對稱跨加密系統的代理重加密方案

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

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

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

    SQL存儲過程進行多條件查詢實例說明

    本文檔的主要內容詳細介紹的是SQL數據庫存儲過程進行多條件查詢實例說明。
    發表于 09-17 10:29 ?2次下載

    MyBatis流式查詢輕松幫你解決分頁慢的問題

    結果。流式查詢的好處是能夠降低內存使用。 如果沒有流式查詢,我們想要從數據庫取 1000 萬條記錄而又沒有足夠的內存時,就不得不分頁查詢,而分頁
    的頭像 發表于 08-04 15:52 ?4536次閱讀

    聊聊分頁列表緩存設計

    這是最簡單易懂的方案,我們按照不同的分頁條件查詢出結果后,直接緩存分頁結果 。
    的頭像 發表于 06-06 18:25 ?914次閱讀
    聊聊<b class='flag-5'>分頁</b>列表緩存設計

    python if 多條件并列判斷

    一下Python中最常用的多條件判斷方法——邏輯運算符。邏輯運算符包括and、or和not。我們可以將多個條件使用邏輯運算符鏈接起來,以實現多條件并列判斷。 and運算符:只有所有
    的頭像 發表于 11-21 16:40 ?2429次閱讀

    sql語句where條件查詢

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

    mybatis邏輯分頁和物理分頁的區別

    這兩種分頁方式的區別。 邏輯分頁是在數據庫中執行查詢時使用的一種分頁方式。這種方式是通過在查詢語句中添加LIMIT或OFFSET關鍵字來限制
    的頭像 發表于 12-03 14:54 ?1182次閱讀

    分庫分表后復雜查詢的應對之道:基于DTS實時性ES寬表構建技術實踐

    分表,通過分庫分表應對存系統讀寫性能瓶頸和存儲瓶頸;分庫分表幫我們解決問題的同時,也帶來了復雜性;比如多條件分頁查詢多條件的聯表查詢變得
    的頭像 發表于 06-25 18:30 ?1261次閱讀
    分庫分表后復雜<b class='flag-5'>查詢</b>的應對之道:基于DTS實時性ES寬表構建技術實踐
    主站蜘蛛池模板: 精品一精品国产一级毛片 | 成人中文字幕一区二区三区 | 免费在线成人 | 天堂视频在线观看 | 两性色午夜视频免费网 | 国产卡一卡2卡三卡免费视频 | 丁香六月婷婷综合 | 国产三级精品三级在线观看 | 在线天堂资源www中文在线 | 久久是精品 | 深夜大尺度视频在线观看 | 91精品国产91久久久久久青草 | 国产女同视频 | 四虎三级| 天天影视欧美综合在线观看 | 91夜夜人人揉人人捏人人添 | 国产一区二区高清 | 卡一卡二卡三国色天香永不失联 | 国产亚洲精品激情都市 | www.福利| 日韩欧美亚洲综合久久影院d3 | 色性网| 午夜无码国产理论在线 | 黄色一级a毛片 | 有没有免费的视频在线观看 | 成人午夜大片免费7777 | 天天操天天舔天天干 | 日本高清视频色www在线观看 | 国产精品嫩草影院一二三区入口 | 亚洲精品精品一区 | 亚洲日本黄色 | 97精品久久天干天天蜜 | 深爱激情成人 | 久久精品视频免费观看 | 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | 欧美一卡二卡科技有限公司 | 大量国产后进翘臀视频 | 亚洲精品视频专区 | 一区二区三区四区欧美 | 天天摸夜夜摸夜夜狠狠摸 | 亚洲人成在线精品不卡网 |