導航:首頁 > 編程語言 > phpredis訂閱與發布

phpredis訂閱與發布

發布時間:2025-02-16 19:14:45

php怎麼使用 redis pub/sub

一.場景介紹
最近的一個項目需要用到發布/訂閱的信息系統,以做到最新實時消息的通知。經查找後發現了redis pub/sub(發布/訂閱的信息系統)可以滿足我的開發需求,而且學習成本和使用成本也比較低。 :grin:
二.什麼是redis pub/sub
資料查看
大家在看我的blog的同時可以打開redis官方對於redis pub/sub的介紹,感覺看英文文檔吃力的話 :cry: ,可以看redis中文網的翻譯介紹.
Pub/Sub功能(means Publish, Subscribe)即發布及訂閱功能
1> 基於事件的系統中,Pub/Sub是目前廣泛使用的通信模型,它採用事件作為基本的通信機制,提供大規模系統所要求的鬆散耦合的交互模式:訂閱者(如客戶端)以事件訂閱的方式表達出它有興趣接收的一個事件或一類事件;發布者(如伺服器)可將訂閱者感興趣的事件隨時通知相關訂閱者。
2> 消息發布者,即publish客戶端,無需獨占鏈接,你可以在publish消息的同時,使用同一個redis-client鏈接進行其他操作(例如:INCR等)
3> 消息訂閱者,即subscribe客戶端,需要獨占鏈接,即進行subscribe期間,redis-client無法穿插其他操作,此時client以阻塞的方式等待「publish端」的消息;這一點很好理解,因此subscribe端需要使用單獨的鏈接,甚至需要在額外的線程中使用。
三.redis pub/sub的使用
下面我將配著實圖(用我的本地機器環境)來為大家講解redis的pub/sub怎麼去使用 .
沒有安裝phpredis擴展的或者沒有redis服務的,請參考我的另一篇blog,有詳細的安裝介紹,這里不再贅述了。
1、啟動redis服務端:
[caption id="attachment_1777" align="alignnone" width="300"] php redis pub/sub(消息訂閱系統)經驗總結之一[/caption]
2、新開一個終端,啟動redis客戶端,並做為subscribe客戶端(消息訂閱者),訂閱一個名字叫test的頻道的頻道信息:
3、啟動redis客戶端,並做為publish客戶端(消息發布者),發布一個名字叫test的頻道,信息是:hello,world
4、再切換到2步驟中的redis客戶端窗口,會發現,已經訂閱到了剛才發布的 'hello,world'消息:
5、模式匹配訂閱
Redis 的Pub/Sub實現支持模式匹配。客戶端可以訂閱全風格的模式以便接收所有來自能匹配到給定模式的頻道的消息。
比如,將接收所有發到 test.name,test.phone,test.address...等等的消息,該這樣寫:
[shell]PUBSCRIBE test.*[/shell]
在終端回車後,同時再新的窗口裡分別發布兩個頻道的消息,名字分別為:test.name和test.phone,然後切換到訂閱端的窗口裡,結果如下圖所示:
由上圖可以看出,在訂閱了test.*頻道後,一共收到了 test.name和test.phone兩個頻道的消息,這就是模式匹配訂閱。
那麼取消訂閱匹配該模式的客戶端也比較簡單:
[shell]PUNSUBSCRIBE test.*[/shell]
6、好,以上的這些簡單的demo,就是關於redis pub/sub(Publish/Subscribe,發布/訂閱的信息系統)的最基本使用。說了這么多,跟php也沒有掛上什麼鉤,別著急,重要的都往往最後出場。 :lol:
四.php使用redis的pub/sub(發布/訂閱的信息系統)
這里我列出一些常用的命令:
phpredis的安裝
redis的客戶端連接支持多種語言。這里我用的是php的phpredis,它是用c語言編寫的,目前已經作為php的一個模塊擴展,沒有安裝的可以參考我的另一篇blog,已經安裝的可以忽略此步驟.
命令手冊
這里我列出一些常用的:
[shell]Redis::__construct構造函數
$redis = new Redis();
connect, open 鏈接redis服務
參數
host: string,服務地址
port: int,埠號
timeout: float,鏈接時長 (可選, 默認為 0 ,不限鏈接時間)
注: 在redis.conf中也有時間,默認為300
pconnect, popen 不會主動關閉的鏈接
參考上面
setOption 設置redis模式
getOption 查看redis設置的模式
ping 查看連接狀態
get 得到某個key的值(string值)
如果該key不存在,return false
set 寫入key 和 value(string值)
如果寫入成功,return ture
setex 帶生存時間的寫入值
$redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL.
setnx 判斷是否重復的,寫入值<br />$redis->setnx('key', 'value');
$redis->setnx('key', 'value');
delete 刪除指定key的值
返回已經刪除key的個數(長整數)
$redis->delete('key1', 'key2');
$redis->delete(array('key3', 'key4', 'key5'));
<span style="font-size: 16px; line-height: 24px;">
[/shell]
更詳細的使用請參考這里,我就不寫太多,因為我要直接摞代碼了. :lol:
publish(消息發布端):pub.php
[php]
/**
* redis sub(消息訂閱端)
* @ blog: phping.sinaapp.com
* @date 2016-04-24 15:00
*/
$redis = new Redis();
// 第一個參數為redis伺服器的ip,第二個為埠
$res = $redis->connect('127.0.0.1', 6379);
// test為發布的頻道名稱,hello,world為發布的消息
$res = $redis->publish('test','hello,world');
[/php]
subscribe(消息訂閱端): sub.php
[php]
/**
* redis sub(消息訂閱端)
* @ blog: phping.sinaapp.com
* @date 2016-04-24 15:00
*/
$redis = new Redis();
$res = $redis->pconnect('127.0.0.1', 6379,0);
$redis->subscribe(array('test'), 'callback');
// 回調函數,這里寫處理邏輯
function callback($instance, $channelName, $message) {
echo $channelName, "==>", $message,PHP_EOL;
}
[/php]
開始訂閱redis消息
前面已經提到過,消息訂閱者,即subscribe客戶端,需要獨占鏈接,即進行subscribe期間,redis-client無法穿插其他操作,此時client以阻塞的方式等待「publish端」的消息,所以我們用命令行來執行:
則 訂閱消息的redis客戶端已經啟動,隨時等待發布過來的消息並訂閱該消息.
發布redis消息
同樣,命令行執行消息發布端的腳本即可:
[shell]
php pub.php
[/shell]
切換到消息訂閱端的窗口發現終端有輸出,如下圖:
哈哈,是不是 收到了發布端發布的'hello,world'這條消息呢。
五.總結
在命令執行redis訂閱端腳本時,發現在終端會輸出:
[shell]
PHPFatalerror: Uncaughtexception'RedisException'withmessage'readerroronconnection'in…
[/shell]
這樣的錯誤是什麼原因呢?請看我下一篇blog,本篇主要是講一些基本的語法,在下一篇我會著重講解一些在實際開發中遇到過的哪些問題和跳過的哪些坑。。。 :mrgreen:
碼字不易,望轉載註明出處哈 ;)

