這篇文章主要介紹了PHP資料庫操作redis用法,結合執行個體形式詳細分析了php安裝、使用redis的步驟、方法與相關注意事項,需要的朋友可以參考下
具體如下:
memcache雖然好用,解決了資料庫遇到高並發時的IO問題,但還有很多問題丞待解決:
1、資料持久性問題,memcache用記憶體進行儲存,一旦memcache伺服器宕機,那麼所儲存的資料全部丟失。
2、memcache儲存的資料類型單一,只支援key-value型的資料,要儲存複雜類型的資料,必然需要PHP指令碼的大量邏輯操作。
redis基本介紹
redis也是一個記憶體非關係型資料庫,它擁有memcache在資料存放區上的全部優點,而且在memcache的基礎上(memcache的介紹可以看前面一篇:http://www.jb51.net/article/121315.htm
增加了資料持久性功能,redis用rdb和aof兩種方式實現資料持久性,在伺服器突然宕機時也能幾乎保留已存的全部資料。
增加了string(字串)、set(集合)、sorted_set(有序集合)、hash(雜湊)、list(鏈表)資料類型,方便了多類型的儲存和資料庫操作。
增加了安全驗證(可為伺服器設定串連密碼)。
redis的主從分離等系統更完善(官方開發)。
原生支援發布/訂閱、隊列、緩衝等工具。
當然,相比較memcache,它的資料庫操作也較為複雜。
redis的應用情境和安裝
redis除了可以用在memcache能用的地方,它還可以用在:
可以用鏈表來儲存資料,讀取其最新資訊。
可以用有序列表格儲存體資料,讀取其熱門排行榜資料
可以用集合來儲存關注/被關注資訊。
在官網(http://redis.io/)下載到它的最新版本,直接解壓,因為redis官方已經編譯過了,直接進行make / make test ,在make install時可以指定其安裝路徑。
安裝完成後,將安裝包裡的redis的conf檔案mv到安裝目錄的bin目錄下,它是配置和啟動redis所必需的。
除此,安裝目錄檔案下bin目錄裡還有如下檔案。
redis-benchmark //效能測試工具 -n xxx 表示發出xxx條命令用來測試
redis-check-aof //檢查aof日誌的工具
redis-check-dump //檢查rbd日誌的工具
redis-cli //用戶端
redis-server //redis的伺服器處理序
redis-sentinel //redis哨兵模式的進程
我們用vim開啟redis.conf來簡單配置redis伺服器。
將daemonize 選項改為yes來後台運行
database n 設定一個redis伺服器裡有n個伺服器,預設為0-15共16個
port n 來設定redis伺服器的監聽連接埠
設定requirepass yourpassword來設定密碼,用戶端串連後用auth password來通過驗證
我們使用./redis-server ./redis.conf命令來開啟redis伺服器。
使用./redis-cli [-p port]來串連伺服器(預設6379)。
redis的命令
基本(包括string字串類型)命令
set key value [ex|px n] //設定值[並設定到期時間為n秒/毫秒]get key //擷取值del key //刪除值incby|decby key n //將key值自增或自減nrename key newkey//覆蓋原來的select n//選擇第n個資料庫ttl key //查詢key的到期時間,-1表示永不到期,不存在的為-2expire key n //設定key的到期時間為n秒 type key //擷取key的儲存類型flushdb //清除當前資料庫中的值shutdown [nosave]//關閉伺服器[不儲存]
list(鏈表)命令
lpush/rpush list value1 [value2 value3...] //將value壓入鏈表頭/尾lpop/rpop list //彈出鏈表頭/尾的值llen list //擷取鏈表長度
set(集合)命令
sadd set value //往集合中添加valuesmembers set //查看集合中的全部資料srem set value1[value2...]//刪除集合中的元素sismember set value //判斷value是否是集合中的一個元素
sorted_set(有序集合)命令
zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,並定義其score,集合會用score對其排序
zrange sorted_set a b [withscores]從第a到第b顯示有序列表中的值 b為-1時顯示全部,[顯示各個值的score]
zrank/zrevrank sorted_set key 正序/倒序顯示key在有序集合中的位置
zrem sorted_set key 刪除有序集合中的key
zcard sorted_set [m n]計算有序集合中[score在m到n之間的]一共有多少個
hash(雜湊類型)命令
hset hashset key value 設定hash表key的值為value
hget hashset key 擷取hash表的key值
hdel hashset key 刪除hash表中的一個key
hlen hashset 擷取hash表的長度
redis命令繁多,這裡只列了一點簡單的,具體命令可以其官網或其中文站http://www.redis.cn/查看翻譯文檔
redis的事務和發布、訂閱
redis中的事務與mysql的類似,只有語句有些不同。
redis mysql開始事務 multi start transition 事務中的query語句執行事務 exec commit復原事務 discard roll back
對於並發影響,redis有watch語句控制,被watch語句監測的key值一旦在事務提交前發生變化,則事務自動被取消復原。
watch key1 [key2...]
unwatch 取消所有監測。
redis原生髮布和訂閱功能,它類似於設計模式中的觀察者模式,被訂閱對象一旦發布了新的訊息,那麼所有訂閱對象都會收到這條訊息。使用方式為:
subscribe key //訂閱某個key,如果這個key發布了新的訊息,則會收聽到public key value//發布訊息key,值為value,傳回值是收到這個訊息的人的個數unsubscribe key //取消監聽psubscribe key1 key2/pattrn //[根據模式]監聽多個key
redis的資料持久化
redis通過rdb和aof兩種方式實現資料持久化,兩種資料持久化方式都會佔用CPU資源,拖慢redis的執行效率,一般兩種模式配合使用。
rdb方式的主要原理就是達到某一寫入條件後把記憶體中的所有資料的快照儲存一份到磁碟上,資料恢複時用資料快照恢複。
aof方式是通過將每條redis執行命令記錄入文字檔,恢複資料時重複執行記錄的命令。
rdb方式實現資料持久化
用save/bgSave命令可以主動使用rdb方式[後台]儲存rdb
修改redis.conf檔案進行配置
save m n //在m秒內有n次修改即進行一次快照,儲存點很重要,一般會配置多個條件,滿足其中之一就儲存stop-writes-on-bgsave-error yes //在進行快照的過程中如果出錯,則停止寫入rdbcompression yes //設定進行資料壓縮rdbchecksum yes //匯入資料時檢查檔案是否損壞dbfilename xxx.rdb //匯出的檔案名稱dir path //匯出的檔案路徑
aof方式實現資料持久化
aof持久化的問題在於將每條指令都記錄下來,即使是對一個鍵的反覆操作,這樣會導致aof檔案越來越大,使用aof重寫將會大大減小aof檔案的體積,因為它是在最後將資料庫內資料的狀態統一逆化為命令,而不論一個key經過了多少次變化。使用 bgrewrite 命令可手動重寫aof檔案。
配置redis.conf檔案:
noapppendfsync-on-rewrite yes //設定匯出rdb時停止寫入aof,aof會被寫在記憶體隊列裡,dump rdb 完成後統一進行寫入操作。appendfsync everysec //每秒寫入一次appendfilename //path/filename.aofauto-aof-rewrite-percentage 100 //檔案大小增長100%時重寫auto-aof-rewrite-min-size 64m //檔案至少達到64m時重寫
redis的主從複製
主從複製時,主從都要以自己的.conf檔案來啟動伺服器。主伺服器可以將rdb關閉,以從伺服器來產生rdb,加快主伺服器的速度。
從伺服器複製一個redis6380.conf檔案,設定連接埠,pid存放檔案,唯讀,主伺服器的密碼。
port 6380pidfile filenameslave-read-only yesmasterauth password
設定完成後,分別用不同的conf檔案開啟伺服器。
考慮到主伺服器宕機的情況,我們用sentinel redis哨兵來監測伺服器狀態,在主伺服器宕機之後做出反應。sentinel是redis整合的,我們只需要將安裝包裡的sentinel.conf檔案拷貝到redis/bin目錄下,使用redis-sentinel進程檔案來啟動伺服器即可。
port 26379 //sentinel監聽的連接埠號碼daemonize yes //後台啟動進程sentinel monitor mymaster 192.168.100.211 6379 2 //設定主進程ip和連接埠號碼,並設定兩個哨兵發現主伺服器長時間無法串連才判定其宕機sentinel down-after-milliseconds mymaster 30000 //30000毫秒串連不上判定為無法串連sentinel parallel-syncs mymaster 1 //一個主伺服器開啟時,同時複製的從伺服器數,太大的話會造成伺服器瞬間擁堵sentinel failover-timeout mymaster 900000 //在90000秒內哨兵不再試圖恢複原主伺服器
PHP操作redis伺服器
安裝好php的redis擴充後(具體可參考前面的文章 Linux下php安裝Redis擴充的方法 http://www.jb51.net/article/99775.htm),就可以直接使用redis的類函數庫了。
如下是典型的redis應用。
$redis=new Redis(); //執行個體化一個Redis對象$redis->connect('host',port); //串連redis伺服器$redis->auth('password'); //用密碼認證$redis->set($key,$value[,$expire_time]);//設定一個值$content=$redis->get($key); //擷取值