redis全面解析

01 Redis是什麼?

Redis是C語言編寫完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫,而且是一個NOSQL類型數據庫,是爲了解決高併發、高擴展,大數據存儲等一系列的問題而產生的數據庫解決方案。但是,它也是不能替代關係型數據庫,只能作爲特定環境下的擴充。

 

02 Redis的特點有哪些?

Redis本質上是一個Key-Value類型的內存數據庫。其有以下三個特點:

  • Redis 支持數據持久化,可以將內存中的數據保存在磁盤中,重啓的時候可以再次加載進行使用。
  • Redis 不僅僅支持簡單的 key - value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲
  • Redis 支持數據的備份,即 master - slave 模式的數據備份

 

03 Redis支持的數據類型

Redis支持 5 中數據類型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合)。

string

string 是 redis 最基本的數據類型。一個 key 對應一個 value。

string 是二進制安全的。也就是說 redis 的 string 可以包含任何數據。比如 jpg 圖片或者序列化的對象。

string 類型是 redis 最基本的數據類型,string 類型的值最大能存儲 512 MB。

理解:string 就像是 java 中的 map 一樣,一個 key 對應一個 value

hash

Redis hash 是一個鍵值對(key - value)集合。

Redis hash 是一個 string 類型的 key 和 value 的映射表,hash 特別適合用於存儲對象。

理解:可以將 hash 看成一個 key - value 的集合。也可以將其想成一個 hash 對應着多個 string。

與 string 區別:string 是 一個 key - value 鍵值對,而 hash 是多個 key - value 鍵值對。

list

Redis 列表是簡單的字符串列表,按照插入順序排序。我們可以網列表的左邊或者右邊添加元素。

我們可以看出 list 就是一個簡單的字符串集合,和 Java 中的 list 相差不大,區別就是這裏的 list 存放的是字符串。list 內的元素是可重複的。

set

redis 的 set 是字符串類型的無序集合。集合是通過哈希表實現的,因此添加、刪除、查找的複雜度都是 O(1)。

redis 的 set 與 java 中的 set 還是有點區別的。redis 的 set 是一個 key 對應着 多個字符串類型的 value,也是一個字符串類型的集合,但是和 redis 的 list 不同的是 set 中的字符串集合元素不能重複,但是 list 可以。

Zset

redis zset 和 set 一樣都是 字符串類型元素的集合,並且集合內的元素不能重複。

不同的是 zset 每個元素都會關聯一個 double 類型的分數。redis 通過分數來爲集合中的成員進行從小到大的排序。

zset 的元素是唯一的,但是分數(score)卻可以重複。

zset 是按照 分輸的大小來排序的。

 

04 爲什麼Redis需要把所有數據放到內存中?

Redis爲了達到最快的讀寫速度將數據都讀到內存中,並通過異步的方式將數據寫入磁盤。所以Redis具有快速和數據持久化的特性。

如果不將數據放到內存中,磁盤的I/O速度會嚴重影響redis的性能。在內存越來越便宜的今天,redis將會越來越受歡迎。如果設置了最大使用的內存,則數據已有記錄數達到內存限值後將不能繼續插入新值。

 

05 Redis 適用場景有哪些?

1、緩存

緩存現在幾乎是所有中大型網站都在用的必殺技,將業務中的熱數據存儲在Redis中,合理的利用緩存不僅能夠提升網站訪問速度,還能大大降低數據庫的壓力。Redis提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現在Redis用在緩存的場合非常多。

 

2、排行榜

很多網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。Redis提供的SortedSet (有序集合)數據類構能實現各種複雜的排行榜功能。SortedSet 類型每個成員具有兩個屬性,一個是 name 一個是 score, 使用 zadd key score member 向 SortedSet 添加成員。使用 zrevrange key start stop 來獲取指定排名區間的成員(zrevrange 按 score 從大到小排列,zrange相反)。

 

3、計數器 & 計時

可實現計數和計時的功能。如電商網站商品的瀏覽量、視頻網站視頻的播放數等。爲了保證數據實時效,每次瀏覽都得給+1,併發量高時如果每次都請求數據庫操作無疑是種挑戰和壓力。再比如每天最多隻能獲取10次驗證碼, 可以使用 Redis 提供的 inch 命令, inch會對數據進行加一操作而且該命令具有原子性。非常適用於這些計數場景。

 

計時,比如驗證碼一分鐘內有效。可以使用 Redis 的 setex 命令設置驗證碼只保存一分鐘,一分鐘後失效。

 

4、分佈式會話

集羣模式下,在應用不多的情況下一般使用容器自帶的session複製功能就能滿足,當應用增多相對複雜的系統中,一般都會搭建以Redis等內存數據庫爲中心的session服務,session不再由容器管理,而是由session服務及內存數據庫管理。

 

5、分佈式鎖

在很多互聯網公司中都使用了分佈式技術,分佈式技術帶來的技術挑戰是對同一個資源的併發訪問,如全局ID、減庫存、秒殺等場景,併發量不大的場景可以使用數據庫的悲觀鎖、樂觀鎖來實現,但在併發量高的場合中,利用數據庫鎖來控制資源的併發訪問是不太理想的,大大影響了數據庫的性能。可以利用Redis的setnx實現鎖機制。setnx == set if not exsist。用法爲 setnx key value 。如果該key存在則設置不成功返回0, 如果該 key 不存在則設置成功返回1。 能夠設置成功則獲得鎖,設置不成功則獲取不到鎖。當然還要考慮獲得鎖的進程掛掉/網絡連接失敗 導致的死鎖等情況。,實際應用中要考慮的細節要更多。

 

6、 社交網絡

點贊、踩、關注/被關注、共同好友等是社交網站的基本功能,社交網站的訪問量通常來說比較大,而且傳統的關係數據庫類型不適合存儲這種類型的數據,Redis提供的哈希、集合等數據結構能很方便的的實現這些功能。

 

7、最新列表

Redis列表結構,LPUSH可以在列表頭部插入一個內容ID作爲關鍵字,LTRIM可用來限制列表的數量,這樣列表永遠爲N個ID,無需查詢最新的列表,直接根據ID去到對應的內容頁即可。

 

8、消息系統

消息隊列是大型網站必用中間件,如ActiveMQ、RabbitMQ、Kafka等流行的消息隊列中間件,主要用於業務解耦、流量削峯及異步處理實時性低的業務。Redis提供了發佈/訂閱及阻塞隊列功能,比如email或者驗證碼的發送隊列,Redis的List類型能夠很輕鬆的實現一個消息隊列,使用lpush和rpop/brpop(阻塞版rpop)。另外,這個不能和專業的消息中間件相比。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章