PHP中使用redis的基礎
Redis 是開源免費的,是一個高效能的key-value資料庫。
Redis特點
Redis 與其他 key - value 快取產品有以下三個特點:
1.Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
2.Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
3.Redis支援資料的備份,即master-slave模式的資料備份。
redis優勢:效能高、豐富的資料型別、原子性、豐富的特性
redis支援5種資料型別:string字串、hash雜湊、list列表、set集合、zset有序集合
單機redis支援多個數據庫,但是多個數據庫是隔離的,不能共享,如果是叢集,就沒有資料庫的概念
redis鍵命令ofollow,noindex">https://redis.io/commands
常用:
-
是否存在:exists
-
刪除:del
-
序列化:dump
-
隨機返回key:randomkey
-
修改key名:rename
redis釋出訂閱
redis釋出訂閱(pub/sub)是一種訊息通訊模式:傳送者傳送訊息,訂閱者接收訊息
redis客戶端可以訂閱任意數量的頻道
當有新訊息通過PUBLISH命令傳送給頻道時,這個訊息就會被髮送給訂閱這個頻道的多個客戶端
訂閱subscribe,釋出publish
redis事務
redis事務一次可以執行多個命令,並且:
批量操作在傳送EXEC命令前被放入佇列快取
收到EXEC命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行
在事務執行過程中,其他客戶端提交的命令請求不會插入到事務執行命令序列中
一個事務從開始到執行會經歷三個階段:開始事務->命令入列->執行事務
單個redis命令的執行是原子性的,但是redis事務的執行不是原子性的。事務可以理解為一個打包執行的批量執行指令碼,但是批量指令的執行不是原子化的操作,所以中間某條指令的失敗不會導致前面已經執行指令的回滾,也不會造成後續指令的不執行。
客戶端連線
redis通過監聽一個tcp埠或者unix socket的方式來接收來自客戶端的連線,當一個連線建立後,redis內部會進行以下一些操作:
1.首先,客戶端socket會被設定為非阻塞模式,因為redis在網路事件處理上採用的是非阻塞多路複用模型
2.然後為這個socket設定TCP_NODELAY屬性,禁用Nagle演算法(允許小包傳送,效能高、延時少)
3.然後建立一個可讀的檔案事件用於堅定這個客戶端socket的資料傳送
redis是一種基於客戶端-服務端模型以及請求/相應協議的TCP服務,意味著通常情況下請求會遵循以下步驟:
客戶端向服務端傳送一個查詢請求,並且監聽socket返回,通常是以阻塞模式,等待服務端響應
服務端處理命令,並且將結果返回客戶端
管道技術
redis的管道技術,在服務端未響應的時候,客戶端可以持續向服務端傳送請求,並最終一次性讀取所有的服務端響應。管道技術最顯著的優勢是提高了redis的服務效能
redis分割槽
分割槽是分割資料到多個redis例項的處理過程,因此每個例項只儲存key的一個子集
分割槽的優勢:
-
利用多臺計算機的記憶體,構造更大的資料庫
-
通過多核和多臺計算機,允許擴充套件計算能力
-
通過多臺計算機和網路介面卡,允許擴充套件網路頻寬
分割槽的不足:
-
涉及多個key的操作不被支援
-
設計多個key的redis事務不能使用
-
使用分割槽的時候,資料處理比較複雜
增加或者刪除容量時也比較複雜。redis叢集大多數支援在執行時增加、刪除節點的透明資料平衡能力,但是類似於客戶端分割槽、代理等其他系統,則不支援這項特性
分割槽型別:範圍分割槽&雜湊分割槽
範圍分割槽的不足,是需要一個區間範圍到例項的對映表,這個表要被管理,同時還需要各種物件的對映表