在Web應用發展的初期,那時關係型數據庫受到了較爲普遍的關注和應用,緣由是由於那時候Web站點基本上訪問和併發不高、交互也較少。而在後來,隨着訪問量的提高,使用關係型數據庫的Web站點多多少少都開始在性能上出現了一些瓶頸,而瓶頸的源頭通常是在磁盤的I/O上。而隨着互聯網技術的進一步發展,各類類型的應用層出不窮,這致使在當今雲計算、大數據盛行的時代,對性能有了更多的需求,主要體如今如下四個方面:node
爲了克服這一問題,NoSQL應運而生,它同時具有了高性能、可擴展性強、高可用等優勢,受到普遍開發人員和倉庫管理人員的青睞。git
Redis是如今最受歡迎的NoSQL數據庫之一,Redis是一個使用ANSI C編寫的開源、包含多種數據結構、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫,其具有以下特性:github
相比於其餘數據庫類型,Redis具有的特色是:數據庫
哪些大廠在使用Redis?json
Redis 的應用場景包括:緩存系統(「熱點」數據:高頻讀、低頻寫)、計數器、消息隊列系統、排行榜、社交網絡和實時系統。後端
Redis提供的數據類型主要分爲5種自有類型和一種自定義類型,這5種自有類型包括:String類型、哈希類型、列表類型、集合類型和順序集合類型。數組
它是一個二進制安全的字符串,意味着它不只可以存儲字符串、還能存儲圖片、視頻等多種類型, 最大長度支持512M。緩存
對每種數據類型,Redis都提供了豐富的操做命令,如:安全
該類型是由field和關聯的value組成的map。其中,field和value都是字符串類型的。服務器
Hash的操做命令以下:
該類型是一個插入順序排序的字符串元素集合, 基於雙鏈表實現。
List的操做命令以下:
Set類型是一種無順序集合, 它和List類型最大的區別是:集合中的元素沒有順序, 且元素是惟一的。
Set類型的底層是經過哈希表實現的,其操做命令爲:
Set類型主要應用於:在某些場景,如社交場景中,經過交集、並集和差集運算,經過Set類型能夠很是方便地查找共同好友、共同關注和共同偏好等社交關係。
ZSet是一種有序集合類型,每一個元素都會關聯一個double類型的分數權值,經過這個權值來爲集合中的成員進行從小到大的排序。與Set類型同樣,其底層也是經過哈希表實現的。
ZSet命令:
Redis的數據結構以下圖所示:
關於上表中的部分釋義:
以下是定義一個Struct數據結構的例子:
基於C語言中傳統字符串的缺陷,Redis本身構建了一種名爲簡單動態字符串的抽象類型,簡稱SDS,其結構以下:
SDS幾乎貫穿了Redis的全部數據結構,應用十分普遍。
和C字符串相比,SDS的特色以下:
1. 常數複雜度獲取字符串長度
Redis中利用SDS字符串的len屬性能夠直接獲取到所保存的字符串的長 度,直接將獲取字符串長度所需的複雜度從C字符串的O(N)下降到了O(1)。
2. 減小修改字符串時致使的內存從新分配次數
經過C字符串的特性,咱們知道對於一個包含了N個字符的C字符串來講,其底層實現老是N+1個字符長的數組(額外一個空字符結尾)
那麼若是這個時候須要對字符串進行修改,程序就須要提早對這個C字符串數組進行一次內存重分配(多是擴展或者釋放)
而內存重分配就意味着是一個耗時的操做。
Redis巧妙的使用了SDS避免了C字符串的缺陷。在SDS中,buf數組的長度不必定就是字符串的字符數量加一,buf數組裏面能夠包含未使用的字節,而這些未使用的字節由free屬性記錄。
與此同時,SDS採用了空間預分配的策略,避免C字符串每一次修改時都須要進行內存重分配的耗時操做,將內存重分配從原來的每修改N次就分配N次——>下降到了修改N次最多分配N次。
以下是Redis對SDS的簡單定義:
以上就是Redis的基本概念,下面咱們將介紹在開發過程當中可能會踩到的「坑」。
概念:在Redis獲取某一key時, 因爲key不存在, 而必須向DB發起一次請求的行爲, 稱爲「Redis擊穿」。
引起擊穿的緣由:
合理的規避方案:
概念:Redis緩存層因爲某種緣由宕機後,全部的請求會涌向存儲層,短期內的高併發請求可能會致使存儲層掛機,稱之爲「Redis雪崩」。
合理的規避方案:
爲此,我很高興的爲你們介紹,葡萄城架構師Jim將在2019-11-27 14:00 爲你們帶來一場公開課,其中 Jim除了爲你們講解Redis的基礎,同時也會實際演示他所在的項目組使用Redis時碰到的問題以及解決方案,對於剛接觸Redis的同窗來講,更具參考意義和學習價值,歡迎你們屆時參加,公開課地址:https://live.vhall.com/661463644。
- token緩存, 用於令牌驗證
- IP白名單
碰到的問題
- 鏈接池 「Broken connection」 問題
- JS的Promise引出的Redis重置問題
下面咱們來簡單瞭解一下Redis的進階知識。
Redis客戶端通信協議:RESP(Redis Serialization Protocol),其特色是:
Redis集羣內部通信協議:RECP(Redis Cluster Protocol ) ,其特色是:
Redis協議支持的數據類型:
簡單字符(首字節: 「+」)
「+OK\r\n」
錯誤(首字節: 「-」)
「-error msg\r\n」
數字(首字節: 「:」)
「:123\r\n」
批量字符(首字節: 「$」)
「&hello\r\nWhoa re you\r\n」
數組(首字節: 「*」)
「*0\r\n」
「*-1\r\n」
市面上相似於Redis,一樣是NoSQL型的數據庫有不少,以下圖所示,除了Redis,還有MemCache、Cassadra和Mongo。下面,咱們就分別對這幾個數據庫作一下簡要的介紹:
**Memcache:**這是一個和Redis很是類似的數據庫,可是它的數據類型沒有Redis豐富。Memcache由LiveJournal的Brad Fitzpatrick開發,做爲一套分佈式的高速緩存系統,被許多網站使用以提高網站的訪問速度,對於一些大型的、須要頻繁訪問數據庫的網站訪問速度的提高效果十分顯著。
Apache Cassandra:(社區內通常簡稱爲C*)這是一套開源分佈式NoSQL數據庫系統。它最初由Facebook開發,用於儲存收件箱等簡單格式數據,集Google BigTable的數據模型與Amazon Dynamo的徹底分佈式架構於一身。Facebook於2008將 Cassandra 開源,因爲其良好的可擴展性和性能,被 Apple、Comcast、Instagram、Spotify、eBay、Rackspace、Netflix等知名網站所採用,成爲了一種流行的分佈式結構化數據存儲方案。
MongoDB:是一個基於分佈式文件存儲、面向文檔的NoSQL數據庫,由C++編寫,旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係型數據庫的,它支持的數據結構很是鬆散,是一種相似json的BSON格式。
以上就是Redis入門介紹教程,若是各位還想了解更多,歡迎評論。