Redis流水线性能提高
我們希望在沒有任何附加條件的場景下去使用隊列批量執行一系列的命令,從而提高系統性能,這就是 Redis 的流水線(pipelined)技術。而現實中 Redis 執行讀/寫速度十分快,而系統的瓶頸往往是在網絡通信中的延時,如圖所示。
在實際的操作中,往往會發生這樣的場景,當命令 1 在時刻 T1 發送到 Redis 服務器后,服務器就很快執行完了命令 1,而命令 2 在 T2 時刻卻沒有通過網絡送達 Redis 服務器,這樣就變成了 Redis 服務器在等待命令 2 的到來,當命令 2 送達,被執行后,而命令 3 又沒有送達 Redis,Redis 又要繼續等待,依此類推,這樣 Redis 的等待時間就會很長,很多時候在空閑的狀態,而問題出在網絡的延遲中,造成了系統瓶頸。
為了解決這個問題,可以使用 Redis 的流水線,但是 Redis 的流水線是一種通信協議,沒有辦法通過客戶端演示給大家,不過我們可以通過 Java API 或者使用 Spring 操作它,先使用 Java API 去測試一下它的性能,代碼如下所示。
Jedis jedis = pool.getResource(); long start = System.currentTimeMillis(); // 開啟流水線 Pipeline pipeline = jedis.pipelined(); // 這里測試10萬條的讀/寫2個操作 for (int i = 0; i < 100000; i++) {int j = i + 1;pipeline.set("pipeline_key_" + j, "pipeline_value_" + j);pipeline.get("pipeline_key_" + j); } // pipeline.sync(); //這里只執行同步,但是不返回結果 // pipeline.syncAndReturnAll ();將返回執行過的命令返回的List列表結果 List result = pipeline.syncAndRetrunAll(); long end = System.currentTimeMillis(); // 計算耗時 System.err.println("耗時:" + (end - start) + "毫秒");在電腦上測試這段代碼,它的耗時在 550 毫秒到 700 毫秒之間,也就是不到 1 秒的時間就完成多達 10 萬次讀/寫,可見其性能遠超數據庫。我的測試是 1 秒 2 萬多次,可見使用流水線后其性能提高了數倍之多,效果十分明顯。執行過的命令的返回值都會放入到一個 List 中。
注意:這里只是為了測試性能而已,當你要執行很多的命令并返回結果的時候,需要考慮 List 對象的大小,因為它會“吃掉”服務器上許多的內存空間,嚴重時會導致內存不足,引發 JVM 溢出異常,可以考慮使用迭代的方式去處理。
在 Spring 中,執行流水線和執行事務的方法如出一轍都比較簡單,使用 RedisTemplate 提供的 executePipelined 方法即可。下面將上面代碼的功能修改為 Spring 的形式供大家參考,代碼如下所示。
public static void testPipeline() {Applicationcontext applicationcontext = new ClassPathXmlApplicationContext("applicationcontext.xml");RedisTemplate redisTemplate = applicationcontext.getBean(RedisTemplate.class);// 使用Java8的Lambda表達式SessionCallback callBack = (SessionCallback) (RedisOperations ops)-> {for (int i = 0; i<100000; i++) {int j = i + 1;ops . boundValueOps ("pipeline_key_" + j ).set("piepeline_value_"+j);ops.boundValueOps("pipeline_key_" + j).get();}return null;};long start = System.currentTimeMillis();//執行Redis的流水線命令List resultList= redisTemplate.executePipelined(callBack);long end = System.currentTimeMillis();System.err.println(end-start); }我對這段代碼進行了測試,其性能慢于不用 RedisTemplate 的,測試消耗的時間大約在 1 100 毫秒到 1 300 毫秒之間,也就是消耗的時間大約是其兩倍,但也屬于完全可以接受的性能范圍,同樣的在執行很多命令的時候,也需要考慮其對運行環境內存空間的開銷。
總結
以上是生活随笔為你收集整理的Redis流水线性能提高的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Emulator: PANIC: Can
- 下一篇: Spring Boot swagger之