欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis批量操作pipeline管道操作方法

 更新時(shí)間:2022年09月29日 14:42:01   作者:西京刀客  
Redis本身是基于一個(gè)Request一個(gè)Response方式的同步請(qǐng)求,正常情況下,客戶端發(fā)送一個(gè)命令,這篇文章主要介紹了redis批量操作pipeline管道,需要的朋友可以參考下

redis | pipeline(管道)

背景

Redis是一種基于客戶端-服務(wù)端模型以及請(qǐng)求/響應(yīng)的TCP服務(wù)。這意味著通常情況下一個(gè)請(qǐng)求會(huì)遵循以下步驟:

  • 客戶端向服務(wù)端發(fā)送一個(gè)查詢請(qǐng)求,并監(jiān)聽(tīng) Socket 返回,通常是以阻塞模式,等待服務(wù)端響應(yīng)。
  • 服務(wù)端處理命令,并將結(jié)果返回給客戶端。

Redis 客戶端與 Redis 服務(wù)器之間使用 TCP 協(xié)議進(jìn)行連接,一個(gè)客戶端可以通過(guò)一個(gè) socket 連接發(fā)起多個(gè)請(qǐng)求命令。每個(gè)請(qǐng)求命令發(fā)出后 client 通常會(huì)阻塞并等待 redis 服務(wù)器處理,redis 處理完請(qǐng)求命令后會(huì)將結(jié)果通過(guò)響應(yīng)報(bào)文返回給 client,因此當(dāng)執(zhí)行多條命令的時(shí)候都需要等待上一條命令執(zhí)行完畢才能執(zhí)行。

Redis本身是基于一個(gè)Request一個(gè)Response方式的同步請(qǐng)求,正常情況下,客戶端發(fā)送一個(gè)命令,等待Redis服務(wù)器返回結(jié)果,Redis服務(wù)器接收到命令,處理后響應(yīng)結(jié)果給客戶端。

無(wú)論網(wǎng)絡(luò)延如何延時(shí),數(shù)據(jù)包總是能從客戶端到達(dá)服務(wù)器,并從服務(wù)器返回?cái)?shù)據(jù)回復(fù)客戶端。 這個(gè)時(shí)間被稱之為 RTT (Round Trip Time - 往返時(shí)間)。

如果同時(shí)需要執(zhí)行大量的命令,那么就要等待上一條命令應(yīng)答后再執(zhí)行,這中間不僅僅多了RTT(Round Time Trip),而且還頻繁調(diào)用系統(tǒng)IO,發(fā)送網(wǎng)絡(luò)請(qǐng)求,同時(shí)需要redis調(diào)用多次read() 和write()系統(tǒng)方法,系統(tǒng)方法會(huì)將數(shù)據(jù)從用戶態(tài)轉(zhuǎn)移到內(nèi)核態(tài),這樣就會(huì)對(duì)進(jìn)程上下文有比較大的影響了。

什么是流水線(pipeline)

官網(wǎng):https://redis.io/docs/manual/pipelining/

管道(pipeline)可以一次性發(fā)送多條命令并在執(zhí)行完后一次性將結(jié)果返回,pipeline 通過(guò)減少客戶端與 redis 的通信次數(shù)來(lái)實(shí)現(xiàn)降低往返延時(shí)時(shí)間,而且 Pipeline 實(shí)現(xiàn)的原理是隊(duì)列,而隊(duì)列的原理是時(shí)先進(jìn)先出,這樣就保證數(shù)據(jù)的順序性。

通俗點(diǎn):pipeline就是把一組命令進(jìn)行打包,然后一次性通過(guò)網(wǎng)絡(luò)發(fā)送到Redis。同時(shí)將執(zhí)行的結(jié)果批量的返回回來(lái)。

pipeline,將多個(gè)命令一次執(zhí)行,一次發(fā)送出去,節(jié)省網(wǎng)絡(luò)時(shí)間。 pipeline技術(shù)最顯著的優(yōu)勢(shì)是提高了 redis 服務(wù)的性能。

