Redis-Predis 扩展
- Predis
Predis 適用于 PHP 5.3 以上版本在 Redis 使用,其中包括了集群的使用。
主要功能
- 支持各個版本的 Redis(從?2.0?到?3.0?以及?unstable)
- 使用哈希方式或用戶自定義方式進行集群中節點的客戶端分片
- 支持?Redis-cluster(集群)?(Redis>= 3.0).
- 支持主/從結構的讀寫分離
- 支持已知的所有 Redis 客戶端命令
使用方式
Predis 下載地址有:?PEAR渠道?以及?GitHub方式.
加載依賴包
Predis依賴于PHP的自動加載功能,在需要的時候裝載它的文件并符合PSR-4標準.?
使用如下:
連接 Redis
如果在連接時不加任何參數,默認會把?127.0.0.1?和?6379?作為默認的host 和 port 并且連接超時時間是 5 秒。如:
$client = new Predis\Client(); $client->set('foo', 'bar'); $value = $client->get('foo');如果需要加連接參數,可以以 URI 或者以數組的形式。如:
// 數組形式 $client = new Predis\Client(['scheme' => 'tcp','host' => '10.0.0.1','port' => 6379, ]);// URI 形式: $client = new Predis\Client('tcp://10.0.0.1:6379');當使用的是數組形式的時候。Predis自動轉換到集群模式,并使用客戶端的分片邏輯。?
另外,參數也可以使用 URI 和數組混和,如:
Client 配置
Client 的更多配置參數可以通過第二個參數傳進去:
$client = new \Predis\Client($connection_parameters,['profile' => '2.8', 'prefix' => 'sample:'] );Redis 會給所需要的參數默認值,參數主要有:
- profile: 針對特定版本的配置,因為不同版本對同樣操作可能有差異.
- prefix: 自動給要處理的 key 前面加上一個前綴.
- exceptions: Redis 出錯時是否返回結果.
- connections: 客戶端要使用的連接工廠.
- cluster: 集群中使用哪個后臺 (predis,?redis?或者客戶端配置).
- replication: 主/從中使用哪個后臺 (predis 或者 客戶端配置).
- aggregate: 合并連接方式 (覆蓋?cluster?和?replication).
合并連接
Predis 支持集群及主/從結構的連接。?
默認情況下,使用客戶端的分片邏輯,也可以使用 Redis 服務端提供的方式,即:redis集群.?
在主/從結構中, Predis 支持一主多從的形式,并且在讀取操作時連接從機,寫操作時連接到主機。
主/從結構
客戶端連接時可以進行主/從的配置。配置好后,當執行讀取操作時會連接從機;執行寫操作時會連接主機。實現讀寫分離。?
下面是比較基礎的主/從配置:
雖然 Predis 可以識別讀/寫操作,但 EVAL, EVALSHA 是兩個特例。因為客戶端不知道 LUA腳本里是否有寫操作,所以通常這兩個操作是在 Master 上執行。?
雖然這是個默認的行為,但有些 Lua 腳本里如果不包括寫操作,客戶端還是可能會在 slaves 上執行。可以通過配置來指定。
集群
通過傳遞簡單的和配置就可以實現集群功能,并且是在客戶端進行的分片。但如果想使用 redis-cluster 功能(Redis 3.0后的版本中可用)。可以如下配置:
$parameters = ['tcp://10.0.0.1', 'tcp://10.0.0.2']; $options = ['cluster' => 'redis'];$client = new Predis\Client($parameters, $options);當使用 redis-cluster 時,不用把集群中所有的節點都在參數中傳遞進去,只需要傳少數幾個就可以了。Predis會自動從某一臺服務器上獲取所有的哈希槽映射圖。
注意: 目前 Predis 還不支持redis-cluster 中的 主/從 結構
命令管道
管道有利于提升大量命令要發送時的性能問題。它可以減小網絡往返的延遲。比如有兩個命令,數據需要:?
- 發送命令到服務端?
- 服務端執行命令?
- 返回結構至客戶端
每個操作都要執行該操作,管道的意思是可以將多個命令打包,一起發送至服務端,所有命令執行完后再將最終結果返回。?
管道使用方式有兩種,一種是通過回調函數;一種是通過接口:
事務
Redis 可以使用?MULTI?和?EXEC?命令實現事務 功能。這里直接使用命令通道即可:
// 回調方式: $responses = $client->transaction(function ($tx) {$tx->set('foo', 'bar');$tx->get('foo'); });// 接口方式: $responses = $client->transaction()->set('foo', 'bar')->get('foo')->execute();我們可以使用?WATCH?和?UNWATCH?實現CAS (check and set)。如:
function zpop($client, $key) {$element = null;$options = array('cas' => true, // 使用 CAS 方式'watch' => $key, // 要監視的 key'retry' => 3, // 出錯時重試次數);$client->transaction($options, function ($tx) use ($key, &$element) {@list($element) = $tx->zrange($key, 0, 0);if (isset($element)) {$tx->multi(); // 開啟事務$tx->zrem($key, $element);}});return $element; }$client = new Predis\Client($single_server); $zpopped = zpop($client, 'zset');自定義命令
如果我們升級 Redis 到新的版本,而且有部分命令的處理方式有變更,但我們想使用之前的邏輯,這時我們可以自定義命令:
// 自定義一個類,繼承 Predis\Command\Command: class BrandNewRedisCommand extends Predis\Command\Command {public function getId(){return 'NEWCMD';} }// 注冊新的自定義命令: $client = new Predis\Client(); $client->getProfile()->defineCommand('newcmd', 'BrandNewRedisCommand');$response = $client->newcmd();LUA 命令
Redis 2.6 后的版本可以使用?
EVAL?和?EVALSHA?來執行LUA 腳本 。?
Predis 支持簡單的接口支持該功能。?
LUA 腳本可以是在服務端的,也可以是通過參數傳進去的。?
默認情況下,使用?EVALSHA?也可以備用?EVAL?:
性能
本機測試
Predis 是純 PHP 的擴展,所以它的性能可能有些不足。但在實際使用中應該是足夠了。下面有一些測試數據,是使用 PHP5.5.6,Redis 2.8 :
21000 SET/秒 key 和 value 都使用 12 type 大小 21000 GET/秒 使用 _KEYS *_ 命令在 0.130 秒可以查詢到 30000 個 key和 Predis 相似的擴展有:?phpredis,一個用 C 寫的擴展。測試性能結果如下:
30100 SET/秒 key 和 value 都使用 12 type 大小 29400 GET/秒 使用 _KEYS *_ 命令在 0.035 秒可以查詢到 30000 個 keyphpredis?看上去要快不少。但實際上相差的也不算太多,而且一個是C 寫的,一個是純 php 的擴展。并且上面的測試很簡單,不足以定論。下面來看看類似實際生產環境中的測試。
外網環境測試
上面是一些連接本機的測試,下面連接遠程服務器試試:
Predis: 3200 SET/秒 key 和 value 都使用 12 type 大小 3200 GET/秒 使用 _KEYS *_ 命令在 0.132 秒可以查詢到 30000 個 keyphpredis: 3500 SET/秒 key 和 value 都使用 12 type 大小 3500 GET/秒 使用 _KEYS *_ 命令在 0.045 秒可以查詢到 30000 個 key可以看到兩者效率相近了,這是因為網站的延遲會是性能非常重要的問題。Predis 可以使用命令通道,省去了不少時間。
最后選擇
Predis 可以兼容各個版本的 Redis(目前支持 1.2 到2.8),并且可以通過自定義命令來兼容各版本的差異。?
phpredis 在本機的優勢是有的。?
或者,可以兩者都使用。
來源:http://blog.sina.com.cn/s/blog_5f54f0be0102vygj.html
總結
以上是生活随笔為你收集整理的Redis-Predis 扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国综合国力的提高和国际地位提高一个意思
- 下一篇: 社会优抚具有的特征是什么(社会优抚的特点