1. 程式人生 > >Redis常用技術-----流水線(Pipelined)

Redis常用技術-----流水線(Pipelined)

在事務中Redis提供了佇列,可以批量執行任務,這樣效能就比較高,但使用multi…exec事務命令是有系統開銷的,因為它會檢測對應的鎖和序列化命令。有時我們希望在沒有任何附加條件的情況下使用佇列批量執行一系列命令,這時可以使用Redis的流水線(pipelined)技術。

實際中Redis的讀寫速度十分快,而系統的瓶頸往往是在網路通訊中的延時。比如當命令1在T1時刻傳送到Redis伺服器後,伺服器很快執行完命令1,而命令2在T2時刻卻沒有通過網路送達Redis伺服器,這樣就變成了Redis伺服器在等待命令2的到來,當命令2到達且被執行後,命令3還沒到,又得繼續等待,以此類推,這樣Redis的等待時間就會很長,很多時候在空閒的狀態,而問題出現在網路的延遲中,造成了系統的瓶頸。

系統的瓶頸

為了解決這個問題,可以使用Redis的流水線,但Redis的流水線是一種通訊協議,沒有辦法通過客戶端演示,不過可以通過Java API或使用Spring操作它。

/**
 * 測試Redis流水線 
 * @author liu
 */
public class TestPipelined {

