![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SM1UmMwUWOlNDOxEWY0QTMzcjMiZmMhdDNjZjMjNDOi9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
什麼是Redis
Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高性能非關系型(NoSQL)的鍵值對資料庫。
Redis 可以存儲鍵和五種不同類型的值之間的映射。鍵的類型隻能為字元串,值支援五種資料類型:字元串、清單、集合、散清單、有序集合。
與傳統資料庫不同的是 Redis 的資料是存在記憶體中的,是以讀寫速度非常快,是以 redis 被廣泛應用于緩存方向,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。另外,Redis 也經常用來做分布式鎖。除此之外,Redis 支援事務 、持久化、LUA腳本、LRU驅動事件、多種叢集方案。
Redis有哪些優缺點
優點
- 讀寫性能優異, Redis能讀的速度是110000次/s,寫的速度是81000次/s。
- 支援資料持久化,支援AOF和RDB兩種持久化方式。
- 支援事務,Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合并後的原子性執行。
- 資料結構豐富,除了支援string類型的value外還支援hash、set、zset、list等資料結構。
- 支援主從複制,主機會自動将資料同步到從機,可以進行讀寫分離。
缺點
- 資料庫容量受到實體記憶體的限制,不能用作海量資料的高性能讀寫,是以Redis适合的場景主要局限在較小資料量的高性能操作和運算上。
- Redis 不具備自動容錯和恢複功能,主機從機的當機都會導緻前端部分讀寫請求失敗,需要等待機器重新開機或者手動切換前端的IP才能恢複。
- 主機當機,當機前有部分資料未能及時同步到從機,切換IP後還會引入資料不一緻的問題,降低了系統的可用性。
- Redis 較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。為避免這一問題,運維人員在系統上線時必須確定有足夠的空間,這對資源造成了很大的浪費。
為什麼要用 Redis /為什麼要用緩存
主要從“高性能”和“高并發”這兩點來看待這個問題。
高性能:
假如使用者第一次通路資料庫中的某些資料。這個過程會比較慢,因為是從硬碟上讀取的。将該使用者通路的資料存在數緩存中,這樣下一次再通路這些資料的時候就可以直接從緩存中擷取了。操作緩存就是直接操作記憶體,是以速度相當快。如果資料庫中的對應資料改變的之後,同步改變緩存中相應的資料即可!
高并發:
直接操作緩存能夠承受的請求是遠遠大于直接通路資料庫的,是以我們可以考慮把資料庫中的部分資料轉移到緩存中去,這樣使用者的一部分請求會直接到緩存這裡而不用經過資料庫。
為什麼要用 Redis 而不用 map/guava 做緩存?
緩存分為本地緩存和分布式緩存。以 Java 為例,使用自帶的 map 或者 guava 實作的是本地緩存,最主要的特點是輕量以及快速,生命周期随着 jvm 的銷毀而結束,并且在多執行個體的情況下,每個執行個體都需要各自儲存一份緩存,緩存不具有一緻性。
使用 redis 或 memcached 之類的稱為分布式緩存,在多執行個體的情況下,各執行個體共用一份緩存資料,緩存具有一緻性。缺點是需要保持 redis 或 memcached服務的高可用,整個程式架構上較為複雜。
Redis為什麼這麼快
1、完全基于記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似于 HashMap,HashMap 的優勢就是查找和操作的時間複雜度都是O(1);
2、資料結構簡單,對資料操作也簡單,Redis 中的資料結構是專門進行設計的;
3、采用單線程,避免了不必要的上下文切換和競争條件,也不存在多程序或者多線程導緻的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導緻的性能消耗;
4、使用多路 I/O 複用模型,非阻塞 IO;
5、使用底層模型不同,它們之間底層實作方式以及與用戶端之間通信的應用協定不一樣,Redis 直接自己建構了 VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求;
資料類型
Redis有哪些資料類型
Redis主要有5種資料類型,包括String,List,Set,Zset,Hash,滿足大部分的使用要求
資料類型 | 可以存儲的值 | 操作 | 應用場景 |
---|---|---|---|
STRING | 字元串、整數或者浮點數 | 對整個字元串或者字元串的其中一部分執行操作 對整數和浮點數執行自增或者自減操作 | 做簡單的鍵值對緩存 |
LIST | 清單 | 從兩端壓入或者彈出元素 對單個或者多個元素進行修剪, 隻保留一個範圍内的元素 | 存儲一些清單型的資料結構,類似粉絲清單、文章的評論清單之類的資料 |
SET | 無序集合 | 添加、擷取、移除單個元素 檢查一個元素是否存在于集合中 計算交集、并集、差集 從集合裡面随機擷取元素 | 交集、并集、差集的操作,比如交集,可以把兩個人的粉絲清單整一個交集 |
HASH | 包含鍵值對的無序散清單 | 添加、擷取、移除單個鍵值對 擷取所有鍵值對 檢查某個鍵是否存在 | 結構化的資料,比如一個對象 |
ZSET | 有序集合 | 添加、擷取、删除元素 根據分值範圍或者成員來擷取元素 計算一個鍵的排名 | 去重但可以排序,如擷取排名前幾名的使用者 |
Redis的應用場景
總結一
計數器
可以對 String 進行自增自減運算,進而實作計數器功能。Redis 這種記憶體型資料庫的讀寫性能非常高,很适合存儲頻繁讀寫的計數量。
緩存
将熱點資料放到記憶體中,設定記憶體的最大使用量以及淘汰政策來保證緩存的命中率。
會話緩存
可以使用 Redis 來統一存儲多台應用伺服器的會話資訊。當應用伺服器不再存儲使用者的會話資訊,也就不再具有狀态,一個使用者可以請求任意一個應用伺服器,進而更容易實作高可用性以及可伸縮性。
全頁緩存(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平台。以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。此外,對WordPress的使用者來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾浏覽過的頁面。
查找表
例如 DNS 記錄就很适合使用 Redis 進行存儲。查找表和緩存類似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而緩存的内容可以失效,因為緩存不作為可靠的資料來源。
消息隊列(釋出/訂閱功能)
List 是一個雙向連結清單,可以通過 lpush 和 rpop 寫入和讀取消息。不過最好使用 Kafka、RabbitMQ 等消息中間件。
分布式鎖實作
在分布式場景下,無法使用單機環境下的鎖來對多個節點上的程序進行同步。可以使用 Redis 自帶的 SETNX 指令實作分布式鎖,除此之外,還可以使用官方提供的 RedLock 分布式鎖實作。
其它
Set 可以實作交集、并集等操作,進而實作共同好友等功能。ZSet 可以實作有序性操作,進而實作排行榜等功能。
總結二
Redis相比其他緩存,有一個非常大的優勢,就是支援多種資料類型。
資料類型說明string字元串,最簡單的k-v存儲hashhash格式,value為field和value,适合ID-Detail這樣的場景。list簡單的list,順序清單,支援首位或者末尾插入資料set無序list,查找速度快,适合交集、并集、差集處理sorted set有序的set
其實,通過上面的資料類型的特性,基本就能想到合适的應用場景了。
string——适合最簡單的k-v存儲,類似于memcached的存儲結構,短信驗證碼,配置資訊等,就用這種類型來存儲。
hash——一般key為ID或者唯一标示,value對應的就是詳情了。如商品詳情,個人資訊詳情,新聞詳情等。
list——因為list是有序的,比較适合存儲一些有序且資料相對固定的資料。如省市區表、字典表等。因為list是有序的,适合根據寫入的時間來排序,如:最新的***,消息隊列等。
set——可以簡單的了解為ID-List的模式,如微網誌中一個人有哪些好友,set最牛的地方在于,可以對兩個set提供交集、并集、差集操作。例如:查找兩個人共同的好友等。
Sorted Set——是set的增強版本,增加了一個score參數,自動會根據score的值進行排序。比較适合類似于top 10等不根據插入的時間來排序的資料。
如上所述,雖然Redis不像關系資料庫那麼複雜的資料結構,但是,也能适合很多場景,比一般的緩存資料結構要多。了解每種資料結構适合的業務場景,不僅有利于提升開發效率,也能有效利用Redis的性能。
來源:https://blog.csdn.net/ThinkWon/article/details/103522351 - END - 本人的專欄已上線,歡迎訂閱
有收獲就點個「在看」吧 ▼