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

如何在Redis中實現分頁排序查詢過程解析

 更新時間:2020年07月21日 12:00:41   作者:9.0  
這篇文章主要介紹了如何在Redis中實現分頁排序查詢過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

前段時間在項目中需要將每個主題下的用戶的評論組裝好寫入Redis中,每個主題會有一個topicId,每一條評論會和topicId關聯起來,得到大致的數據模型如下:

{
  topicId: 'xxxxxxxx',
  comments: [
    {
      username: 'niuniu',
      createDate: 1447747334791,
      content: '在Redis中分頁',
      commentId: 'xxxxxxx',
      reply: [
        {
          content: 'yyyyyy'
          username: 'niuniu'
        },
        ...
      ]
    },
    ...
  ]}

將評論數據從MySQL查詢出來組裝好存到Redis后,以后每次就可以從Redis獲取組裝好的評論數據,從上面的數據模型可以看出數據都是key-value型數據,無疑要采用hash進行存儲,但是每次拿取評論數據時需要分頁而且還要按createDate字段進行排序,hash肯定是不能做到分頁和排序的。

那么,就挨個看一下Redis所支持的數據類型:

Hash

主要用于存儲key-value型數據,評論模型中全是key-value型數據,所以在這里Hash無疑會用到。

List

主要用于存儲一個列表,列表中的每一個元素按元素的插入時的順序進行保存,如果我們將評論模型按createDate排好序后再插入List中,似乎就能做到排序了,而且再利用List中的LRANGE key start stop指令還能做到分頁。嗯,到這里List似乎滿足了我們分頁和排序的要求,但是評論還會被刪除,就需要更新Redis中的數據,如果每次刪除評論后都將Redis中的數據全部重新寫入一次,顯然不夠優(yōu)雅,效率也會大打折扣,如果能刪除指定的數據無疑會更好,而List中涉及到刪除數據的就只有LPOP和RPOP這兩條指令,但LPOP和RPOP只能刪除列表頭和列表尾的數據,不能刪除指定位置的數據,所以List也不太適合。

Set

主要存儲無序集合,無序!排除。

SortedSet

主要存儲有序集合,SortedSet的添加元素指令ZADD key score member [[score,member]…]會給每個添加的元素member綁定一個用于排序的值score,SortedSet就會根據score值的大小對元素進行排序,在這里就可以將createDate當作score用于排序,SortedSet中的指令ZREVRANGE key start stop又可以返回指定區(qū)間內的成員,可以用來做分頁,SortedSet的指令ZREM key member可以根據key移除指定的成員,能滿足刪評論的要求,所以,SortedSet在這里是最適合的。

所以,我需要用到的數據類型有SortSet和Hash,SortSet用于做分頁排序,Hash用于存儲具體的鍵值對數據,我畫出了如下的結構圖:


在上圖的SortSet結構中將每個主題的topicId作為set的key,將與該主題關聯的評論的createDate和commentId分別作為set的score和member,commentId的順序就根據createDate的大小進行排列。 當需要查詢某個主題某一頁的評論時,就可主題的topicId通過指令zrevrange topicId (page-1)×10 (page-1)×10+perPage這樣就能找出某個主題下某一頁的按時間排好順序的所有評論的commintId。page為查詢第幾頁的頁碼,perPage為每頁顯示的條數。 當找到所有評論的commentId后,就可以把這些commentId作為key去Hash結構中去查詢該條評論對應的內容。 這樣就利用SortSet和Hash兩種結構在Redis中達到了分頁和排序的目的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 淺談java二進制、十進制、十六進制、字符串之間的相互轉換

    淺談java二進制、十進制、十六進制、字符串之間的相互轉換

    下面小編就為大家?guī)硪黄獪\談二進制、十進制、十六進制、字符串之間的相互轉換。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-06-06
  • log4j與slf4j的使用與區(qū)別詳解

    log4j與slf4j的使用與區(qū)別詳解

    這篇文章主要介紹了log4j與slf4j的使用與區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • java實習--每天打卡十道面試題!

    java實習--每天打卡十道面試題!

    臨近秋招,備戰(zhàn)暑期實習,祝大家每天進步億點點!本篇文章準備了十道java的常用面試題,希望能夠給大家提供幫助,最后祝大家面試成功,進入自己心儀的大廠
    2021-06-06
  • Java解析xml文件遇到特殊符號異常的情況(處理方案)

    Java解析xml文件遇到特殊符號異常的情況(處理方案)

    這篇文章主要介紹了Java解析xml文件遇到特殊符號&會出現異常的解決方案,實現思路很簡單通過在讀取xml文件使用SAX解析前讀取reader,具體實現方法及示例代碼跟隨小編一起看看吧
    2021-05-05
  • Mybatis查詢語句結果集的總結大全

    Mybatis查詢語句結果集的總結大全

    這篇文章主要給大家總結介紹了關于Mybatis查詢語句結果集的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • Java中StopWatch工具類的用法詳解

    Java中StopWatch工具類的用法詳解

    stopWatch 是org.springframework.util 包下的一個工具類,使用它可直觀的輸出代碼執(zhí)行耗時,以及執(zhí)行時間百分比,下面就跟隨小編一起來看看它的具體用法吧
    2024-12-12
  • Flink狀態(tài)和容錯源碼解析

    Flink狀態(tài)和容錯源碼解析

    這篇文章主要為大家介紹了Flink狀態(tài)和容錯源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Java項目中classpath類路徑是什么

    Java項目中classpath類路徑是什么

    classpath指的是類路徑,也就是編譯之后的target文件夾下的WEB-INF/class文件夾,下面這篇文章主要給大家介紹了關于Java項目中classpath類路徑是什么的相關資料,需要的朋友可以參考下
    2023-02-02
  • Java開發(fā)實現飛機大戰(zhàn)

    Java開發(fā)實現飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了Java開發(fā)實現飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java實現任務超時處理方法

    Java實現任務超時處理方法

    任務超時處理是比較常見的需求,Java中對超時任務的處理有兩種方式,在文中給大家詳細介紹,本文重點給大家介紹Java實現任務超時處理方法,需要的朋友可以參考下
    2019-06-06

最新評論

柞水县| 阳信县| 长海县| 格尔木市| 松原市| 丹巴县| 喀喇沁旗| 泸西县| 武邑县| 惠安县| 利川市| 都匀市| 贵港市| 保山市| 兰州市| 阳春市| 社会| 屯留县| 葵青区| 环江| 综艺| 兴海县| 绥阳县| 普定县| 繁昌县| 板桥市| 六盘水市| 阳高县| 叶城县| 临沂市| 临湘市| 行唐县| 凭祥市| 自贡市| 东阿县| 陇西县| 山西省| 凌云县| 永年县| 衡山县| 平邑县|