订阅发布:
SUBSCRIBE channel [channel ...]:订阅给定的一个或多个频道的信息,接收到的信息分别对应消息类型,频道,消息。先订阅才能接收到消息,无法收到未订阅前发出的消息,这点和MQ的Topic一样。
PUBLISH channel message:发布消息。
PSUBSCRIBE pattern [pattern ...]:订阅一个或多个符合给定模式的频道。
PUBSUB channels [pattern] :返回当前服务器被订阅的所有频道。
PUBSUB numsub [channel-1 channel-2 ...channel-n]:接受任意多个频道作为输入参数,返回这些频道的订阅者数量。
Pipeline:
除了可以利用mget,mset 之类的单条命令处理多个key之外,我们还可以利用pipeline的方式从client打包多条命令一起发出,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。
没有使用Pipeline通信过程 | 使用Pipeline通信过程 |
---|---|
注意:Pipeline中的子命令是非原子性的
使用Jedis的例子:
package com.jd.redis.client;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
public class PipelineTest {
publicstaticvoid main(String[] args) {
int count = 1000;
long start = System.currentTimeMillis();
withoutPipeline(count);
long end = System.currentTimeMillis();
System.out.println("withoutPipeline: " + (end-start));
start = System.currentTimeMillis();
usePipeline(count);
end = System.currentTimeMillis();
System.out.println("usePipeline: " + (end-start));
}
private static void withoutPipeline(int count){
Jedis jr = null;
try {
jr = new Jedis("10.10.224.44", 6379);
for(int i =0; i<count; i++){
jr.incr("testKey1");
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
if(jr!=null){
jr.disconnect();
}
}
}
private static void usePipeline(int count){
Jedis jr = null;
try {
jr = new Jedis("10.10.224.44", 6379);
Pipeline pl = jr.pipelined();
for(int i =0; i<count; i++){
pl.incr("testKey2");
}
pl.sync();
} catch (Exception e) {
e.printStackTrace();
}
finally{
if(jr!=null){
jr.disconnect();
}
}
}
}
要点:
订阅发布:先订阅才能接收到消息,无法收到未订阅前发出的消息,这点和MQ的Topic一样。
Pipline:1次网络,n次命令。Pipeline中的子命令是非原子性的。