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

Redis批量查詢的四種方式詳解

 更新時間:2025年10月16日 09:33:58   作者:野生技術(shù)架構(gòu)師  
在高并發(fā)場景下,巧妙地利用緩存批量查詢技巧能夠顯著提高系統(tǒng)性能,熟練掌握細(xì)粒度的緩存使用是每位架構(gòu)師必備的技能,因此,在本文中,我們將深入探討 Redis 中批量查詢的一些技巧,希望能夠給你帶來一些啟發(fā),需要的朋友可以參考下

引言

在高并發(fā)場景下,巧妙地利用緩存批量查詢技巧能夠顯著提高系統(tǒng)性能。

在筆者看來,熟練掌握細(xì)粒度的緩存使用是每位架構(gòu)師必備的技能。因此,在本文中,我們將深入探討 Redis 中批量查詢的一些技巧,希望能夠給你帶來一些啟發(fā)。

圖片

1.為什么需要批量執(zhí)行命令

下圖展示了客戶端與服務(wù)端交互的流程:

圖片

每次客戶端發(fā)送一個一個請求命令,Redis 服務(wù)端接收到命令后,將命令放在隊列內(nèi),一個一個命令執(zhí)行,并將結(jié)果返回。

批量執(zhí)行命令有三點(diǎn)優(yōu)勢:

提高命令執(zhí)行效率

  • 減少了網(wǎng)絡(luò)延遲,從而提高了 Redis 服務(wù)器的響應(yīng)速度。批量執(zhí)行減少了每個命令的單獨(dú)網(wǎng)絡(luò)傳輸開銷,有效降低了往返時間(RTT)。

簡化客戶端邏輯

  • 通過將多個命令封裝成一個操作,客戶端的處理邏輯變得更加簡潔和清晰。這使得客戶端代碼更易讀、易維護(hù)。

提升事務(wù)性能

  • 批量執(zhí)行命令能夠確保一組命令在同一時間內(nèi)執(zhí)行,從而提高了事務(wù)的性能。這對于需要保持原子性的操作尤為重要,確保一組命令要么全部執(zhí)行成功,要么全部失敗。

接下來,我們詳細(xì)講解批量查詢的四種方式。

  • 字符串 MGET命令
  • 哈希表 HMGET命令
  • 管道技術(shù)
  • Lua 腳本

2.字符串 MGET命令

MGET 是 Redis 中的一個命令,用于批量獲取多個字符串鍵的值。它接受一個或多個鍵作為參數(shù),返回與這些鍵關(guān)聯(lián)的值。

以下是一個簡要的描述:

圖片

  • key1key2, ..., keyN:要獲取值的鍵列表。
  • MGET 返回一個包含相應(yīng)值的列表,如果鍵不存在,則對應(yīng)的位置返回 nil

該命令主要用于一次性獲取多個鍵的值,可以減少多次單獨(dú)查詢的開銷,提高效率。

圖片

接下來,我們展示 SpringBoot 項目展示如何使用 MGET 命令。

圖片

圖中,我們分別設(shè)置(key:a , b , c) 三個 key 的值,然后定義一個列表對象 keys, 列表中包含了一個不存在的鍵 "d"。

圖片

當(dāng)我們使用 MULTIGET 命令查看結(jié)果時,發(fā)現(xiàn)返回的結(jié)果是一個列表對象,列表對象的大小是 4,同時第三個對象值為 NULL ,也就是鍵 “d” 對應(yīng)的值為 nil

3.哈希表 HMGET命令

HMGET 是 Redis 中的命令之一,用于獲取哈希表中指定字段的值。

它接受一個哈希表的鍵以及一個或多個字段名作為參數(shù),返回與這些字段名關(guān)聯(lián)的值。以下是 HMGET 命令的基本語法:

圖片

如果給定的域不存在于哈希表,那么返回一個 nil 值。

因?yàn)椴淮嬖诘?nbsp;key 被當(dāng)作一個空哈希表來處理,所以對一個不存在的 key 進(jìn)行 HMGET 操作將返回一個只帶有 nil 值的表。

圖片

接下來,我們展示 SpringBoot 項目展示如何使用 HMGET 命令。

