phpredis集群
『壹』 如何查看redis 集群的部署
什麼是Redis sharding集群
Redis(redis.io)作為最流行的KV資料庫,很長一段時間都是單機運行,關於如何實現Redis的數據在多個節點上的分布,在Redis3.0出來之前,有很多第三方的方案。 :
Client hash
這是最簡單的實現,通過在客戶端利用一致性hash演算法,將數據分布到不同節點。這種方法的缺點非常明顯,缺少故障自動failover能力,並且在擴容時數據分布的搬遷,也比較費勁。
代理模式
一個是Redis官方推薦的Twemproxy,是由twitter公司開發;
另一個是國內豌豆莢開源的codis;
代理模式最大的好處是仍然使用redis單機的sdk進行開發,維護簡單。
『貳』 使用 redis-cli 搭建 Redis 集群
參考: Redis 集群教程
redis.conf 文件中包含很多信息,如:埠號、持久化方式、持久化的文件等等。
使用寫入了不同埠號的配置文件就可以啟動多個 Redis 實例。
下面是一個最少選項的集群的配置文件:
文件中的 cluster-enabled 選項用於開實例的集群模式, 而 cluster-conf-file 選項則設定了保存節點配置文件的路徑, 默認值為 nodes.conf 。節點配置文件無須人為修改, 它由 Redis 集群在啟動時創建, 並在有需要時自動進行更新。
要讓集群正常運作至少需要三個主節點,不過在剛開始試用集群功能時, 強烈建議使用六個節點: 其中三個為主節點, 而其餘三個則是各個主節點的從節點。
首先, 讓我們進入一個新目錄, 並創建六個以埠號為名字的子目錄, 稍後我們在將每個目錄中運行一個 Redis 實例: 命令如下:
在文件夾 7000 至 7005 中, 各創建一個 redis.conf 文件, 文件的內容可以使用上面的示例配置文件, 但記得將配置中的 port 和 cluster-conf-file 中的埠號數字 從 7000 改為與文件夾名字相同的號碼。不同的集群節點要使用不同的 cluster-conf-file 。
配置文件的路徑是可以自定義的。創建完畢後分別啟動一個實例。
網上看到的教程,包括參考的官方文檔里的文章,大多是使用以下方式創建集群。
這個命令在這里用於創建一個新的集群, 選項–replicas 1 表示我們希望為集群中的每個主節點創建一個從節點。
之後跟著的其他參數則是這個集群實例的地址列表,3 個 master 3 個 slave redis-trib 會列印出一份預想中的配置給你看,如果你覺得沒問題的話,就可以輸入 yes,redis-trib 就會將這份配置應用到集群當中,讓各個節點開始互相通訊,最後可以得到如下信息:
這表示集群中的 16384 個槽都有至少一個主節點在處理,集群運作正常。
但是在 Redis 的 github 倉庫 中看到,該文件已經不建議使用。
我在 手把手教你實現 Docker 部署 Redis 集群 的評論中看到, 現在 redis-cli --cluster 命令已經可以創建集群,分配槽,分配主從伺服器了 ,於是使用以下命令了解到相關的命令。
可以看到,命令的組成形式和舊方式是一致的。
可以看到執行命令後,redis 客戶端做了以下工作:
輸入 yes 後,redis 客戶端做了以下工作:
集群搭建完畢。
因為 Redis Cluster 默認要求所有的槽位被覆蓋,可以通過修改 cluster-require-full-coverage yes 配置來改變該行為。
CLUSTERDOWN The cluster is down in redis 這里的回答中提到:我們可以使用 N 個Master 和 N+1 個 Slave,正常情況下多餘的一個實例作為隨機一個 Master 的 Slave,一旦有實例宕機,可以迅速頂替,以保證每個主節點總是有至少一個從節點保持數據同步。
ps:搜索命令行的輸出時,才看到 深入理解Redis系列之集群環境搭建 這篇文章,有時候搜索的關鍵詞不合適容易走彎路啊……
『叄』 用phpredis操作redis集群支持publish和subscribe嗎
用phpredis操作redis集群支持publish和subscribe
參數可選Redis::MULTI或Redis::PIPELINE. 默認是 Redis::MULTI
Redis::MULTI:將多個操作當成一個事務執行
Redis::PIPELINE:讓(多條)執行命令簡單的,更加快速的發送給伺服器,但是沒有任何原子性的保證
discard:刪除一個事務
返回值
multi(),返回一個redis對象,並進入multi-mode模式,一旦進入multi-mode模式,
以後調用的所有方法都會返回相同的對象,只到exec()方法被調用。
watch, unwatch (代碼測試後,不能達到所說的效果)
監測一個key的值是否被其它的程序更改。如果這個key在watch 和 exec (方法)間被修改,
這個 MULTI/EXEC 事務的執行將失敗(return false)
unwatch 取消被這個程序監測的所有key
『肆』 php面試題 memcache和redis的區別
Redis與Memcached的區別傳統Mysql+ Memcached架構遇到的問題實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。2.Memcached與MySQL資料庫數據一致性問題。3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。4.跨機房cache同步問題。眾多NoSQL百花齊放,如何選擇最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實際歸根結底最重要的是了解這些產品的定位,並且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解決以下幾種問題1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然後定期compat歸並到磁碟上,將隨機寫優化為順序寫,提高寫入性能。4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支持schema-free的,直接存儲json格式數據,並且支持auto-sharding等功能,比如mongodb。面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。Redis適用場景,如何正確的使用前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。2 Redis支持數據的備份,即master-slave模式的數據備份。3 Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。在Redis中,並不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的 key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據「swappability = age*log(size_in_memory)」計 算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在內存中清除。這種特性使得Redis可以 保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由於Redis將內存 中的數據swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個 操作,直到子線程完成swap操作後才可以進行修改。使用Redis特有內存模型前後的情況對比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used當 從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。 這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行 批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設置I/O線程 池的大小,對需要從swap文件中載入相應數據的讀取請求進行並發操作,減少阻塞的時間。如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。補充的知識點:memcached和redis的比較1 網路IO模型Memcached是多線程,非阻塞IO復用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將連接描述字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變數加鎖,進行計數等工作,帶來了性能損耗。(Memcached網路IO模型)Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。2.內存管理方面Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可能會被剔除,原因可以參考Timyang的文章:/memcached/)。Memcached的客戶端軟體實現非常多,包括C/C++, PHP, java, Python, Ruby, Perl, Erlang, Lua等。當前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和WordPress等。在Window系統下,Memcached的安裝非常方便,只需從以上給出的地址下載可執行軟體然後運行memcached.exe –d install即可完成安裝。在Linux等系統下,我們首先需要安裝libevent,然後從獲取源碼,make && make install即可。默認情況下,Memcached的伺服器啟動程序會安裝到/usr/local/bin目錄下。在啟動Memcached時,我們可以為其配置不同的啟動參數。1.1 Memcache配置Memcached伺服器在啟動時需要對關鍵的參數進行配置,下面我們就看一看Memcached在啟動時需要設定哪些關鍵參數以及這些參數的作用。1)-p Memcached的TCP監聽埠,預設配置為11211;2)-U Memcached的UDP監聽埠,預設配置為11211,為0時表示關閉UDP監聽;3)-s Memcached監聽的UNIX套接字路徑;4)-a 訪問UNIX套接字的八進制掩碼,預設配置為0700;5)-l 監聽的伺服器ip地址,默認為所有網卡;6)-d 為Memcached伺服器啟動守護進程;7)-r 最大core文件大小;8)-u 運行Memcached的用戶,如果當前為root的話需要使用此參數指定用戶;9)-m 分配給Memcached使用的內存數量,單位是MB;10)-M 指示Memcached在內存用光的時候返回錯誤而不是使用LRU演算法移除數據記錄;11)-c 最大並發連數,預設配置為1024;12)-v –vv –vvv 設定伺服器端列印的消息的詳細程度,其中-v僅列印錯誤和警告信息,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印內存狀態轉換信息;13)-f 用於設置chunk大小的遞增因子;14)-n 最小的chunk大小,預設配置為48個位元組;15)-t Memcached伺服器使用的線程數,預設配置為4個;16)-L 嘗試使用大內存頁;17)-R 每個事件的最大請求數,預設配置為20個;18)-C 禁用CAS,CAS模式會帶來8個位元組的冗餘;2. Redis簡介Redis是一個開源的key-value存儲系統。與Memcached類似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字元串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計算機語言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis伺服器。當前Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像Flickr、Github等均在使用Redis的緩存服務。Redis的安裝非常方便,只需從bin目錄下。在啟動Redis伺服器時,我們需要為其指定一個配置文件,預設情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。php面試題 memcache和redis的區別
『伍』 php redis如何使用
開始在 PHP 中使用 Redis 前,要確保已經安裝了 redis 服務及 PHP redis 驅動,且你的機器上能正常使用 PHP。
PHP安裝redis擴展
/usr/local/php/bin/phpize #php安裝後的路徑
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
修改php.ini文件
vi /usr/local/php/lib/php.ini
增加如下內容:
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20090626"
extension=redis.so
安裝完成後重啟php-fpm 或 apache。查看phpinfo信息,就能看到redis擴展。
連接到 redis 服務
<?php
//連接本地的 Redis 服務
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//查看服務是否運行
echo "Server is running: " . $redis->ping();
?>
執行腳本,輸出結果為:
Connection to server sucessfully
Server is running: PONG
Redis PHP String(字元串) 實例
<?php
//連接本地的 Redis 服務
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//設置 redis 字元串數據
$redis->set("tutorial-name", "Redis tutorial");
// 獲取存儲的數據並輸出
echo "Stored string in redis:: " . jedis.get("tutorial-name");
?>
執行腳本,輸出結果為:
Connection to server sucessfully
Stored string in redis:: Redis tutorial
Redis PHP List(列表) 實例
<?php
//連接本地的 Redis 服務
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//存儲數據到列表中
$redis->lpush("tutorial-list", "Redis");
$redis->lpush("tutorial-list", "Mongodb");
$redis->lpush("tutorial-list", "Mysql");
// 獲取存儲的數據並輸出
$arList = $redis->lrange("tutorial-list", 0 ,5);
echo "Stored string in redis:: "
print_r($arList);
?>
執行腳本,輸出結果為:
Connection to server sucessfully
Stored string in redis::
Redis
Mongodb
Mysql
Redis PHP Keys 實例
<?php
//連接本地的 Redis 服務
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
// 獲取數據並輸出
$arList = $redis->keys("*");
echo "Stored keys in redis:: "
print_r($arList);
?>
執行腳本,輸出結果為:
Connection to server sucessfully
Stored string in redis::
tutorial-name
tutorial-list
『陸』 php操作redis怎樣創建多個集合
string或BOOL 如果鍵不存在,則返回 FALSE。否則,返回指定鍵對應的value值。
範例:<?php
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
$result = $redis->get('test');
var_mp($result); //結果:string(11) "11111111111"
?>
『柒』 php redis 有序集合 如何獲取最大的數據
和set一樣是字元串的集合,不同的是每個元素都會關聯一個double類型的score。
實現使用的是skip list和hash table,skip list的實現使用的是雙線鏈表。
Score的主要作用是排序,因此sorted set主要用作索引。
『捌』 redis分布式 為什麼還要主從
redis 分布式,主從同步
張映 發表於 2011-06-27
分類目錄: cache, nosql
標簽:master, redis, slave, 主從, 分布式, 集群
redis和memcache比較像的,memcache可以實現伺服器的集群,redis肯定也是可以的。下面在一台機,實現redis主從復制。
1,一下redis.conf,生成一個從機的配置
cp /usr/local/redis/redis.conf /usr/local/redis/redis_slave.conf
2,修改主伺服器的配置redis.conf
bind 127.0.0.1
3,修改從伺服器的配置redis_slave.conf
pidfile /usr/local/redis/var/redis_slave.pid
port 10002
bind 127.0.0.1
logfile /usr/local/redis/var/redis_slave.log
dbfilename mp_slave.rdb
slaveof 127.0.0.1 6379
4,啟動主伺服器,從伺服器
redis-server /usr/local/redis/redis.conf
redis-server /usr/local/redis/redis_slave.conf
查看一下,redis.log文件會有以下內容
[3774] 27 Jun 12:53:32 * The server is now ready to accept connections on port 10002
[3774] 27 Jun 12:53:32 - 0 clients connected (0 slaves), 539568 bytes in use
[3774] 27 Jun 12:53:32 * Connecting to MASTER...
[3772] 27 Jun 12:53:32 - Accepted 127.0.0.1:33237
[3772] 27 Jun 12:53:32 * Slave ask for synchronization
[3772] 27 Jun 12:53:32 * Starting BGSAVE for SYNC
[3772] 27 Jun 12:53:32 * Background saving started by pid 3775
[3774] 27 Jun 12:53:32 * MASTER <-> SLAVE sync started: SYNC sent
[3775] 27 Jun 12:53:32 * DB saved on disk
[3772] 27 Jun 12:53:33 * Background saving terminated with success
[3772] 27 Jun 12:53:33 * Synchronization with slave succeeded
[3774] 27 Jun 12:53:33 * MASTER <-> SLAVE sync: receiving 333 bytes from master
[3774] 27 Jun 12:53:33 * MASTER <-> SLAVE sync: Loading DB in memory
[3774] 27 Jun 12:53:33 * MASTER <-> SLAVE sync: Finished with success
查看一下
root@ubuntu:/usr/local/redis# ps -e|grep redis
3774 ? 00:00:00 redis-server
4148 ? 00:00:00 redis-server
5,測試結果
<?php
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('test',json_encode(array(1,2,3,4)));
print_r(json_decode($redis->get('test')));
?>
root@ubuntu:/usr/local/redis# telnet 127.0.0.1 10002
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get test
$9
[1,2,3,4]
緩存數據是放在6379這個埠的伺服器上,代碼執行後,登錄到10002埠的slave伺服器上也可以看到有數據,說明已經同步了。
我嘗試了一下,redis的主主同步,但是沒有成功,我看了一下log,以從伺服器127.0.0.1 10002為master的時候,同時啟動二個埠,怎麼也連接不上127.0.0.1 6379是不支持呢?還是配置有問題,我在網上查了一下,沒看到有人配置主主同步的。
『玖』 thinkphp中的redis怎麼用啊
config.php 加如下代碼 ip根據自己的來修改
'DATA_CACHE_PREFIX' => 'Redis_',//緩存前綴
'DATA_CACHE_TYPE'=>'Redis',//默認動態緩存為Redis
'REDIS_RW_SEPARATE' => true, //Redis讀寫分離 true 開啟
'REDIS_HOST'=>'192.168.91.102', //redis伺服器ip,多台用逗號隔開;讀寫分離開啟時,第一台負責寫,其它[隨機]負責讀;
'REDIS_PORT'=>'6379',//埠號
'REDIS_TIMEOUT'=>'300',//超時時間
'REDIS_PERSISTENT'=>false,//是否長連接 false=短連接
'REDIS_AUTH'=>'',//AUTH認證密碼
任意控制器下的方法下寫:
測試redis
$redis = new \Redis();
$redis->connect('192.168.91.102',6379);
$redis->set('test','hello world!');
echo $redis->get("test");
『拾』 java操作redis集群問題CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information
java操作redis集群問題CLUSTERDOWN The cluster is down. Use CLUSTER INFO for more information,配置沒有配置好的問題。