激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - Redis基礎學習之管道機制詳析

Redis基礎學習之管道機制詳析

2019-11-20 21:53pjmike_pj Redis

這篇文章主要給大家介紹了關于Redis基礎學習之管道機制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

Redis服務是一種C/S模型,提供請求-響應式協議的TCP服務,所以當客戶端請求發出,服務端處理并返回結果到客戶端,一般是以阻塞形式等待服務端的響應,但這在批量處理連接時延遲問題比較嚴重,所以Redis為了提升或彌補這個問題,引入了管道技術:可以做到服務端未及時響應的時候,客戶端也可以繼續發送命令請求,做到客戶端和服務端互不干涉影響,服務端并最終返回所有服務端的響應,這在促進原有C/S模型交互的響應速度上有了質的提高。

以下是對 Redis管道機制的一個學習記錄

Pipeline簡介

Redis客戶端執行一條命令:

  • 發送命令
  • 命令排隊
  • 執行命令
  • 返回結果

其中發送命令和返回結果可以稱為 Round Trip Time (RTT,往返時間)。在Redis中提供了批量操作命令,例如mget、mset等,有效地節約了RTT。但是大部分命令是不支持批量操作的。

為此Redis提供了一個稱為管道(Pipeline) 的機制將一組Redis命令進行組裝,通過一次 RTT 傳輸給 Redis,再將這些 Redis 命令的執行結果按順序傳遞給客戶端。即使用pipeline執行了n次命令,整個過程就只需要一次 RTT。

對Pipeline進行性能測試

我們使用redis-benchmark 對Pipeline進行性能測試,該工具提供了 -P 的選項,此選項表示使用管道機制處理 n 條Redis請求,默認值為1。測試如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
# 不使用管道執行get set 100000次請求
[root@iz2zeaf3cg1099kiidi06mz ~]# redis-benchmark -t get,set -q -n 100000
SET: 55710.31 requests per second
GET: 54914.88 requests per second
# 每次pipeline組織的命令個數 為 100
[root@iz2zeaf3cg1099kiidi06mz ~]# redis-benchmark -P 100 -t get,set -q -n 100000
SET: 1020408.19 requests per second
GET: 1176470.62 requests per second
# 每次pipeline組織的命令個數 為 10000
[root@iz2zeaf3cg1099kiidi06mz ~]# redis-benchmark -P 10000 -t get,set -q -n 100000
SET: 321543.41 requests per second
GET: 241545.89 requests per second

從上面測試可以看出,使用pipeline的情況下 Redis 每秒處理的請求數遠大于 不使用 pipeline的情況。

當然每次pipeline組織的命令個數不能沒有節制,否則一次組裝Pipeline數據量過大,一方面會增加 客戶端等待時間,另一方面會造成一定的網絡阻塞。

從上面的測試中也可以看出,如果一次pipeline組織的命令個數為 10000,但是它對應的QPS 卻小于 一次pipeline命令個數為 100的。所以每次組織 Pipeline的命令個數不是越多越好,可以將一次包含大量命令的 Pipeline 拆分為 多個較小的 Pipeline 來完成。

Pipeline關于RTT的說明

在官網上有一段這樣的描述:

Redis基礎學習之管道機制詳析

大致意思就是 :

Pipeline管道機制不單單是為了減少RTT的一種方式,它實際上大大提高了Redis的QPS。原因是,在沒有使用管道機制的情況下,從訪問數據結構和產生回復的角度來看,為每個命令提供服務是非常便宜的。但是從底層套接字的角度來看,這是非常昂貴的,這涉及read()和write()系統調用,從用戶態切換到內核態,這種上下文切換開銷是巨大。而使用Pipeline的情況下,通常使用單個read()系統調用讀取許多命令,然后使用單個write()系統調用傳遞多個回復,這樣就提高了QPS

