一.redis簡介
- redis就是一個數據庫,數據存在內存中,讀寫熟讀非常快
- 另外redis經常用來做分佈式鎖(redis爲單進程單線程模式,採用隊列模式將併發訪問變成串行訪問,多個客戶端讀redis的連接不存在競爭關係)
- redis提供了多種數據類型來支持不同業務場景
- redis支持事務、持久化、LUA腳本、LRU驅動事件
二.爲什麼要用redis作爲緩存
- 高性能:用戶通過訪問緩存也即內存的速度比訪問數據即硬盤的速度要快的多
- 高併發:直接操作緩存能夠承受的請求是遠遠大於直接訪問數據庫的,可以把一部分數據庫的數據轉移到緩存中去
三.redis緩存對比map/guava緩存
- redis緩存被稱爲分佈式緩存,可以用幾十G做緩存,Map是本地緩存,JVM最多幾個G
- Redis 的緩存可以持久化,Map 是內存對象,程序一重啓數據就沒了
- Redis 有豐富的 API,Map 就簡單太多了
- 多實例的情況下,各實例共用一份緩存數據 ,map則不是
四.redis的線程模型
redis 內部使用文件事件處理器 file event handler
,這個文件事件處理器是單線程的,所以 redis 才叫做單線程的模型。它採用 IO 多路複用機制同時監聽多個 socket,根據 socket 上的事件來選擇對應的事件處理器進行處理。
文件事件處理器的結構包含 4 個部分 :
- 多個 socket
- IO 多路複用程序
- 文件事件分派器
- 事件處理器(連接應答處理器、命令請求處理器、命令回覆處理器)
多個 socket 可能會併發產生不同的操作,每個操作對應不同的文件事件,但是 IO 多路複用程序會監聽多個 socket,會將 socket 產生的事件放入隊列中排隊,事件分派器每次從隊列中取出一個事件,把該事件交給對應的事件處理器進行處理。
五.redis與memcached區別
- redis支持更豐富的數據類型( list,set,zset,hash )
- redis支持數據的持久化,即可以把內存中的數據保存在磁盤裏,重啓的時候可以再次加載進內存使用,但是mencached只能把數據全部存在內存中
- Memcached是多線程,非阻塞IO複用的網絡模型;Redis使用單線程的多路 IO 複用模型。
六.redis常用數據結構以及場景
- String 常規計數,微博數,粉絲數( set,get,decr,incr,mget )
- Hash 存儲用戶信息,商品信息( hget,hset,hgetall )
- List 雙向鏈表 微博的關注列表,粉絲列表,消息列表 ( lpush,rpush,lpop,rpop,lrange )
- set 共同關注、共同粉絲、共同喜好 ( sadd,spop,smembers,sunion )
- Sorted Set 直播間在線用戶列表,各種禮物排行榜,彈幕消息 ( zadd,zrange,zrem,zcard )
七.redis設置過期事件的必要性
- 安全性 :短信驗證碼
- 可用性:定期隨機刪除或者惰性刪除
八.redis持久化機制
- RDB(快照持久化)
可以將快照複製到其他服務器從而創建具有相同數據的服務器副本(Redis主從結構,主要用來提高Redis性能),還可以將快照留在原地以便重啓服務器的時候使用。
2.AOF( 只追加文件 持久化)
AOF持久化 的實時性更好,因此已成爲主流的持久化方案。
九.redis事務
Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務(transaction)功能
dis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾
十.緩存雪崩和緩存穿透
1.什麼是緩存雪崩
緩存同一時間大面積的失效,所以,後面的請求都會落到數據庫上,造成數據庫短時間內承受大量請求而崩掉。
2.什麼是緩存穿透
大量請求的 key 根本不存在於緩存中,導致請求直接到了數據庫上,根本沒有經過緩存這一層。
參考https://github.com/CyC2018/CS-Notes/blob/master/notes/Redis.md