redis 發佈訂閱 性能測試

準備環境

ip服務器 redis版本 是否主從
10.29.190.24 4.0.8 是/主節點
10.28.36.205  4.0.8 是/從節點

環境如上,已經自建了兩臺redis,並且已經實現主從同步。

一、主從同步下,發佈訂閱功能是否能正常使用

1、開啓五個redis客戶端,其中兩個主節點,三個從節點

主節點2 訂閱configserver頻道

主節點3 訂閱configserver頻道

127.0.0.1:6379> subscribe configserver
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "configserver"
3) (integer) 1

從節點1 訂閱configserver頻道

從節點2 訂閱configserver頻道

從節點3 訂閱configserver頻道

127.0.0.1:6379> subscribe configserver
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "configserver"
3) (integer) 1

2、主節點一發送消息,測試其他節點能否收到訂閱

主節點發布 "test subscribe"消息

127.0.0.1:6379> publish configserver "test subscribe"
(integer) 2

主節點2 主節點3 打印

1) "message"
2) "configserver"
3) "test subscribe"

正常接收到消息

從節點1 從節點2 從節點3 打印

1) "message"
2) "configserver"
3) "test subscribe"

正常接收到消息

說明主從同步也一樣可以支持發佈訂閱的功能。具體性能還需進一步測試。

二、發佈訂閱性能測試

1、創建100個線程,訂閱test2

public class RedisSubScribeTask implements Runnable {
    private String Name;

    public RedisSubScribeTask(String name) {
        Name = name;
    }

    @Override
    public void run() {
        RedisDaoImpl redis = new RedisDaoImpl();
        redis.init();
        Jedis jedis = redis.pool.getResource();
        if (jedis != null) {
            RedisMsgSubListener redisMsgSubListener = new RedisMsgSubListener();
            System.out.println("線程" + Name + "啓動");
            jedis.subscribe(redisMsgSubListener, "test2");
        }
    }
}


public static void main(String[] args) {

    for (int i = 0; i <= 100; i++) {
        RedisSubScribeTask redisSubScribeTask = new RedisSubScribeTask(String.valueOf(i));
        new Thread(redisSubScribeTask).start();
    }

}
public class RedisMsgSubListener extends JedisPubSub {

    public void onMessage(String channel, String message) {
        System.out.println(channel + " is:" + message);
    }

    public void onPMessage(String pattern, String channel, String message) {
    }

    public void onSubscribe(String channel, int subscribedChannels) {
    }

    public void onUnsubscribe(String channel, int subscribedChannels) {
    }

    public void onPUnsubscribe(String pattern, int subscribedChannels) {
    }
    
} 
2、定義main方法,發佈消息
public static void main(String[] args) {
    RedisDaoImpl redis = new RedisDaoImpl();
    redis.init();
    redis.pool.getResource().publish("test2", "test");
}

3、測試結果爲秒回

4、將線程改爲300個,測試結果也爲秒回

5、將連件數升爲500,依舊沒有延遲

info clients
# Clients
connected_clients:500
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379>

6、連接數升爲1000,其餘兩個爲主從同步。看是否存在延遲

info clients
# Clients
connected_clients:1002
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

7、發現依舊沒有延遲。並且主從同步的訂閱test2的消息,也正常接受。

127.0.0.1:6379> subscribe test2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test2"
3) (integer) 1
1) "message"
2) "test2"
3) "test"
1) "message"
2) "test2"
3) "test"

8、針對1000個客戶端,並且進行連續發佈100個消息

for (int i = 0; i <= 100; i++) {
 redis.pool.getResource().publish("test2", "test" + i);
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
 }

從節點完全打印完成大概耗時2s,性能還算可以。

1) "message"
2) "test2"
3) "test99"
1) "message"
2) "test2"
3) "test100"  

8、按照現在redis三個區部署,每個區大概60臺虛機鏈接,這樣的性能是足夠滿足我們的業務場景的。

基本能實現毫秒級配置更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章