redis 發佈訂閱 性能測試

準備環境

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

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

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

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

主節點2 訂閱configserver頻道服務器

主節點3 訂閱configserver頻道ide

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頻道ui

從節點3 訂閱configserver頻道spa

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

二、主節點一發送消息,測試其餘節點可否收到訂閱code

主節點發布 "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"

正常接收到消息

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

2、發佈訂閱性能測試

一、建立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) {
    }
    
}
二、定義main方法,發佈消息
public static void main(String[] args) {
    RedisDaoImpl redis = new RedisDaoImpl();
    redis.init();
    redis.pool.getResource().publish("test2", "test");
}

三、測試結果爲秒回

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

五、將連件數升爲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>

六、鏈接數升爲1000,其他兩個爲主從同步。看是否存在延遲

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

七、發現依舊沒有延遲。而且主從同步的訂閱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"

八、針對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"  

八、按照如今redis三個區部署,每一個區大概60臺虛機連接,這樣的性能是足夠知足咱們的業務場景的。

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

相關文章
相關標籤/搜索