管道技術(shù)并不是Redis特有的技術(shù),管道技術(shù)往往需要客戶端-服務(wù)器的共同配合,大部分工作任務(wù)其實(shí)是在客戶端完成,很顯然Redis支持管道技術(shù),按照官網(wǎng)的意思,Redis的最低版本就考慮了管道技術(shù)的支持性設(shè)計(jì)。

如下圖,多個(gè)連續(xù)的incr指令,使用pipeline(管道)后,多個(gè)連續(xù)的incr指令只會(huì)花費(fèi)一次網(wǎng)絡(luò)來(lái)回開(kāi)銷,這個(gè)開(kāi)銷會(huì)隨著n數(shù)值的增大,大幅減少網(wǎng)絡(luò)io開(kāi)銷,從而提升整體服務(wù)的性能。管道技術(shù)優(yōu)化的是網(wǎng)絡(luò)傳輸?shù)暮臅r(shí)時(shí)間。

總結(jié):使用管道技術(shù)可以解決多個(gè)命令執(zhí)行時(shí)的網(wǎng)絡(luò)等待,它是把多個(gè)命令整合到一起發(fā)送給服務(wù)器端處理之后統(tǒng)一返回給客戶端,這樣就免去了每條命令執(zhí)行后都要等待的情況,從而有效地提高了程序的執(zhí)行效率,但使用管道技術(shù)也要注意避免發(fā)送的命令過(guò)大,或管道內(nèi)的數(shù)據(jù)太多而導(dǎo)致的網(wǎng)絡(luò)阻塞。

適用場(chǎng)景

如果出現(xiàn)集中大批量的請(qǐng)求時(shí),因?yàn)槊總€(gè)請(qǐng)求都要經(jīng)歷先請(qǐng)求再響應(yīng)的過(guò)程,這就會(huì)造成網(wǎng)絡(luò)資源浪費(fèi),此時(shí)就需要管道技術(shù)來(lái)把所有的命令整合一次發(fā)給服務(wù)端,再一次響應(yīng)給客戶端,這樣就能大大的提升了 Redis 的響應(yīng)速度。

要求實(shí)時(shí)性也沒(méi)那么高,但是最求高性能,這時(shí)候用 pipeline 最好了。

benchmark壓測(cè)pipeline

使用Redis提供的benchmark對(duì)Redis進(jìn)行性能測(cè)試,
如過(guò)你是Windows下的Redis,在安裝目錄下有個(gè)redis-benchmark.exe,進(jìn)入cmd命令模式測(cè)試即可。
如果你是在Linux下的redis,在安裝目錄的src目錄下有個(gè)redis-benchmark

通過(guò)普通方式測(cè)試set指令和pipeline方式測(cè)試set指令,可以看到Redis服務(wù)不同的QPS:

普通set方式,Redis QPS 大概在5.3萬(wàn)左右
當(dāng)使用pipeline set時(shí),隨著管道內(nèi)并行請(qǐng)求數(shù)量的增加,Redis QPS可以達(dá)到100萬(wàn)以上

代碼測(cè)試-python: StrictRedis

#引入模塊
#這個(gè)模塊中提供了StrictRedis對(duì)象,?于連接redis服務(wù)器,并按照不同類型提供 了不同?法,進(jìn)?交互操作

from redis import StrictRedis

我們使用 StrictRedis客戶端提供的 Pipeline 對(duì)象來(lái)實(shí)現(xiàn)管道技術(shù)。首先先獲取 Pipeline 對(duì)象,再為 Pipeline 對(duì)象設(shè)置需要執(zhí)行的命令,最后再使用excute() 方法來(lái)統(tǒng)一執(zhí)行這些命令,代碼如下:

