一、redis支持數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。redis
二、redis持久化的兩種方式:RDB和AOF後端
RDB持久化是在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork(叉)一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。緩存
優勢:(1)文件備份只有一個文件,容易查找恢復;(2)災難恢復效率高;安全
缺點:(1)若是在定時持久化前出現宕機,數據將丟失;(2)RDB是經過fork子進程來協助完成持久化,若是數據集較大會致使服務器短期內中止服務bash
AOF持久化以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。服務器
優勢:數據安全性更高,能夠配置同步持久化網絡
缺點:災難恢復效率低session
三、緩存穿透、緩存擊穿、緩存雪崩及解決方案數據結構
緩存穿透ui
訪問一個不存在的key,緩存不起做用,請求會穿透到DB,流量大時DB會掛掉。
解決方案
緩存擊穿
一個存在的key,在緩存過時的一刻,同時有大量的請求,這些請求都會擊穿到DB,形成瞬時DB請求量大、壓力驟增。
解決方案
緩存雪崩
大量的key設置了相同的過時時間,致使在緩存在同一時刻所有失效,形成瞬時DB請求量大、壓力驟增,引發雪崩。
解決方案
四、redis 適合的場景
會話緩存(Session Cache)
最經常使用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其餘存儲(如Memcached)的優點在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,若是用戶的購物車信息所有丟失,大部分人都會不高興的,如今,他們還會這樣嗎?
幸運的是,隨着 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣爲人知的商業平臺Magento也提供Redis的插件。
全頁緩存(FPC)
除基本的會話token以外,Redis還提供很簡便的FPC平臺。回到一致性問題,即便重啓了Redis實例,由於有磁盤的持久化,用戶也不會看到頁面加載速度的降低,這是一個極大改進,相似PHP本地FPC。
再次以Magento爲例,Magento提供一個插件來使用Redis做爲全頁緩存後端。
此外,對WordPress的用戶來講,Pantheon有一個很是好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。
隊列
Reids在內存存儲引擎領域的一大優勢是提供 list 和 set 操做,這使得Redis能做爲一個很好的消息隊列平臺來使用。Redis做爲隊列使用的操做,就相似於本地程序語言(如Python)對 list 的 push/pop 操做。
生產者消費者模式簡單實現過程:
一、插入數據:
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lpush list 4
(integer) 4
複製代碼
二、顯示數據:
複製代碼
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
複製代碼
三、取出數據:
複製代碼
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lpop list
"3"
127.0.0.1:6379> lpop list
"2"
127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> lpop list
(nil)
複製代碼
排行榜/計數器
Redis在內存中對數字進行遞增或遞減的操做實現的很是好。集合(Set)和有序集合(Sorted Set)也使得咱們在執行這些操做的時候變的很是簡單,Redis只是正好提供了這兩種數據結構。
排行榜簡單實現過程:
一、設置了4個玩家的分數,若是玩家分數已經存在,則會覆蓋以前的分數。
複製代碼
127.0.0.1:6379> zadd ph 90 user
(integer) 1
127.0.0.1:6379> zadd ph 80 user1
(integer) 1
127.0.0.1:6379> zadd ph 70 user2
(integer) 1
127.0.0.1:6379> zadd ph 60 user3
(integer) 1
複製代碼
二、zscore——查看user2玩家分數
複製代碼
127.0.0.1:6379> zscore ph user2
"70"
複製代碼
三、zrevrange——按名次查看排行榜
複製代碼
127.0.0.1:6379> zrevrange ph 0 -1 withscores
1) "user"
2) "90"
3) "user1"
4) "80"
5) "user2"
6) "70"
7) "user3"
8) "60"
複製代碼
四、查詢前三名玩家分數。
複製代碼
127.0.0.1:6379> zrevrange ph 0 2 withscores
1) "user"
2) "90"
3) "user1"
4) "80"
5) "user2"
6) "70"
複製代碼
五、zrevrank——查看玩家的排名,zrevrank是以分數由高到低的排序返回玩家排名(實際返回的是以0開始的索引),對應的zrank則是以分數由低到高的排序返回排名。
複製代碼
127.0.0.1:6379> zrevrank ph user2
(integer) 2
127.0.0.1:6379> zrank ph user2
(integer) 1
複製代碼
六、zrem——移除某個玩家
複製代碼
127.0.0.1:6379> zrem ph user1
(integer) 1
127.0.0.1:6379> zrevrange ph 0 -1 withscores
1) "user"
2) "90"
3) "user2"
4) "70"
5) "user3"
6) "60"
複製代碼
七、del——刪除排行榜
複製代碼
127.0.0.1:6379> del ph
(integer) 1
127.0.0.1:6379> get ph
(nil)
127.0.0.1:6379> zrevrange ph 0 -1 withscores
(empty list or set)
複製代碼
發佈/訂閱
最後(但確定不是最不重要的)是Redis的發佈/訂閱功能。發佈/訂閱的使用場景確實很是多。我已看見人們在社交網絡鏈接中使用,還可做爲基於發佈/訂閱的腳本觸發器,甚至用Redis的發佈/訂閱功能來創建聊天系統。
"發佈/訂閱"模式包含兩種角色,分別是發佈者和訂閱者。訂閱者能夠訂閱一個或者多個頻道(channel),而發佈者能夠向指定的頻道(channel)發送消息,全部訂閱此頻道的訂閱者都會收到此消息。
發佈/訂閱模式簡單實現過程:
一、訂閱頻道
複製代碼
127.0.0.1:6379> subscribe channel:1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel:1"
3) (integer) 1
複製代碼
執行上面命令客戶端會進入訂閱狀態,處於此狀態下客戶端不能使用除subscribe、unsubscribe、psubscribe和punsubscribe這四個屬於"發佈/訂閱"以外的命令,不然會報錯。
進入訂閱狀態後客戶端可能收到3種類型的回覆。每種類型的回覆都包含3個值,第一個值是消息的類型,根據消類型的不一樣,第二個和第三個參數的含義可能不一樣。
消息類型的取值多是如下3個:
(1)subscribe。表示訂閱成功的反饋信息。第二個值是訂閱成功的頻道名稱,第三個是當前客戶端訂閱的頻道數量。
(2)message。表示接收到的消息,第二個值表示產生消息的頻道名稱,第三個值是消息的內容。
(3)unsubscribe。表示成功取消訂閱某個頻道。第二個值是對應的頻道名稱,第三個值是當前客戶端訂閱的頻道數量,當此值爲0時客戶端會退出訂閱狀態,以後就能夠執行其餘非"發佈/訂閱"模式的命令了。
二、發佈消息
複製代碼
127.0.0.1:6379> publish channel:1 hi
(integer) 1
127.0.0.1:6379> publish channel:1 nihao
(integer) 1
複製代碼
返回值表示訂閱此頻道的數量
三、訂閱者接收消息
複製代碼
127.0.0.1:6379> subscribe channel:1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel:1"
3) (integer) 1
1) "message"
2) "channel:1"
3) "hi"
1) "message"
2) "channel:1"
3) "nihao"
複製代碼