② php 怎麼把session寫入redis

一、 安裝phpredis擴展
php連接redis需要安裝phpredis擴展。
下載地址:https://github.com/phpredis/phpredis/releases,選用相應版本。
筆者用的是php5.6.29,下載了phpredis-3.0.0安裝出了問題,於是換成phpredis-2.2.8,正常。
# tar zxvf phpredis-2.2.8.tar.gz && cd phpredis-2.2.8
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
正常情況下會提示在下面目錄下生成redis.so文件
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
# sed -i '$aextension="redis.so"' /usr/local/php/etc/php.ini
# service httpd restart
驗證:
# php -i | grep redis | grep -xq redis && echo ok || echo "phpredis extended failure"
二、 配置php連接redis(筆者使用的阿里雲redis)
# sed -i 's/session.save_handler.*/session.save_handler = redis/' /usr/local/php/etc/php.ini
# sed -i '/session.save_handler/asession.save_path ="tcp://xxxx.rds.aliyuncs.com?auth=redis密碼"' /usr/local/php/etc/php.ini
# service httpd restart

③ predis VS phpRedis

分別順序執行5W次redis寫命令,比較他們的時間(ms)。
雖有一定差別,但差別不大。

寫API,讀寫一定量key,統計時間。並使用ab並發測試,比較兩者區別。

phpRedis較predis還有一個有點,就是phpredis實現了pconnect()。pconnect在redis結束後,不會銷毀redis連接,直到空閑超時自動斷開。pconnect是依賴與php-fpm進程的,進程不死,connect就會存在。

在測試中,當高並發時,pconnect 可能會又更好的效果,但是並發低的話,connect會更快一些。
另外,pconnect連接數是和fpm數目相關聯的。

