尊敬的讀者,記得加關注、點讚喲,您的認可是我最大的動力,謝謝!
Redis是什麼,有哪些優缺點?
Redis,全稱Remote Dictionary Server,一個Key-Value類型的內存資料庫,整個資料庫都是加載到內存中進行操作,可以定期通過異步操作將資料庫數據保存到硬碟中進行保存。
高性能,每秒可進行超過10萬次讀寫操作,是已知最快的Key-Value資料庫。
Redis 在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(SortedSet)也使得我們在執行這些操作的時候變的非常簡單,Redis 只是正好提供了這兩種數據結構。
由於是純內存操作,資料庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫。
Redis 適合的場景主要局限在較小數據量的高性能操作和運算上。
Redis支持哪些數據類型
String、List、Set、Sorted Set、hashes
Redis 數據回收機制
noeviction:返回錯誤當內存限制達到,並且客戶端嘗試執行會讓更多內存被使用的命令。allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數據有空間存放。volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限於在過期集合的鍵,使得新添加的數據有空間存放。allkeys-random: 回收隨機的鍵使得新添加的數據有空間存放。volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限於在過期集合的鍵。volatile-ttl: 回收在過期集合的鍵,並且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存放。字符串類型值存儲的最大容量
512M
Redis適合的場景
會話緩存(Session Cache)用 Redis 緩存會話比其他存儲的優勢在於:Redis 提供持久化。
全頁緩存(FPC)Redis 提供很簡便的 FPC 平臺。一致性問題,即使重啟了 Redis 實例,因為有磁碟的持久化,用戶也不會看到頁面加載速度的下降。
隊列Reids 在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得 Redis 能作為一個很好的消息隊列平臺來使用。Redis 作為隊列使用的操作,就類似於本地程序語言(如 Python)對 list 的 push/pop操作。
排行榜/計數器Redis 在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(SortedSet)也使得我們在執行這些操作的時候變得非常簡單,Redis 只是正好提供了這兩種數據結構。
發布/訂閱Redis 還有發布/訂閱功能,基於它可以建立聊天系統!
緩存穿透
一般的緩存系統,都是按照 key 去緩存查詢,如果不存在對應的 value,就應該去後端系統查找(比如DB)。一些惡意的請求會故意查詢不存在的 key,請求量很大,就會對後端系統造成很大的壓力。這就叫做緩存穿透。
避免緩存穿透
對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該 key 對應的數據 insert 了之後清理緩存。
對一定不存在的 key 進行過濾。可以把所有的可能存在的 key 放到一個大的 Bitmap 中,查詢時通過該 bitmap 過濾。
緩存雪崩
當緩存伺服器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓力。導致系統崩潰。
避免緩存雪崩
在緩存失效後,通過加鎖或者隊列來控制讀資料庫寫緩存的線程數量。比如對某個 key 只允許一個線程查詢數據和寫緩存,其他線程等待。
做二級緩存,A1 為原始緩存,A2 為拷貝緩存,A1 失效時,可以訪問 A2,A1 緩存失效時間設置為短期,A2 設置為長期。
不同的 key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。
歡迎點評