訂閱發(fā)布:
SUBSCRIBE channel [channel ...]:訂閱給定的一個或多個頻道的信息,接收到的信息分別對應(yīng)消息類型,頻道,消息。先訂閱才能接收到消息,無法收到未訂閱前發(fā)出的消息,這點和MQ的Topic一樣。
PUBLISH channel message:發(fā)布消息。
PSUBSCRIBE pattern [pattern ...]:訂閱一個或多個符合給定模式的頻道。
PUBSUB channels [pattern] :返回當(dāng)前服務(wù)器被訂閱的所有頻道。
PUBSUB numsub [channel-1 channel-2 ...channel-n]:接受任意多個頻道作為輸入?yún)?shù),返回這些頻道的訂閱者數(shù)量。
Pipeline:
除了可以利用mget,mset 之類的單條命令處理多個key之外,我們還可以利用pipeline的方式從client打包多條命令一起發(fā)出,而redis服務(wù)端會處理完多條命令后會將多條命令的處理結(jié)果打包到一起返回給客戶端。
沒有使用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();
}
}
}
}
要點:
訂閱發(fā)布:先訂閱才能接收到消息,無法收到未訂閱前發(fā)出的消息,這點和MQ的Topic一樣。
Pipline:1次網(wǎng)絡(luò),n次命令。Pipeline中的子命令是非原子性的。