參考文章:
高並發下PHP請求Redis異常處理
phpredis中的connect和pconnect
史上最LOW的PHP連接池解決方案
請手動釋放你的資源
深入php redis pconnect

④ php redis Hash 怎麼通過 一個指定的value 查找到對應的 key 值

phpredis是php的一個擴展,效率是相當高有鏈表排序功能,對創建內存級的模塊業務關系很有用;

如果對系統存儲使用的數據以兩種角度分類,一種是按數據的大小劃分,分成大數據和小數據,另一種是按數據的冷熱程度劃分,分成冷數據和熱數據,熱數據是指讀或寫比較頻繁的數據,反之則是冷數據。

可以舉一些具體的例子來說明數據的大小和冷熱屬性。比如網站總的注冊用戶數,這明顯是一個小而熱的數據,小是因為這個數據只有一個值,熱是因為注冊用戶數隨時間變化很頻繁。再比如,用戶最新訪問時間數據,這是一個量比較大,冷熱不均的數據,大是數據的粒度是用戶級別,每一個用戶都有數據,如果有一千萬用戶,就意味著有一千萬的數據,冷熱不均是因為活躍用戶的最新訪問時間變化很頻繁,但是可能有很大一部非活躍用戶訪問時間長時間不會發生變化。

大體而言,Redis 最適合處理的是小而熱,而且是寫頻繁,或者讀寫都比較頻繁的熱數據。對於大而熱的數據,如果其它方式很難解決問題,也可以考慮使用 Redis 解決,但是一定要非常謹慎,防止數據無限膨脹。原因如下:

首先,對於冷數據,無論大小,都不建議放在 Redis 中。Redis 數據要全部放在內存中,資源寶貴,把冷數據放在其中實在是一種浪費,冷數據放在普通的存儲比如關系資料庫中就好了。

其次,對於熱數據,尤其是寫頻繁的熱數據,如果量比較小,是最適合放到 Redis 中的。比如上面提到的網站總的注冊用戶數,就是典型的 Redis 用做計數器的例子。再比如論壇最新發表列表,最新報名列表,可以控制數量在幾百到一千的規模,也是典型的 redis 做最新列表的使用方式。

另外,對於量比較大的熱數據(或者冷熱不均數據),使用 Redis 時一定要比較謹慎。這種類型數據很容易引起數據膨脹,導致 Redis 消耗內存巨大,讓系統難以承受。薄荷的一個慘痛教訓是把用戶關注(以及被關注)數據放在 Redis 中,這是一種數據量極大,冷熱很不均衡的數據,在幾百萬的用戶級別就佔用了近 10 GB左右內存,讓 Redis 變得難以應付。應對這種類型的數據,可以用普通存儲 + 緩存的方式。

如果用對了地方,比如在小而熱的數據情形,Redis 表現很棒,如果用錯了地方,Redis 也會帶來昂貴的代價,所以使用時務必謹慎。

⑤ 怎麼安裝redis PHP擴展,windows下

1、首先到相應網站下載redis:

下載完成後解壓到任意盤符如:D:/redis

裡麵包括:如圖所示。

redis-server.exe:服務程序

redis-check-mp.exe:本地資料庫檢查

redis-check-aof.exe:更新日誌檢查

redis-benchmark.exe:性能測試,用以模擬同時由N個客戶端發送M個 SETs/GETs 查詢 (類似於 Apache 的ab 工具).

當然還需要一個:redis.conf(具體內容網上隨便搜都會有)

8、PHP代碼測試

$redis = new Redis();

$redis->connect("192.168.138.2","6379"); //php客戶端設置的ip及埠

//存儲一個 值

$redis->set("say","Hello World");

echo $redis->get("say"); //應輸出Hello World

//存儲多個值

$array = array('first_key'=>'first_val',

'second_key'=>'second_val',

'third_key'=>'third_val');

$array_get = array('first_key','second_key','third_key');

$redis->mset($array);

var_mp($redis->mget($array_get));

⑥ Redis客戶端有哪些:你了解嗎

Redis客戶端工具是連接和管理Redis伺服器的軟體,主要有以下幾類:

1、Redis命令行工具:如官方的redis-cli,提供強大的互動式操作,通過命令行輸入Redis命令。

2、桌面客戶端工具:如Redis Desktop Manager、Another Redis Desktop Manager、Redis Insight、Medis等,這些本地安裝的軟體允許直接在桌面上操作。