圖片

首先分別設(shè)置鍵為 "myhashkey" 下的三個字段(field)的值 ,然后定義需要查詢的字段集合 fields ,最后調(diào)用哈希表的 HMGET 命令。

圖片

和 MGET命令的結(jié)果類似,spring data redis 會將結(jié)果封裝成 List 對象,列表對象的大小是 4,同時第三個對象值為 NULL ,因?yàn)樽侄?“d” 對應(yīng)的值為 nil。

4.管道技術(shù)

Redis Pipeline(管道)命令是一種優(yōu)化網(wǎng)絡(luò)通信的技術(shù),可以將多個命令一次性發(fā)送給 Redis 服務(wù)器,可以減少客戶端與 Redis 服務(wù)器之間的網(wǎng)絡(luò)通信次數(shù)。

圖片

客戶端將多個命令一次性發(fā)送給 Redis 服務(wù)器,Redis 服務(wù)器緩存這些命令,并一次性執(zhí)行,最后將執(zhí)行結(jié)果一次性返回給客戶端。

通過使用 Redis Pipeline,顯而易見的好處是避免了在每個命令執(zhí)行時都進(jìn)行一次網(wǎng)絡(luò)通信,從而顯著降低了時間開銷。

1 次 pipeline(n條命令) = 1 次網(wǎng)絡(luò)時間 + 執(zhí)行n 條命令時間

接下來,我們展示 SpringBoot 項目展示如何使用 Pipeline 管道命令。

圖片

首先分別設(shè)置三個鍵(key:a, b, c)的值,然后分別設(shè)置鍵為 "myhashkey" 下的三個字段(field)的值, 最后調(diào)用 Pipeline 執(zhí)行多個命令,并獲取結(jié)果。

圖片

需要注意的是:

  • Redis Cluster 中 Pipeline 命令操作可能無法保證原子性!

由于 Redis Cluster 采用的是分片機(jī)制,這些鍵無法保證所有的 key 都在同一區(qū)域的哈希槽上。因此,即使使用了 Pipeline,每個命令仍可能在不同的節(jié)點(diǎn)上進(jìn)行處理,導(dǎo)致多個命令的執(zhí)行不在同一時刻。

  • Pipeline 能執(zhí)行有依賴關(guān)系的命令嗎?

不可以。如果 Pipeline 中后一個命令的執(zhí)行依賴于前一個命令的執(zhí)行結(jié)果,Pipeline 無法滿足這樣的需求。

  • Pipeline 對發(fā)送的命令有數(shù)量限制嗎?

雖然命令可以一次性發(fā)給 Redis 服務(wù)端,但是考慮到帶寬等情況,建議不要超過500個命令,或者根據(jù)實(shí)際命令的數(shù)據(jù)類型和大小進(jìn)行調(diào)整。這樣可以避免潛在的性能問題。

5.Lua 腳本

Redis Lua 腳本是一種在 Redis 服務(wù)器上執(zhí)行的腳本語言,基于 Lua 編程語言。

這種腳本可以包含多個 Redis 命令,而且它們在 Redis 服務(wù)器上以原子性操作的方式執(zhí)行。通過使用 Lua 腳本,你可以在服務(wù)器端執(zhí)行一系列的 Redis 命令,而不需要將它們一條一條地發(fā)送到服務(wù)器。

Redis 執(zhí)行 Lua 腳本有兩種執(zhí)行方式:Eval 和 EvalSHA 。

5.1 Eval

圖片

EVAL命令的執(zhí)行過程主要可以分為三個步驟:

  • 根據(jù)客戶端提供的 Lua 腳本,在 Lua 環(huán)境中定義一個 Lua 函數(shù)。
    Lua 函數(shù)的名稱實(shí)際上是以 "f_" 為前綴加上腳本本身計算出的 SHA1 值,例如 f_ddfsdfjgjbg33rndgj00,其中 SHA1 的長度為40字符。函數(shù)體則是腳本本身。
  • 將客戶端提供的腳本保存到 lua_scripts 字典中。簡單來說,就是添加一個鍵值對,其中鍵是 Lua 腳本的 SHA1 校驗(yàn)和,值是 Lua 腳本本身。這主要是為了以后能夠復(fù)用這個腳本。
  • 執(zhí)行第一步在 Lua 環(huán)境中定義的函數(shù),從而執(zhí)行客戶端提供的 Lua 腳本。這個過程利用了在步驟二中保存的 SHA1 校驗(yàn)和來調(diào)用對應(yīng)的 Lua 函數(shù)。

