1、Redis簡介git
1.什麼是Redisgithub
Redis 是一個開源的使用ANSI C 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的API。從2010 年3 月15 日起,Redis 的開發工做由VMware 主持。redis
Redis 是一個Key-Value 存儲系統。和Memcached 相似,它支持存儲的value 類型相對更多, 包括string(字符串)、hash(散列)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型支持push/pop、add/remove 及取交集並集和差集和更豐富的操做,並且這些操做都是原子性的。在此基礎上,Redis 支持各類不一樣方式的排序。與memcached 同樣,爲了保證效率,數據都是緩存在內存中。區別的是Redis 會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。數據庫
2.Redis思想緩存
Redis 的做者antirez(Salvatore Sanfilippo)曾經發表了一篇名爲Redis 宣言(Redis Manifesto) 的文章,文中列舉了Redis 的七個原則,以向你們闡明Redis的思想。服務器
一、Redis 是一個操做數據結構的語言工具,它提供基於TCP 的協議以操做豐富的數據結構。在Redis 中,數據結構這個詞的意義不只表示在某種數據結構上的操做,更包括告終構自己及這些操做的時間空間複雜度。網絡
二、Redis 定位於一個內存數據庫,正是因爲內存的快速訪問特性,才使得Redis 可以有如此高的性能,才使得Redis 可以輕鬆處理大量複雜的數據結構,Redis 會嘗試其它的存儲方面的選擇,可是永遠不會改變它是一個內存數據庫的角色。數據結構
三、Redis 使用基礎的API 操做基礎的數據結構,Redis 的API 與數據結構同樣,都是一些最基礎的元素,你幾乎能夠將任何信息交互使用此API 格式表示。做者調侃說,若是有其它非人類的智能生物存在,他們也能理解Redis 的API。由於它是如此的基礎。架構
四、Redis 有着詩通常優美的代碼,常常有一些不太瞭解Redis 有的人會建議Redis 採用一些其它人的代碼,以實現一些Redis 未實現的功能,但這對咱們來講就像是非要給《紅樓夢》接上後四十回同樣。分佈式
五、Redis 始終避免複雜化,咱們認爲設計一個系統的本質,就是與複雜化做戰。咱們不會爲了一個小功能而往源碼裏添加上千行代碼,解決複雜問題的方法就是讓複雜問題永遠不要提複雜的問題。
六、Redis 支持兩個層面的API,第一個層面包含部分操做API,但它支持用於分佈式環境下的Redis。第二個層面的API 支持更復雜的multi-key 操做。它們各有所長,可是咱們不會推出二者都支持的API,但咱們但願可以提供實例間數據遷移的命令,並執行multi-key 操做。
七、咱們以優化代碼爲樂,咱們相信編碼是一件辛苦的工做,惟一對得起這辛苦的就是去享受它。若是咱們在編碼中失去了樂趣,那最好的解決辦法就是停下來。咱們決不會選擇讓Redis 很差玩的開發模式。
Redis 的做者antirez 曾笑稱Redis 爲一個數據結構服務器(data structures server),其實能夠認爲這是一個很是準確的表述,Redis 的全部功能就是將數據以其固有的幾種結構來保存,並提供給用戶操做這幾種結構的接口。本文將介紹Redis 支持的各類數據類型及其操做接口。
3.Key-Value 存儲系統簡介
Key-Value Store 是當下比較流行的話題,尤爲在構建諸如搜索引擎、IM、P2P、遊戲服務器、SNS 等大型互聯網應用以及提供雲計算服務的時候,怎樣保證系統在海量數據環境下的高性能、高可靠性、高擴展性、高可用性、低成本成爲全部系統架構們挖苦心思考慮的重點,而怎樣解決數據庫服務器的性能瓶頸是最大的挑戰。
按照分佈式領域的CAP 理論(Consistency、 Availability、Tolerance to network Partitions 這三部分在任何系統架構實現時只可能同時知足其中二點,無法三者兼顧)來衡量,傳統的關係數據庫的ACID 只知足了Consistency、Availability,所以在Partition tolerance 上就很難作得好。另外傳統的關係數據庫處理海量數據、分佈式架構時候在Performance、Scalability、 Availability 等方面也存在很大的侷限性。
而Key-Value Store 更加註重對海量數據存取的性能、分佈式、擴展性支持上,並不須要傳統關係數據庫的一些特徵,例如:Schema、事務、完整SQL 查詢支持等等,所以在分佈式環境下的性能相對於傳統的關係數據庫有較大的提高。
圖1.一些數據庫和緩存服務器的特性與功能
4.Redis 實際應用案例
目前全球最大的Redis 用戶是新浪微博,在新浪有200 多臺物理機,400 多個端口正在運行着Redis, 有+4G 的數據跑在Redis 上來爲微博用戶提供服務。
圖2.新浪微博Redis應用
在新浪微博Redis 的部署場景不少,大概分爲以下的2 種:
第一種是應用程序直接訪問Redis 數據庫
圖3. 應用程序直接訪問Redis 數據庫
第二種是應用程序直接訪問Redis,只有當Redis 訪問失敗時才訪問MySQL
圖4. 應用程序訪問Redis和MySQL數據庫
2、初識Redis
1.數據類型
做爲Key-value 型數據庫,Redis 也提供了鍵(Key)和鍵值(Value)的映射關係。可是,除了常規的數值或字符串,Redis 的鍵值還能夠是如下形式之一:
-Lists (列表)
-Hash (散列)
-Sets (集合)
-Sorted sets (有序集合)
-Hashes (哈希表)
圖5.Redis提供的五種結構
鍵值的數據類型決定了該鍵值支持的操做。Redis 支持諸如列表、集合或有序集合的交集、並集、查集等高級原子操做;同時,若是鍵值的類型是普通數字,Redis 則提供自增等原子操做。
2.持久化
一般,Redis 將數據存儲於內存中,或被配置爲使用虛擬內存。經過兩種方式能夠實現數據持久化:使用截圖的方式,將內存中的數據不斷寫入磁盤;或使用相似MySQ-的日誌方式, 記錄每次更新的日誌。前者性能較高,可是可能會引發必定程度的數據丟失;後者相反。
3.主從同步
Redis 支持將數據同步到多臺從庫上,這種特性對提升讀取性能很是有益。
4.性能
相比須要依賴磁盤記錄每一個更新的數據庫,基於內存的特性無疑給Redis 帶來了很是優秀的性能。讀寫操做之間有顯著的性能差別。
5.提供API的語言
-C
-C++
-C#
-Clojure
-Common Lisp
-Erlang
-Haskell
-Java
-Javascript
-Lua
-Objective-C
-Perl
-PHP
-Python
-Ruby
-Scala
-Go
-Tcl
6.適用場合
毫無疑問,Redis 開創了一種新的數據存儲思路,使用Redis,咱們不用在面對功能單調的數據庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用Redis 靈活多變的數據結構和數據操做,爲不一樣的大象構建不一樣的冰箱。但願你喜歡這個比喻。
下面是Redis 適用的一些場景:
1、取最新N 個數據的操做
好比典型的取你網站的最新文章,經過下面方式,咱們能夠將最新的5000 條評論的ID 放在Redis 的List 集合中,並將超出集合部分從數據庫獲取。
使用LPUSH latest.comments<ID>命令,向list 集合中插入數據
插入完成後再用LTRIM latest.comments 0 5000 命令使其永遠只保存最近5000 個ID。
若是你還有不一樣的篩選維度,好比某個分類的最新N 條,那麼你能夠再建一個按此分類的List,只存ID 的話,Redis 是很是高效的。
2、排行榜應用,取TOP N 操做
這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重, 好比按頂的次數排序,這時候就須要咱們的sorted set 出馬了,將你要排序的值設置成sorted set 的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD 命令便可。
3、須要精準設定過時時間的應用
好比你能夠把上面說到的sorted set 的score 值設置成過時時間的時間戳,那麼就能夠簡單地經過過時時間排序,定時清除過時數據了,不只是清除Redis 中的過時數據,你徹底能夠把Redis 裏這個過時時間當成是對數據庫中數據的索引,用Redis 來找出哪些數據須要過時刪除,而後再精準地從數據庫中刪除相應的記錄。
4、計數器應用
Redis 的命令都是原子性的,你能夠輕鬆地利用INCR,DECR 命令來構建計數器系統。
5、Uniq 操做,獲取某段時間全部數據排重值
這個使用Redis 的set 數據結構最合適了,只須要不斷地將數據往set 中扔就好了,set 意爲集合,集合中的元素是惟一的,因此會自動排重。
6、實時系統,反垃圾系統
經過上面說到的set 功能,你能夠知道一個終端用戶是否進行了某個操做,能夠找到其操做的集合並進行分析統計對比等。沒有作不到,只有想不到。
7、Pub/Sub 構建實時消息系統
Redis 的Pub/Sub 系統能夠構建實時的消息系統,好比不少用Pub/Sub 構建的實時聊天系統的例子。
8、構建隊列系統
使用list 能夠構建隊列系統,使用sorted set 甚至能夠構建有優先級的隊列系統。
9、緩存
這個沒必要說了,性能優於Memcached,數據結構更多樣化
3、推薦一些Redis學習資源
1.網站
http://redis.io Redis官網
https://github.com/antirez/redis Redis源代碼
https://github.com/huangz1990/redis-3.0-annotated 註釋版的Redis 3.0源碼
http://doc.redisfans.com Redis命令參考中文翻譯版
2.書籍
《redis入門指南(第2版)》 一本適合Redis入門的書籍
《Redis 設計與實現》 剖析了Redis的源碼
《Redis實戰》 Redis在實戰中的應用
上面這三本書分別從入門、源碼、 實戰三個維度講解了Redis,這也是我認爲Redis很是值得學習的三個方面。redis的源碼只有三萬多行,很值得研究學習下,同時也方便本身團隊在使用過程當中去根據業務需求量身打造Redis。
參考資料:部分文字內容或插圖來自於以上書籍或網絡蒐集