from redis import StrictRedis
redis_cli = StrictRedis(host="xx", port=xx, password="xx", db=xx, decode_responses=True)
import time
def main():
    t1 = time.time()
    pipe = redis_cli.pipeline()
    num = 1
    for i in range(100):
        pipe.set("name_" + str(num), num)
        pipe.delete("name_" + str(num))
        num += 1
    pipe.execute()
    t2 = time.time()
    print(t2-t1)

接下來(lái)我們用普通的命令執(zhí)行此循環(huán),看下程序的執(zhí)行時(shí)間,代碼如下:

def test():
    t1 = time.time()
    num = 10000
    for i in range(100):
        redis_cli.set("test_" + str(num), num)
        redis_cli.delete("test_" + str(num))
        num += 10
    t2 = time.time()
    print(t2 - t1)

從結(jié)果可以看出,管道的執(zhí)行時(shí)間是0.165秒,而普通命令執(zhí)行時(shí)間是9.09秒,管道技術(shù)要比普通的執(zhí)行快了 56 倍。

代碼測(cè)試-java:Jedis使用pipeline

package com.liziba.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
 
import java.io.IOException;

public class PipelineTest {
 
    public static void main(String[] args) throws IOException {
        Jedis client = new Jedis("127.0.0.1", 6379);
 
        long startPipe = System.currentTimeMillis();
        Pipeline pipe = client.pipelined();
        pipe.multi();
        for (int i = 0; i < 100000; i++) {
            pipe.set("pipe" + i, i + "" );
        }
        pipe.exec();
        pipe.close();
        long endPipe = System.currentTimeMillis();
        System.out.println("pipeline set cost time : " + (endPipe - startPipe) + "ms");
 
 
        for (int i = 0; i < 100000; i++) {
            client.set("normal" + i, i + "");
        }
        System.out.println("normal set cost time : " + (System.currentTimeMillis() - endPipe)+ "ms");
    }
}

pipeline注意事項(xiàng)

管道技術(shù)雖然有它的優(yōu)勢(shì),但在使用時(shí)還需注意以下幾個(gè)細(xì)節(jié):

  • 每次pipeline攜帶數(shù)量不推薦過(guò)大,否則會(huì)影響網(wǎng)絡(luò)性能
  • 如果管道的數(shù)據(jù)過(guò)多可能會(huì)導(dǎo)致客戶端的等待時(shí)間過(guò)長(zhǎng),導(dǎo)致網(wǎng)絡(luò)阻塞
  • 發(fā)送的命令數(shù)量不會(huì)被限制,但輸入緩存區(qū)也就是命令的最大存儲(chǔ)體積為 1GB,當(dāng)發(fā)送的命令超過(guò)此限制時(shí),命令不會(huì)被執(zhí)行,并且會(huì)被 Redis 服務(wù)器端斷開(kāi)此鏈接
  • pipeline每次只能作用在一個(gè)Redis節(jié)點(diǎn)上
  • 部分客戶端自己本身也有緩存區(qū)大小的設(shè)置,如果管道命令沒(méi)有沒(méi)執(zhí)行或者是執(zhí)行不完整,可以排查此情況

參考資料

分布式緩存Redis之Pipeline(管道)

URL: https://blog.csdn.net/u011489043/article/details/78769428
【推薦】Redis精通系列——Pipeline(管道)
參考URL: https://blog.csdn.net/qq_41125219/article/details/120298689
Redis的批量操作是什么?怎么實(shí)現(xiàn)的延時(shí)隊(duì)列?以及訂閱模式、LRU
參考URL: https://baijiahao.baidu.com/s?id=1687918953043523907