這個流程使得 Redis 能夠高效地處理客戶端提供的 Lua 腳本,同時通過緩存 SHA1 校驗(yàn)和,可以減少重復(fù)傳輸腳本的開銷,提高效率。

在Redis中,使用了 Key 列表和參數(shù)列表來為Lua腳本提供更多的靈活性,執(zhí)行 Eval 命令的格式為:

圖片

下圖演示下 Lua 如何調(diào)用 Redis 命令 ,通過redis.call()來執(zhí)行了 Redis 命令 。

圖片

5.2 EvalSHA

與 EVAL 不同,EVALSHA 的主要目的是通過腳本的 SHA1 校驗(yàn)和來執(zhí)行預(yù)先在服務(wù)器端加載的 Lua 腳本,從而避免重復(fù)傳輸腳本的開銷。

圖片

使用步驟:

1、加載 Lua 腳本到 Redis 服務(wù)端:

首先,將 Lua 腳本加載到 Redis 服務(wù)端。這可以通過 SCRIPT LOAD 命令完成。執(zhí)行 SCRIPT LOAD 后,會返回一個 SHA1 校驗(yàn)和,該值唯一標(biāo)識了加載的 Lua 腳本。

圖片

這會返回SHA1 校驗(yàn)和: a1104f2250e5dd9fc10c3c681ddb389e7bd4a2cf。

2、執(zhí)行 Lua 腳本:

一旦 Lua 腳本被加載并獲得了 SHA1 校驗(yàn)和,之后就可以使用 EVALSHA 命令來執(zhí)行該腳本。

圖片

5.3 springboot例子

圖片

首先分別設(shè)置三個鍵(key:a, b, c)的值,然后分別設(shè)置鍵為 "myhashkey" 下的三個字段(field)的值, 并編寫 Lua 腳本,執(zhí)行 Lua 腳本并獲取結(jié)果。

6 總結(jié)

本文介紹了Redis 中批量查詢的四種技巧:

1、MGET(批量獲取字符串值):

簡單直接,適用于批量獲取字符串值的場景。

2、HMGET(批量獲取哈希表字段值):

適用于批量獲取哈希表中的字段值,可以在一個命令中獲取多個字段。

3、Pipeline(管道):

最小化網(wǎng)絡(luò)開銷,一次性發(fā)送多個不同的命令,管道中的命令按照執(zhí)行順序依次執(zhí)行,減少往返時間。高并發(fā)場景下,可以顯著提高性能。

4、Lua腳本:

使用 Lua 腳本的好處 :

  • 減少網(wǎng)絡(luò)開銷。將多個請求通過腳本的形式一次發(fā)送,減少網(wǎng)絡(luò)時延。
  • 原子操作。Redis會將整個腳本作為一個整體執(zhí)行,中間不會被其他命令插入。
  • 復(fù)用??蛻舳税l(fā)送的腳本會永久存在 Redis 中,其他客戶端可以復(fù)用這一腳本而不需要使用代碼完成相同的邏輯。

當(dāng)然 使用 Lua 腳本也會有瑕疵,編寫和維護(hù)相對復(fù)雜。

