一.什么是redis?
Redis 是一個基于記憶體的高性能key-value資料庫, nosql 單執行緒 單行程的 支持事務
二.redis 資料型別:
string list hash set hset
三.redis的優缺點
優點:
1.速度快,資料存在記憶體中
2.有豐富的資料型別,應用場景廣泛 可用于快取 訊息
缺點:
1.受物理記憶體的限制
四.redis 應用場景:
1.會話快取
2.全頁快取
3.佇列 提供list 和set 的操作 push pop操作
4.排行榜 計數器
五.為什么redis 把所有資料放到記憶體中?(為了快的讀寫速度)
redis 為了最快的讀寫速度都讀到記憶體中,并通過異步的方式將資料寫入磁盤,如果不放入記憶體中,磁盤的io讀寫速度會影響redis 性能,
六. redis分布式鎖
1.先拿setnx 來爭奪鎖,搶到之后 再用expire 給鎖加一個過期時間防止鎖忘記釋放
若expire 命令 執行時出錯,這個鎖就會變成死鎖,不被釋放
解決方法 :
set 命令有復雜的引數 可以把setnx expire合成一條命令
redis.set(String key, String value, String nxxx, String expx, int time),這個set()方法一共有五個形參:
-
第一個為key,我們使用key來當鎖,因為key是唯一的,
-
第二個為value,我們傳的是requestId,很多童鞋可能不明白,有key作為鎖不就夠了嗎,為什么還要用到value?原因就是我們在上面講到可靠性時,分布式鎖要滿足第四個條件解鈴還須系鈴人,通過給value賦值為requestId,我們就知道這把鎖是哪個請求加的了,在解鎖的時候就可以有依據,requestId可以使用
UUID.randomUUID().toString()方法生成, -
第三個為nxxx,這個引數我們填的是NX,意思是SET IF NOT EXIST,即當key不存在時,我們進行set操作;若key已經存在,則不做任何操作;
-
第四個為expx,這個引數我們傳的是PX,意思是我們要給這個key加一個過期的設定,具體時間由第五個引數決定,
-
第五個為time,與第四個引數相呼應,代表key的過期時間,
setnx 用法:
setnx key value key不存在的情況下,設定值為value,若key 存在 不進行任何動作
7.keys * 和scan:
假如redis 里面有一億個key,其中10w 個是以某個固定已知的開頭,如何查找出來
可以使用keysz指令查找 但是 redis 是單執行緒,keys指令會堵塞執行緒 可以使用scan命令,無堵塞執行緒(可能會有重復的) 但是花費的時間比keys 長
8.redis 異步佇列
一般使用list 結構 作為佇列 rpush 生產訊息 lpop消費訊息,當lpop沒有訊息的時候,要適當sleep一會在重試
如何不用sleep 用指令blpop,在沒有訊息的時候,會堵塞住直到訊息到來
如何生產一次 消費多次 使用pub/sub 主題訂閱者模式 可以實作1:N的訊息佇列
pub/sub的缺點:在消費者下線的情況下,生產的訊息會丟失,
redis 延時佇列:
使用sortedset 拿時間戳作為score,訊息內容作為key 呼叫zadd來生產訊息,消費者使用zrangebyscore 來獲取n秒之前的資料輪詢進行處理
9.redis 的同步機制
redis可以使用主從同步,從從同步,
10.redis集群
redis cluster 著眼于擴展性,在單個redis記憶體不足時,使用cluster進行分片存盤
Redis Sentinal著眼于高可用,在master宕機時會自動將slave提升為master,繼續提供服務,
11.redis 快取雪崩 快取穿透 快取擊穿
快取雪崩:(某一時間段,快取失效)
redis 掛掉,請求都打到mysql上
快取資料設定相同的過期時間,快取在同一時間大面積失效,這時很多請求到mysql
解決方法:
redis cluster 和設定過期時間時,加下亂數 大幅度減少快取在同一時間過期
快取穿透:
一直請求快取中不存在的資料,比如id =-1的 大量的請求穿透redis,打到mysql
解決方法:
使用布隆過濾器或者提前攔截不合法的引數
或者查到為空的資料時,也放到快取中
快取擊穿:
一個key 非常熱點,在不停的被訪問,當這個key 在失效的瞬間,持續的請求穿破快取到 mysql
解決方法:
熱點key 設定永不過期
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/236567.html
標籤:其他
下一篇:DevOps習題
