轉載地址:http://bradyzhu.iteye.com/blog/2270698redis
1,Redis
- 豐富的數據結構(Data Structures)
-
- 字符串(String)
-
- Redis字符串能包含任意類型的數據
- 一個字符串類型的值最多能存儲512M字節的內容
- 利用INCR命令簇(INCR, DECR, INCRBY)來把字符串看成原子計數器使用
- 使用APPEND命令在字符串後添加內容
- 列表(List)
-
- Redis列表是簡單的字符串列表,按照插入順序排序
- 你能夠添加一個元素到列表的頭部(左邊:LPUSH)或者尾部(右邊:RPUSH)
- 一個列表最多能夠包含(2^32-1)個元素(4294967295,每一個表超過40億個元素)
- 在社交網絡中創建一個時間線模型,使用LPUSH去添加新的元素到用戶時間線中,使用LRANGE去檢索一些最近插入的條目
- 你能夠同時使用LPUSH和LTRIM去建立一個永遠不會超過指定元素數目的列表並同時記住最後的N個元素
- 列表能夠用來看成消息傳遞的基元(primitive),例如,衆所周知的用來建立後臺任務的Resque Ruby庫
- 集合(Set)
-
- Redis集合是一個無序的,不容許相同成員存在的字符串合集(Uniq操做,獲取某段時間全部數據排重值)
- 支持一些服務端的命令從現有的集合出發去進行集合運算,如合併(並集:union),求交(交集:intersection),差集, 找出不一樣元素的操做(共同好友、二度好友)
- 用集合跟蹤一個獨特的事。想要知道全部訪問某個博客文章的獨立IP?只要每次都用SADD來處理一個頁面訪問。那麼你能夠確定重複的IP是不會插入的( 利用惟一性,能夠統計訪問網站的全部獨立IP)
- Redis集合能很好的表示關係。你能夠建立一個tagging系統,而後用集合來表明單個tag。接下來你能夠用SADD命令把全部擁有tag的對象的全部ID添加進集合,這樣來表示這個特定的tag。若是你想要同時有3個不一樣tag的全部對象的全部ID,那麼你須要使用SINTER
- 使用SPOP或者SRANDMEMBER命令隨機地獲取元素
- 哈希(Hashes)
-
- Redis Hashes是字符串字段和字符串值之間的映射
- 儘管Hashes主要用來表示對象,但它們也可以存儲許多元素
- 有序集合(Sorted Sets)
-
- Redis有序集合和Redis集合相似,是不包含相同字符串的合集
- 每一個有序集合的成員都關聯着一個評分,這個評分用於把有序集合中的成員按最低分到最高分排列(排行榜應用,取TOP N操做)
- 使用有序集合,你能夠很是快地(O(log(N)))完成添加,刪除和更新元素的操做
- 元素是在插入時就排好序的,因此很快地經過評分(score)或者位次(position)得到一個範圍的元素(須要精準設定過時時間的應用)
- 輕易地訪問任何你須要的東西: 有序的元素,快速的存在性測試,快速訪問集合中間元素
- 在一個巨型在線遊戲中創建一個排行榜,每當有新的記錄產生時,使用ZADD 來更新它。你能夠用ZRANGE輕鬆地獲取排名靠前的用戶, 你也能夠提供一個用戶名,而後用ZRANK獲取他在排行榜中的名次。 同時使用ZRANK和ZRANGE你能夠得到與指定用戶有相同分數的用戶名單。 全部這些操做都很是迅速
- 有序集合一般用來索引存儲在Redis中的數據。 例如:若是你有不少的hash來表示用戶,那麼你可使用一個有序集合,這個集合的年齡字段用來看成評分,用戶ID看成值。用ZRANGEBYSCORE能夠簡單快速地檢索到給定年齡段的全部用戶
- 複製(Replication, Redis複製很簡單易用,它經過配置容許slave Redis Servers或者Master Servers的複製品)
-
- 一個Master能夠有多個Slaves
- Slaves能經過接口其餘slave的連接,除了能夠接受同一個master下面slaves的連接之外,還能夠接受同一個結構圖中的其餘slaves的連接
- redis複製是在master段是非阻塞的,這就意味着master在同一個或多個slave端執行同步的時候還能夠接受查詢
- 複製在slave端也是非阻塞的,假設你在redis.conf中配置redis這個功能,當slave在執行的新的同步時,它仍能夠用舊的數據信息來提供查詢,不然,你能夠配置當redis slaves去master失去聯繫是,slave會給發送一個客戶端錯誤
- 爲了有多個slaves能夠作只讀查詢,複製能夠重複2次,甚至屢次,具備可擴展性(例如:slaves對話與重複的排序操做,有多份數據冗餘就相對簡單了)
- 他能夠利用複製去避免在master端保存數據,只要對master端redis.conf進行配置,就能夠避免保存(全部的保存操做),而後經過slave的連接,來實時的保存在slave端
- LRU過時處理(Eviction)
-
- EVAL 和 EVALSHA 命令是從 Redis 2.6.0 版本開始的,使用內置的 Lua 解釋器,能夠對 Lua 腳本進行求值
- Redis 使用單個 Lua 解釋器去運行全部腳本,而且, Redis 也保證腳本會以原子性(atomic)的方式執行: 當某個腳本正在運行的時候,不會有其餘腳本或 Redis 命令被執行。 這和使用 MULTI / EXEC包圍的事務很相似。 在其餘別的客戶端看來,腳本的效果(effect)要麼是不可見的(not visible),要麼就是已完成的(already completed)
- LRU過時處理(Eviction)
-
- Redis容許爲每個key設置不一樣的過時時間,當它們到期時將自動從服務器上刪除(EXPIRE)
- 事務
-
- MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事務的基礎
- 事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷
- 事務中的命令要麼所有被執行,要麼所有都不執行,EXEC 命令負責觸發並執行事務中的全部命令
- Redis 的 Transactions 提供的並不是嚴格的 ACID 的事務
- Transactions 仍是提供了基本的命令打包執行的功能: 能夠保證一連串的命令是順序在一塊兒執行的,中間有會有其它客戶端命令插進來執行
- Redis 還提供了一個 Watch 功能,你能夠對一個 key 進行 Watch,而後再執行 Transactions,在這過程當中,若是這個 Watched 的值進行了修改,那麼這個 Transactions 會發現並拒絕執行
- 數據持久化
-
- RDB
-
- 特色
-
- RDB持久化方式可以在指定的時間間隔能對你的數據進行快照存儲
- 優勢
-
- RDB是一個很是緊湊的文件,它保存了某個時間點得數據集,很是適用於數據集的備份
- RDB是一個緊湊的單一文件, 很是適用於災難恢復
- RDB在保存RDB文件時父進程惟一須要作的就是fork出一個子進程,接下來的工做所有由子進程來作,父進程不須要再作其餘IO操做,因此RDB持久化方式能夠最大化redis的性能
- 與AOF相比,在恢復大的數據集的時候,RDB方式會更快一些
- 缺點
-
- 若是你但願在redis意外中止工做(例如電源中斷)的狀況下丟失的數據最少的話,那麼RDB不適合,Redis要完整的保存整個數據集是一個比較繁重的工做
- RDB 須要常常fork子進程來保存數據集到硬盤上,當數據集比較大的時候,fork的過程是很是耗時的,可能會致使Redis在一些毫秒級內不能響應客戶端的請求.若是數據集巨大而且CPU性能不是很好的狀況下,這種狀況會持續1秒,AOF也須要fork,可是你能夠調節重寫日誌文件的頻率來提升數據集的耐久度
- AOF
-
- 特色
-
- AOF持久化方式記錄每次對服務器寫的操做
- redis重啓的時候會優先載入AOF文件來恢復原始的數據,由於在一般狀況下AOF文件保存的數據集要比RDB文件保存的數據集要完整
- 優勢
-
- 使用AOF 會讓你的Redis更加耐久: 你可使用不一樣的fsync策略:無fsync,每秒fsync,每次寫的時候fsync
- AOF文件是一個只進行追加的日誌文件,因此不須要寫入seek
- Redis 能夠在 AOF 文件體積變得過大時,自動地在後臺對 AOF 進行重寫
- AOF 文件有序地保存了對數據庫執行的全部寫入操做, 這些寫入操做以 Redis 協議的格式保存, 所以 AOF 文件的內容很是容易被人讀懂, 對文件進行分析(parse)也很輕鬆。 導出(export) AOF 文件也很是簡單
- 缺點
-
- 對於相同的數據集來講,AOF 文件的體積一般要大於 RDB 文件的體積
- 根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB
- 選擇
-
- 分佈式
-
- Redis Cluster (Redis 3版本)
- Keepalived
-
- 當Master掛了後,VIP漂移到Slave;Slave 上keepalived 通知redis 執行:slaveof no one ,開始提供業務
- 當Master起來後,VIP 地址不變,Master的keepalived 通知redis 執行slaveof slave IP host ,開始做爲從同步數據
- 依次類推
- Twemproxy
-
- 快、輕量級、減小後端Cache Server鏈接數、易配置、支持ketama、modula、random、經常使用hash 分片算法
- 對於客戶端而言,redis集羣是透明的,客戶端簡單,遍於動態擴容
- Proxy爲單點、處理一致性hash時,集羣節點可用性檢測不存在腦裂問題
- 高性能,CPU密集型,而redis節點集羣多CPU資源冗餘,可部署在redis節點集羣上,不須要額外設備
- 高可用(HA)
-
- Redis Sentinel(redis自帶的集羣管理工具 )
-
- 監控(Monitoring): Redis Sentinel實時監控主服務器和從服務器運行狀態
- 提醒(Notification):當被監控的某個 Redis 服務器出現問題時, Redis Sentinel 能夠向系統管理員發送通知, 也能夠經過 API 向其餘程序發送通知
- 自動故障轉移(Automatic failover): 當一個主服務器不能正常工做時,Redis Sentinel 能夠將一個從服務器升級爲主服務器, 並對其餘從服務器進行配置,讓它們使用新的主服務器。當應用程序鏈接到 Redis 服務器時, Redis Sentinel會告之新的主服務器地址和端口
- 單M-S結構
-
- 單M-S結構特色是在Master服務器中配置Master Redis(Redis-1M)和Master Sentinel(Sentinel-1M)
- Slave服務器中配置Slave Redis(Redis-1S)和Slave Sentinel(Sentinel-1S)
- 其中 Master Redis能夠提供讀寫服務,可是Slave Redis只能提供只讀服務。所以,在業務壓力比較大的狀況下,能夠選擇將只讀業務放在Slave Redis中進行
- 雙M-S結構
-
- 雙M-S結構的特色是在每臺服務器上配置一個Master Redis,同時部署一個Slave Redis。由兩個Redis Sentinel同時對4個Redis進行監控。兩個Master Redis能夠同時對應用程序提供讀寫服務,即使其中一個服務器出現故障,另外一個服務器也能夠同時運行兩個Master Redis提供讀寫服務
- 缺點是兩個Master redis之間沒法實現數據共享,不適合存在大量用戶數據關聯的應用使用
- 單M-S結構和雙M-S結構比較
-
- 單M-S結構適用於不一樣用戶數據存在關聯,但應用能夠實現讀寫分離的業務模式。Master主要提供寫操做,Slave主要提供讀操做,充分利用硬件資源
- 雙(多)M-S結構適用於用戶間不存在或者存在較少的數據關聯的業務模式,讀寫效率是單M-S的兩(多)倍,但要求故障時單臺服務器可以承擔兩個Mater Redis的資源需求
- 發佈/訂閱(Pub/Sub)
- 監控:Redis-Monitor
-
- 歷史redis運行查詢:CPU、內存、命中率、請求量、主從切換等
- 實時監控曲線
2,數據類型Redis使用場景
- String
-
- List
-
- 取最新N個數據的操做
- 消息隊列
- 刪除與過濾
- 實時分析正在發生的狀況,用於數據統計與防止垃圾郵件(結合Set)
- Set
-
- Uniqe操做,獲取某段時間全部數據排重值
- 實時系統,反垃圾系統
- 共同好友、二度好友
- 利用惟一性,能夠統計訪問網站的全部獨立 IP
- 好友推薦的時候,根據 tag 求交集,大於某個 threshold 就能夠推薦
- Hashes
-
- Sorted Set
-
- 排行榜應用,取TOP N操做
- 須要精準設定過時時間的應用(時間戳做爲Score)
- 帶有權重的元素,好比一個遊戲的用戶得分排行榜
- 過時項目處理,按照時間排序
3,Redis解決秒殺/搶紅包等高併發事務活動
- 秒殺開始前30分鐘把秒殺庫存從數據庫同步到Redis Sorted Set
- 用戶秒殺庫存放入秒殺限制數長度的Sorted Set
- 秒殺到指定秒殺數後,Sorted Set不在接受秒殺請求,並顯示返回標識
- 秒殺活動徹底結束後,同步Redis數據到數據庫,秒殺正式結束