以上就是Redis批量查詢的四種方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Redis批量查詢方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 阿里云服務(wù)器安裝配置redis的方法并且加入到開機(jī)啟動(推薦)

    阿里云服務(wù)器安裝配置redis的方法并且加入到開機(jī)啟動(推薦)

    這篇文章主要介紹了阿里云服務(wù)器安裝配置redis并且加入到開機(jī)啟動,需要的朋友可以參考下
    2017-12-12
  • redis執(zhí)行redis命令的方法教程

    redis執(zhí)行redis命令的方法教程

    這篇文章主要給大家介紹了在redis中執(zhí)行redis命令的方法教程,文中詳細(xì)介紹了關(guān)于Redis 命令及在遠(yuǎn)程服務(wù)上執(zhí)行命令的方法,介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • Redis實(shí)現(xiàn)開機(jī)自啟腳本(linux)

    Redis實(shí)現(xiàn)開機(jī)自啟腳本(linux)

    本段文字主要介紹了在Linux系統(tǒng)中通過創(chuàng)建啟動腳本和修改配置文件來實(shí)現(xiàn)Redis服務(wù)的開機(jī)自啟動,并強(qiáng)調(diào)了使用chkconfig命令的重要性,通過本文,讀者可以掌握Redis服務(wù)在Linux系統(tǒng)中的安裝與配置方法
    2026-06-06
  • Redis安全高效刪除包含特定模式的所有鍵值對的完整方案

    Redis安全高效刪除包含特定模式的所有鍵值對的完整方案

    隨著業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫中往往會積累大量臨時數(shù)據(jù)或過期的鍵值對,特別是那些包含特定時間戳或模式的鍵,然而,錯誤的刪除操作可能帶來災(zāi)難性后果,本文將深入探討如何在Redis中安全、高效地刪除包含特定模式的所有鍵值對,,需要的朋友可以參考下
    2026-01-01
  • 深入理解redis中multi與pipeline

    深入理解redis中multi與pipeline

    pipeline 只是把多個redis指令一起發(fā)出去,redis并沒有保證這些指定的執(zhí)行是原子的;multi相當(dāng)于一個redis的transaction的,保證整個操作的原子性,避免由于中途出錯而導(dǎo)致最后產(chǎn)生的數(shù)據(jù)不一致。本文詳細(xì)的介紹,感興趣的可以了解一下
    2021-06-06
  • 如何查看redis服務(wù)的版本

    如何查看redis服務(wù)的版本

    這篇文章主要介紹了如何查看redis服務(wù)的版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 基于Redis6.2.6版本部署Redis?Cluster集群的問題

    基于Redis6.2.6版本部署Redis?Cluster集群的問題

    這篇文章主要介紹了基于Redis6.2.6版本部署Redis?Cluster集群,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Redis分布式鎖的10個坑總結(jié)

    Redis分布式鎖的10個坑總結(jié)

    日常開發(fā)中,經(jīng)常會碰到秒殺搶購等業(yè)務(wù),為了避免并發(fā)請求造成的庫存超賣等問題,我們一般會用到Redis分布式鎖,但是使用Redis分布式鎖,很容易踩坑哦,本文將給大家分析闡述,Redis分布式鎖的10個坑,需要的朋友可以參考下
    2023-05-05
  • 一文詳解Redis中的持久化

    一文詳解Redis中的持久化

    這篇文章主要介紹了一文詳解Redis中的持久化,持久化功能有效地避免因進(jìn)程退出造成的數(shù)據(jù)丟失問題,當(dāng)下次重啟時利用之前持久化的文件即可實(shí)現(xiàn)數(shù)據(jù)恢復(fù)
    2022-09-09
  • Redis?ziplist?壓縮列表的源碼解析

    Redis?ziplist?壓縮列表的源碼解析

    ziplist 是一個經(jīng)過特殊編碼的雙向鏈表,旨在提高內(nèi)存效率,它存儲字符串和整數(shù)值,其中整數(shù)被編碼為實(shí)際整數(shù)而不是一系列字符,這篇文章主要介紹了Redis?ziplist?壓縮列表的源碼解析,需要的朋友可以參考下
    2022-06-06

最新評論

南昌市| 平利县| 合江县| 祁门县| 丽江市| 岳普湖县| 蒲江县| 行唐县| 东海县| 东台市| 林口县| 虎林市| 仁化县| 忻州市| 夏邑县| 淅川县| 宁阳县| 赣州市| 靖安县| 姜堰市| 荣成市| 长海县| 迁西县| 沅陵县| 将乐县| 育儿| 江华| 灵台县| 百色市| 保靖县| 洮南市| 丰原市| 安康市| 巴林右旗| 理塘县| 芦溪县| 陆良县| 安福县| 阜平县| 宿迁市| 郓城县|