一、Redis 簡介
? ? ? ? ? ? Redis,Remote Dictionary Server,遠程字典服務,由意大利人Salvatore Sanfilippo(又名Antirez)開發,是一個使用ANSI C 語言編寫、支持網絡、 可基于內存亦可持久化的日志型、NoSQL 開源內存數據庫,其提供多種語言的API。從2010 年3 月15 日起,Redis 的開發工作由VMware 主持。從 2013 年5 月開始,Redis 的開發由Pivotal 贊助。
Redis 之所以稱之為字典服務,是因為Redis 是一個key-value 存儲系統。支持存儲的value 類型很多,包括String(字符串)、List(鏈表)、Set(集合)、Zset(sorted set --有序集合)和Hash(哈 希類型)等。
Redis 的國際知名用戶有,Twitter、GitHub、Facebook 等,國內知名用戶有,阿里巴巴、 騰訊、百度、搜狐、優酷、美團、小米等。熟練使用和運維Redis 已經成為開發運維人員的 一個必備技能。
1.NoSQL
(1)鍵值存儲數據庫
(2)列存儲數據庫
(3)文檔型數據庫
(4)圖形(Graph)數據庫
二、Redis 的用途
DBMS 是?Database Management System(數據庫管理系統)?的縮寫,是一種專門用于?創建、管理和維護數據庫?的軟件系統。它是數據持久層(如關系型數據庫、非關系型數據庫等)的核心組件
? ? ? ?根據 Redis 緩存的數據與 DBMS 中數據的同步性劃分,緩存一般可劃分為兩類:實時同步緩存,與階段性同步緩存。
? ? ? ?實時同步緩存是指,DBMS 中數據更新后,Redis 緩存中的存放的相關數據會被立即清 除,以促使再有對該數據的訪問請求到來時,必須先從 DBMS 中查詢獲取到最新數據,然后 再寫入到 Redis。
? ? ? 階段性同步緩存是指,Redis 緩存中的數據允許在一段時間內與 DBMS 中的數據不完全 一致。而這個時間段就是這個緩存數據的過期時間。
實時同步緩存,與階段性同步緩存——補充理解《補充》
三、Redis 特性
能夠做緩存的技術、中間件很多,例如,MyBatis 自帶的二級緩存、Memched 等。只所 以在生產中做緩存的產品幾乎無一例外的會選擇 Redis,是因為它有很多其它產品所不具備 的特性。
??? 性能極高:Redis 讀的速度可以達到 11w 次/s,寫的速度可以達到 8w 次/s。只所以具有 這么高的性能,因為以下幾點原因:
(1)Redis 的所有操作都是在內存中發生的。
(2) Redis 是用 C 語言開發的。
(3)Redis 源碼非常精細(集性能與優雅于一身)。
? 簡單穩定:Redis 源碼很少。早期版本只有 2w 行左右。從 3.0 版本開始,增加了集群功 能,代碼變為了 5w 行左右。
? 持久化:Redis 內存中的數據可以進行持久化,其有兩種方式:RDB 與 AOF。
? 高可用集群:Redis 提供了高可用的主從集群功能,可以確保系統的安全性。
? 豐富的數據類型:Redis 是一個 key-value 存儲系統。支持存儲的 value 類型很多,包括 String(字符串)、List(鏈表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希類型) 等,還有 BitMap、HyperLogLog、Geospatial 類型。
? BitMap:一般用于大數據量的二值性統計。
? HyperLogLog:其是 Hyperlog Log,用于對數據量超級龐大的日志做去重統計。 ? Geospatial:地理空間,其主要用于地理位置相關的計算。
? 強大的功能:Redis 提供了數據過期功能、發布/訂閱功能、簡單事務功能,還支持 Lua 腳本擴展功能。
? 客戶端語言廣泛:Redis提供了簡單的 TCP 通信協議,編程語言可以方便地的接入 Redis。 所以,有很多的開源社區、大公司等開發出了很多語言的 Redis 客戶端。
? 支持 ACL 權限控制:之前的權限控制非常笨拙。從 Redis6 開始引入了 ACL 模塊,可以 為不同用戶定制不同的用戶權限。
ACL,Access Control List,訪問控制列表,是一種細粒度的權限管理策略,可以針對任意 用戶與組進行權限控制。目前大多數 Unix 系統與 Linux 2.6 版本已經支持 ACL 了。 Zookeeper 早已支持 ACL 了。
Unix 與 Linux 系統默認使用是 UGO(User、Group、Other)權限控制策略,其是一種粗 粒度的權限管理策略。
? 支持多線程 IO 模型:Redis 之前版本采用的是單線程模型,從 6.0 版本開始支持了多線 程模型。
四、Redis 的 IO 模型
Redis 客戶端提交的各種請求是如何最終被 Redis 處理的?
Redis 處理客戶端請求所采用 的處理架構,稱為 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的
1.單線程模型
對于 Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是純粹的單線程模型。即所有客戶 端的請求全部由一個線程處理。
? ? ? ?每個客戶端若要向 Redis 提交請求,都需要與 Redis 建立一個 socket 連接,并向事件分 發器注冊一個事件。一旦該事件發生就表明該連接已經就緒。而一旦連接就緒,事件分發器 就會感知到,然后獲取客戶端通過該連接發送的請求,并將由該事件分發器所綁定的這個唯 一的線程來處理。如果該線程還在處理多個任務,則將該任務寫入到任務隊列等待線程處理。
? ? ? ?之所以稱為事件分發器,是因為它會根據不同的就緒事件,將任務交由不同的事件處理 器去處理。
2.混合線程模型
從 Redis 4.0 版本開始,Redis 中就開始加入了多線程元素。處理客戶端請求的仍是單線 程模型,但對于一些比較耗時但又不影響對客戶端的響應的操作,就由后臺其它線程來處理。 例如,持久化、對 AOF 的 rewrite、對失效連接的清理等。
3.多線程模型
多線程 IO 模型中的“多線程”僅用于接受、解析客戶端的請求,然后將解析出的請求 寫入到任務隊列。而對具體任務(命令)的處理,仍是由主線程處理。這樣做使得用戶無需 考慮線程安全問題,無需考慮事務控制,無需考慮像 LPUSH/LPOP 等命令的執行順序問題。
4.優缺點總結
⑴.單線程模型
優點:可維護性高,性能高。不存在并發讀寫情況,所以也就不存在執行順序的不確定 性,不存在線程切換開銷,不存在死鎖問題,不存在為了數據安全而進行的加鎖/解鎖 開銷。
缺點:性能會受到影響,且由于單線程只能使用一個處理器,所以會形成處理器浪費。
⑵.多線程模型
優點:其結合了多線程與單線程的優點,避開了它們的所有不足
缺點:該模型沒有顯示不足。如果非要找其不足的話就是,其并非是一個真正意義上的 “多線程”,因為真正處理“任務”的線程仍是單線程。所以,其對性能也是有些影響的。