3、Web版工具:運行在Web伺服器上,通過瀏覽器訪問,如phpRedisAdmin、RedisGraph、RedisWorkbench等。

4、IDE插件:如IntelliJ IDEA的Redis plugin、Visual Studio Code的Redis extension,這些工具集成在IDE中,便於使用。

常用的Redis客戶端工具有:

1、Redis Desktop Manager:收費的跨平台客戶端,功能豐富,支持多種數據顯示方式,命令自動提示,key的命名空間展示,以及Redis 5.0的stream數據類型。

2、Another Redis Desktop Manager:免費的跨平台客戶端,界面穩定簡潔,支持哨兵,集群,ssh通道,ssl認證,stream數據類型,訂閱功能,樹狀視圖,命令行,暗黑模式,以及多種格式化方式。

3、Redis Insight:免費的官方客戶端,功能全面,支持監控分析,rdb的分析,可查詢的圖表,時間序列,全文本查詢,批量操作,命令補全提示,文檔解釋,以及stream數據類型。

4、Medis:為Mac設計的現代Redis GUI,視覺吸引人,操作簡單,兼容多種Redis數據類型。

總結:不同的Redis客戶端工具有各自的優缺點,選擇合適的工具主要取決於需求和喜好。從趨勢上看,免費且功能豐富的Redis客戶端,如RedisInsight,更受歡迎。

⑦ laravel 不需要 phpredis 擴展嗎

需要的啊,php中凡事要使用redis的地方都需要先安裝redis的擴展

laravel也不例外,在laravel官方文檔上有寫,因為redis並不是laravel的必須組件,所以在laravel的基礎環境要求中並沒有寫需要redis的extension

而是在文檔的Cache章節中,寫到了:

在使用redis作為laravel的緩存組件之前你必須先通過composer 安裝 predis並通過PECL安裝redis的php擴展

⑧ 在php中 為什麼不能使用redis類

redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value資料庫。redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。
若想在PHP中使用redis,首先要先安裝redis。然後在PHP中配置擴展。
安裝redis。
首先下載好redis安裝文件,解壓到D盤或其他盤。
然後通過Dos命令行進行安裝。
把這個文件夾復制到其它地方,比如D:\redis 目錄下。
打開一個cmd窗口 使用cd命令切換目錄到D:\redis 運行 redis-server.exe redis.conf
如果想方便的話,可以把redis的路徑加到系統的環境變數里,這樣就省得再輸路徑了,後面的那個redis.conf可以省略,如果省略,會啟用默認的。
這時候另啟一個cmd窗口,原來的不要關閉,不然就無法訪問服務端了
切換到redis目錄下運行 redis-cli.exe -h 127.0.0.1 -p 6379

這時候,就已經完成配置了。
完成了配置之後,要在PHP中添加redis的擴展,之後才可以用PHP靈活的使用它。
在windows下安裝php的redis擴展非常簡單,下載一個.dll擴展包放到php的ext目錄下,在php.ini里邊添加一行配置就可以了。

php代碼測試

redis=newRedis();redis->connect(『127.0.0.1′,6379);
redis−>set(『test′,′helloworld!′);echoredis->get(『test』);

輸出hello world!

閱讀全文

與phpredis訂閱與發布相關的資料

熱點內容
三星壁紙安卓怎麼設置 瀏覽:25
整式乘除運演算法則 瀏覽:501
在svn內創建文件夾 瀏覽:796
解壓縮有後綴 瀏覽:521
手機版我的世界伺服器如何與隊友連接 瀏覽:919
安卓版抖音如何看好友抖音在線 瀏覽:65
雪佛蘭景程空調壓縮機轉風扇不轉 瀏覽:186
文檔加密傳輸中關村 瀏覽:391
雲圖計劃全演算法 瀏覽:479
程序員開工作室需要什麼手續 瀏覽:456
Python中的u1 瀏覽:108
51單片機無線音樂門鈴設計 瀏覽:531
408演算法題分布 瀏覽:574
三台cnc需要配多大的壓縮機 瀏覽:938
壓縮波的另一個名稱 瀏覽:365
電廠電氣設備pdf 瀏覽:270
linux驅動程序編譯 瀏覽:637
編譯代碼有什麼好處 瀏覽:217
phpmysql模糊搜索 瀏覽:101
程序員小七吃美食 瀏覽:825