到此這篇關(guān)于redis批量操作pipeline管道的文章就介紹到這了,更多相關(guān)redis批量操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis學(xué)習(xí)之RDB、AOF與復(fù)制時(shí)對(duì)過(guò)期鍵的處理教程

    redis學(xué)習(xí)之RDB、AOF與復(fù)制時(shí)對(duì)過(guò)期鍵的處理教程

    這篇文章主要給大家介紹了關(guān)于redis學(xué)習(xí)之RDB、AOF與復(fù)制時(shí)對(duì)過(guò)期鍵處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Redis數(shù)據(jù)結(jié)構(gòu)之intset整數(shù)集合使用學(xué)習(xí)

    Redis數(shù)據(jù)結(jié)構(gòu)之intset整數(shù)集合使用學(xué)習(xí)

    這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之整數(shù)集合使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • redis實(shí)現(xiàn)的四種常見(jiàn)限流策略

    redis實(shí)現(xiàn)的四種常見(jiàn)限流策略

    因?yàn)樵诰W(wǎng)站運(yùn)行期間可能會(huì)因?yàn)橥蝗坏脑L問(wèn)量導(dǎo)致業(yè)務(wù)異常、也有可能遭受別人惡意攻,所以我們對(duì)網(wǎng)站要進(jìn)行限流,本文主要介紹了redis四種常見(jiàn)限流策略,感興趣的可以了解一下
    2021-06-06
  • 利用Redis?lua實(shí)現(xiàn)高效讀寫鎖的代碼實(shí)例

    利用Redis?lua實(shí)現(xiàn)高效讀寫鎖的代碼實(shí)例

    這篇文章給大家介紹了如何利用Redis?lua實(shí)現(xiàn)高效的讀寫鎖,讀寫鎖的好處就是能幫助客戶讀到的數(shù)據(jù)一定是最新的,寫鎖是排他鎖,而讀鎖是一個(gè)共享鎖,需要的朋友可以參考下
    2024-01-01
  • 一篇文章揭秘Redis的磁盤持久化機(jī)制

    一篇文章揭秘Redis的磁盤持久化機(jī)制

    這篇文章主要給大家介紹了如何通過(guò)一篇文章揭秘Redis的磁盤持久化機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Quarkus集成redis操作Redisson實(shí)現(xiàn)數(shù)據(jù)互通

    Quarkus集成redis操作Redisson實(shí)現(xiàn)數(shù)據(jù)互通

    這篇文章主要為大家介紹了Quarkus集成redis操作Redisson實(shí)現(xiàn)數(shù)據(jù)互通的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 深入理解redis刪除策略和淘汰策略

    深入理解redis刪除策略和淘汰策略

    每隔一段時(shí)間就掃描一定數(shù)據(jù)的設(shè)置了過(guò)期時(shí)間的key,并清除其中已過(guò)期的keys,本文主要介紹了深入理解redis刪除策略和淘汰策略,感興趣的可以了解一下
    2024-08-08
  • Redis緩存高可用集群詳解

    Redis緩存高可用集群詳解

    Redis集群提供了哨兵模式和高可用集群模式兩種方案,前者適合低并發(fā),配置復(fù)雜,主從切換可能導(dǎo)致瞬斷;后者通過(guò)多主多從結(jié)構(gòu)提高可用性和性能,支持線性擴(kuò)展,配置簡(jiǎn)單,搭建Redis集群至少需要三個(gè)主節(jié)點(diǎn)
    2024-10-10
  • 詳解Redis實(shí)現(xiàn)分布式鎖的原理

    詳解Redis實(shí)現(xiàn)分布式鎖的原理

    分布式鎖,即分布式系統(tǒng)中的鎖,在單體應(yīng)用中我們通過(guò)鎖解決的是控制共享資源訪問(wèn)的問(wèn)題,而分布式鎖,就是解決了分布式系統(tǒng)中控制共享資源訪問(wèn)的問(wèn)題,本文講給大家詳細(xì)介紹一下Redis實(shí)現(xiàn)分布式鎖的原理,需要的朋友可以參考下
    2023-09-09
  • Redis基本數(shù)據(jù)類型Set常用操作命令

    Redis基本數(shù)據(jù)類型Set常用操作命令

    這篇文章主要為大家介紹了Redis基本數(shù)據(jù)類型Set常用操作命令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論