提升網(wǎng)站關(guān)鍵詞排名推廣策劃方案怎么做
目錄
1、發(fā)布訂閱
1.1 什么是發(fā)布訂閱
1.2 客戶端實例演示
1.3 Java API演示
1.4 Redis發(fā)布訂閱和rabbitmq的區(qū)別
2、批量操作
2.1 普通模式與 PipeLine 模式
2.2 適用場景
2.3 源碼解析
2.4 Pipelining的局限性
2.5 事務(wù)與 LUA Scripting
3、持久化
3.1 為什么需要持久化
3.2 持久化方式
3.3 文件同步方式
3.4 文件重寫(壓縮)
3.5 總結(jié)
4、內(nèi)存淘汰
4.1 最大內(nèi)存設(shè)置
4.2 數(shù)據(jù)淘汰機(jī)制
1、發(fā)布訂閱
1.1 什么是發(fā)布訂閱
Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息并且可以訂閱任意數(shù)量的頻道。
發(fā)布訂閱(Pub/Sub):目前廣泛使用的通信模型,它采用事件作為基本的通信機(jī)制,提供大規(guī)模系統(tǒng)所要求的松散耦合的交互模式:訂閱者(如客戶端)以事件訂閱的方式表達(dá)出它有興趣接收的一個事件或一類事件;發(fā)布者(如服務(wù)器)可將訂閱者感興趣的事件隨時通知相關(guān)訂閱者------是不是與設(shè)計模式里面的觀察者模式一個媽媽生的?
最經(jīng)典的應(yīng)用場景就是微博和公眾號,任何粉絲只要關(guān)注(訂閱)了某一個人的微博或者公眾號,該微博或者公眾號就有有狀態(tài)更新,都會將消息推送(發(fā)布)到粉絲....
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關(guān)系:
當(dāng)有新消息通過 PUBLISH 命令發(fā)送給頻道 channel1 時, 這個消息就會被發(fā)送給訂閱它的三個客戶端:
1.2 客戶端實例演示
以下實例演示了發(fā)布訂閱是如何工作的。在我們實例中我們創(chuàng)建了訂閱頻道名為 redisChat:
redis 127.0.0.1:6379> SUBSCRIBE redisChat
?
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
現(xiàn)在,我們先重新開啟個 redis 客戶端,然后在同一個頻道 redisChat 發(fā)布兩次消息,訂閱者就能接收到消息。
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
?
(integer) 1
?
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
?
(integer) 1
?
# 訂閱者的客戶端會顯示如下消息
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"
下表列出了 redis 發(fā)布訂閱常用命令:
序號 | 命令及描述 |
---|---|
1 | PSUBSCRIBE pattern... 訂閱一個或多個符合語法的頻道。---> PSUBSCRIBE redisChat* 訂閱所有以redisChat開頭的頻道 |
2 | PUBLISH channel message 將信息發(fā)送到指定的頻道。 |
3 | PUNSUBSCRIBE pattern ... 退訂所有給定模式的頻道。 |
4 | SUBSCRIBE channel ... 訂閱給定的一個或多個頻道的信息。 |
1.3 Java API演示
1.3.1 引入jedis依賴
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.3</version> </dependency>
1.3.2 Publisher (發(fā)布者)
package com.ydt.redis.pubsub;
?
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
?
public class Publisher extends Thread{
? private final JedisPool jedisPool;
? public Publisher(JedisPool jedisPool) { this.jedisPool = jedisPool; } @Override public void run() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Jedis jedis = jedisPool.getResource(); //連接池中取出一個連接 while (true) { String line = null; try { line = reader.readLine(); if (!"quit".equals(line)) { jedis.publish("mychannel", line); //從 mychannel 的頻道上推送消息 } else { break; } } catch (IOException e) { e.printStackTrace(); } } }
}
1.3.3 Subscriber(訂閱者)
package com.ydt.redis.pubsub;
?
import redis.clients.jedis.JedisPubSub;
?
//訂閱者需要繼承JedisPubSub,來重寫它的三個方法
public class Subscriber extends JedisPubSub {
? public Subscriber(){} @Override public void onMes