批量命令與Pipeline對比

  • 批量命令是原子的,Pipeline 是非原子的
  • 批量命令是一個命令多個 key,Pipeline支持多個命令
  • 批量命令是 Redis服務端實現的,而Pipeline需要服務端和客戶端共同實現

使用jedis執行 pipeline

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class JedisUtils {
 private static final JedisUtils jedisutils = new JedisUtils();
 
 public static JedisUtils getInstance() {
 return jedisutils;
 }
 
 public JedisPool getPool(String ip, Integer port) {
 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
 jedisPoolConfig.setMaxIdle(RedisConfig.MAX_IDLE);
 jedisPoolConfig.setMaxTotal(RedisConfig.MAX_ACTIVE);
 jedisPoolConfig.setMaxWaitMillis(RedisConfig.MAX_WAIT);
 jedisPoolConfig.setTestOnBorrow(true);
 jedisPoolConfig.setTestOnReturn(true);
 JedisPool pool = new JedisPool(jedisPoolConfig, ip, port,RedisConfig.TIMEOUT,RedisConfig.PASSWORD);
 return pool;
 }
 
 public Jedis getJedis(String ip, Integer port) {
 Jedis jedis = null;
 int count = 0;
 while (jedis == null && count < RedisConfig.RETRY_NUM) {
  try {
  jedis = getInstance().getPool(ip, port).getResource();
  } catch (Exception e) {
  System.out.println("get redis failed");
  }
  count++;
 }
 return jedis;
 }
 
 public void closeJedis(Jedis jedis) {
 if (jedis != null) {
  jedis.close();
 }
 }
 
 public static void main(String[] args) throws InterruptedException {
 Jedis jedis = JedisUtils.getInstance().getJedis("127.0.0.1", 6379);
 Pipeline pipeline = jedis.pipelined();
 pipeline.set("hello", "world");
 pipeline.incr("counter");
 System.out.println("還沒執行命令");
 Thread.sleep(100000);
 System.out.println("這里才開始執行");
 pipeline.sync();
 }
}

在睡眠100s的時候查看 Redis,可以看到此時在pipeline中的命令并沒有執行,命令都被放在一個隊列中等待執行:

?
1
2
3
4
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> get counter
(nil)

睡眠結束后,使用 pipeline.sync()完成此次pipeline對象的調用。

?
1
2
3
4
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> get counter
"1"

必須要執行pipeline.sync() 才能最終執行命令,當然可以使用 pipeline.syncANdReturnAll回調機制將pipeline響應命令進行返回。

參考資料 & 鳴謝

  • Redis開發與運維
  • Using pipelining to speedup Redis queries

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://juejin.im/post/5be01187e51d452b02557014

延伸 · 閱讀

精彩推薦
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 亚洲精品在线观看网站 | 看片一区 | 国产精品视频yy9299一区 | 最新av在线免费观看 | 蜜桃久久一区二区三区 | 免费中文视频 | 毛片大全 | 九九热在线视频观看这里只有精品 | 黑人一区二区三区四区五区 | 亚洲视频综合 | 视频在线中文字幕 | 精品一区二区三区在线观看视频 | 中文字幕电影免费播放 | 日本欧美一区二区三区视频麻豆 | 国产日韩亚洲 | 成人一级黄色大片 | 3xxx| 欧美a∨一区二区三区久久黄 | 美女扒开腿让男生桶爽网站 | 999精品国产| 成人福利在线播放 | 草久免费 | 亚洲成人午夜精品 | 久久精品中文字幕一区 | 久久久久久麻豆 | 毛片电影在线看 | 福利在线小视频 | 免费黄色在线观看网站 | 在线91视频 | 毛片在线免费观看完整版 | a级在线| 成年人在线免费 | 亚洲精品 在线播放 | 91免费在线 | 99亚洲 | 久久国产精品网 | 欧美视频国产 | 49vv看片免费| 国产高清自拍一区 | 99视频有精品视频高清 | 久久精品视频12 |