    /**
     * 使用Java API測試流水線的效能
     */
    @SuppressWarnings({ "unused", "resource" })
    @Test
    public void testPipelinedByJavaAPI() {
        JedisPoolConfig jedisPoolConfig = new
JedisPoolConfig(); jedisPoolConfig.setMaxIdle(20); jedisPoolConfig.setMaxTotal(10); jedisPoolConfig.setMaxWaitMillis(20000); JedisPool jedisPool = new JedisPool(jedisPoolConfig,"localhost",6379); Jedis jedis = jedisPool.getResource(); long start = System.currentTimeMillis(); // 開啟流水線
Pipeline pipeline = jedis.pipelined(); // 測試10w條資料讀寫 for(int i = 0; i < 100000; i++) { int j = i + 1; pipeline.set("key" + j, "value" + j); pipeline.get("key" + j); } // 只執行同步但不返回結果 //pipeline.sync(); // 以list的形式返回執行過的命令的結果 List<Object> result = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); // 計算耗時 System.out.println("耗時" + (end - start) + "毫秒"); } /** * 使用RedisTemplate測試流水線 */ @SuppressWarnings({ "resource", "rawtypes", "unchecked", "unused" }) @Test public void testPipelineBySpring() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); RedisTemplate rt = (RedisTemplate)applicationContext.getBean("redisTemplate"); SessionCallback callback = (SessionCallback)(RedisOperations ops)->{ for(int i = 0; i < 100000; i++) { int j = i + 1; ops.boundValueOps("key" + j).set("value" + j); ops.boundValueOps("key" + j).get(); } return null; }; long start = System.currentTimeMillis(); // 執行Redis的流水線命令 List result = rt.executePipelined(callback); long end = System.currentTimeMillis(); System.out.println(end - start); } }

書上寫的測試結果為:使用Java API耗時在550ms到700ms之間,也就是不到1s就完成了10萬次讀寫,使用Spring 耗時在1100ms到1300ms之間。

我的測試結果:使用Java API耗時在13s左右,使用Spring直接記憶體溢位,這說明我得換電腦了。

相關推薦

Redis常用技術-----流水線Pipelined

在事務中Redis提供了佇列,可以批量執行任務,這樣效能就比較高,但使用multi…exec事務命令是有系統開銷的,因為它會檢測對應的鎖和序列化命令。有時我們希望在沒有任何附加條件的情況下使用佇列批量執行一系列命令,這時可以使用Redis的流水線(pipelin

Redis核心技術---流水線pipelined

什麼是流水線技術? 有時候我們需要批量執行一系列redis命令,這個時候如果一條一條的傳送給redis,由於網路通訊中的延遲,在redis接收到一條命令並且很快執行完後,就會出現等待下一條命令到達的空閒期,這會極大的影響redis的效能。 於是就有了pipelined技術,它可以將一系列

Redis常用操作-------List列表

1.BLPOP key [key ...] timeout BLPOP 是列表的阻塞式(blocking)彈出原語。 它是 LPOP 命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連線將被 BLPOP 命令阻塞,直到等待超時或發現可彈出元素為止。

Redis常用操作-------Set集合

1.SADD key member [member ...] 將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。 假如 key 不存在,則建立一個只包含 memb

流水線、超流水線、超標量superscalar技術對比

流水線      流水線技術是一種將每條指令分解為多步,並讓各步操作重疊,從而實現幾條指令並行處理的技術。程式中的指令仍是一條條順序執行,但可以預先取若干條指令,並在當前指令尚未執行完時,提前啟動後續指令的另一些操作步驟。這樣顯然可加速一段程式的

Git介紹及常用操作演示--技術流ken

Git介紹及常用操作演示(一)--技術流ken   Git介紹    Git(讀音為/gɪt/。)是一個開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的專案版本管理。 Git 是 Linus Torvalds 為了幫助管理 Linux 核心

區塊鏈技術基礎語言三十:Go語言常用工具包

原文連結:區塊鏈技術基礎語言(三十):Go語言常用工具包(下) 一、JSON處理 JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,方便人們閱讀和編寫,也方便程式地解析和生成。雖然JSON是JavaScript的子集,但其格式完全獨立於程式語言,表現

區塊鏈技術語言二十九—Go語言常用工具包

原文連結:區塊鏈技術語言(二十九)—Go語言常用工具包(上) 常用工具包分為兩節內容。本節介紹格式化輸入輸出和對字串處理的常用工具包和函式;下節介紹JSON處理和對文字的幾種操作。   一、格式化輸入輸出 fmt包提供了格式化的輸入和輸出的操作。 1.1

Redis常用命令總結五大資料型別常用命令

目錄 1.key關鍵字: Keys *:檢視當前k-v鍵值對快取中的所有key Exists key的名字,判斷某個key是否存在 Move key db  -->當前庫就沒有了,被移除了 Expire key秒鐘:為給ke

常用工具包-哈工大語言技術平臺LTP-本地安裝-python介面ubuntu,win7-64

目錄 一、前言          本文件主要簡介哈工大一款語言技術平臺(LTP)的使用方法。          LTP提供的主要功能有:中文分詞,詞性標註,命名實體識別,依存句法分析,語義角色標註。          使用LTP的

Redis常用操作-------Hash雜湊表

1.HDEL key field [field ...] 刪除雜湊表 key 中的一個或多個指定域,不存在的域將被忽略。 在Redis2.4以下的版本里, HDEL 每次只能刪除單個域,如果你需要在一個原子時間內刪除多個域,請將命令包含在 MULTI

Redis常用操作--------SortedSet有序集合

1.ZADD key score member [[score member] [score member] ...] 將一個或多個 member 元素及其 score 值加入到有序集 key 當中。 如果某個 member 

常用工具包-哈工大語言技術平臺LTP-本地安裝-java介面ubuntu,win7-64位

目錄 第一部分 簡介          LTP4J簡介。LTP底層均是C++實現,而LTP4J是對LTP的Java介面封裝。所以對於需要Java介面的開發人員來說要通過呼叫LTP4J的介面實現呼叫LTP的目的,LTP4J封裝

虛擬化技術之kvm管理工具virsh常用基礎命令

  在上一篇部落格中,我們瞭解了KVM基礎架構和部署以及圖形管理工具virt-manager安裝虛擬機器的過程,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13499801.html;今天我們來聊一下kvm的命令列工具virsh;virsh工具功能非常豐富,它可以全生

Windows Phone開發10常用控件

androi chm att size near grid txt idt inf Windows Phone的控件有幾個來源,和傳統的桌面應用程序開發或Web開發一樣,有默認提供的控件和第三方開者發布的控件。一般而言,如果不是過於復雜的界面布局,使用默認控件就足矣。相比之

matlab-常用函數2

() size [] 函數返回 atl 16px empty emp nbsp isempty(A) 功能解釋   isempty()用來判斷 一個矩陣是否為空矩陣,其用法相當於C語言中的“a==NULL”。   當參數為空矩陣時,該函數返回邏輯值“1”,反之返回“0”

Java 之常用運算符3

註意 sys 有趣的 open size 除法 如果能 都是 pla 什麽是運算符: 運算符是一種“功能”符號,用以通知 Java 進行相關的運算。譬如,我們需要將變量 age 的值設置為 20 ,這時候就需要一個“=”,告

Logstash語法常用案例解析

logstash摘要簡述logstash的常用插件,以及簡單的使用案例一:基礎運行建議使用supervisor來管理ELK中的各個組件,方便同一管理安裝 https://www.aolens.cn/?p=809 有講解提供一個常用的配置:[program:logstash] command=/opt

Android中apk動態載入技術研究2android插件化及實現

name creat package path iss fontsize 調用 dex con 了解了android中類載入的前期知識點後,來看看android中DexClassLoader詳細的實現 詳細載入流程例如以下: 宿主程序會到文件系統比

Redis 小白指南- 事務、過期、消息通知、管道和優化內存空間

如何 入門 系列 code 場景 消息 運算 封裝 c# Redis 小白指南(三)- 事務、過期、消息通知、管道和優化內存空間 簡介   《Redis 小白指南(一)- 簡介、安裝、GUI 和 C# 驅動介紹》 講的是 Redis 的介紹,以及如何在 Windows