准备环境
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)\
- “subscribe”\
- “configserver”\
- (integer) 1
从节点1 订阅configserver频道
从节点2 订阅configserver频道
从节点3 订阅configserver频道
127.0.0.1:6379> subscribe configserver
Reading messages… (press Ctrl-C to quit)\
- “subscribe”\
- “configserver”\
- (integer) 1
2、主节点一发送消息,测试其他节点能否收到订阅
主节点发布 “test subscribe”消息
127.0.0.1:6379> publish configserver “test subscribe”
(integer) 2
主节点2 主节点3 打印
- “message”\
- “configserver”\
- “test subscribe”
正常接收到消息
从节点1 从节点2 从节点3 打印
- “message”\
- “configserver”\
- “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)\
- “subscribe”\
- “test2″\
- (integer) 1\
- “message”\
- “test2″\
- “test”\
- “message”\
- “test2″\
- “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,性能还算可以。
- “message”\
- “test2″\
- “test99″\
- “message”\
- “test2″\
- “test100”
8、按照现在redis三个区部署,每个区大概60台虚机链接,这样的性能是足够满足我们的业务场景的。
基本能实现毫秒级配置更新。