乾貨技巧|關於Redis的16個使用技巧

Linksla發表於2022-08-15

1、什麼是Redis持久化?Redis有哪幾種持久化方式?優缺點是什麼?

回答:持久化就是把記憶體的資料寫到磁碟中去,防止服務當機了記憶體資料丟失。Redis 提供了兩種持久化方式:RDB(預設) 和AOF。RDB,是Redis DataBase縮寫,功能核心函式rdbSave(生成RDB檔案)和rdbLoad(從檔案載入記憶體)兩個函式AOF,f是Append-only file縮寫每當執行伺服器(定時)任務或者函式時flushAppendOnlyFile 函式都會被呼叫, 這個函式執行以下兩個工作aof寫入儲存:WRITE:根據條件,將 aof_buf 中的快取寫入到 AOF 檔案SAVE:根據條件,呼叫 fsync 或 fdatasync 函式,將 AOF 檔案儲存到磁碟中。儲存結構:內容是redis通訊協議(RESP )格式的命令文字儲存。比較:aof檔案比rdb更新頻率高,優先使用aof還原資料。aof比rdb更安全也更大rdb效能比aof好如果兩個都配了優先載入AOF


2、Redis 單執行緒為什麼還能這麼快

命令執行基於記憶體操作,在記憶體操作時間是幾十納秒,命令執行是單執行緒,沒有執行緒切換開銷,基於IO多路複用機制提升Redis的I/O利用率高效 資料結構。


3、Redis到底是單執行緒還是多執行緒?

Redis6.0版本之前的單執行緒指的是 網路I/O和鍵值對讀寫是由一個執行緒完成的。Redis6.0引入的多執行緒指的是網路請求過程採用了多執行緒;而鍵值對讀寫命令仍然是單執行緒處理的,Redis依然是併發安全的。即資料操作模組是單執行緒的,其它持久化、叢集資料同步等,是由額外執行緒執行的。


4、使用過Redis分散式鎖麼,它是怎麼實現的?

先拿setnx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止鎖忘記了釋放。如果在setnx之後執行expire之前程式意外crash或者要重啟維護了,那會怎麼樣?set指令有非常複雜的引數,這個應該是可以同時把setnx和expire合成一條指令來用的!


5、什麼是快取穿透?如何避免?什麼是快取雪崩?何如避免?

快取穿透


一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢(比如DB)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。


如何避免?


對查詢結果為空的情況也進行快取,快取時間設定短一點,或者該key對應的資料insert了之後清理快取。


對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時透過該bitmap過濾。


快取雪崩


當快取伺服器重啟或者大量快取集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓力。導致系統崩潰。


如何避免?


在快取失效後,透過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待。


做二級快取,A1為原始快取,A2為複製快取,A1失效時,可以訪問A2,A1快取失效時間設定為短期,A2設定為長期


不同的key,設定不同的過期時間,讓快取失效的時間點儘量均勻。


6、Redis的併發競爭問題如何解決?

Redis為單程式單執行緒模式,採用佇列模式將併發訪問變為序列訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連線並不存在競爭,但是在Jedis客戶端對Redis進行併發訪問時會發生連線超時、資料轉換錯誤、阻塞、客戶端關閉連線等問題,這些問題均是由於客戶端連線混亂造成。對此有2種解決方法:


客戶端角度,為保證每個客戶端間正常有序與Redis進行通訊,對連線進行池化,同時對客戶端讀寫Redis操作採用內部鎖synchronized。


伺服器角度,利用setnx實現鎖。


對於第一種,需要應用程式自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問題。


7、Redis 支援哪幾種資料型別?

String、List、Set、Sorted Set、hashes。


它還有三種特殊的資料結構型別


Geospatial


Hyperloglog


Bitmap


8、Redis 有哪幾種資料淘汰策略?

noeviction:返回錯誤當記憶體限制達到,並且客戶端嘗試執行會讓更多記憶體被使用的命令。allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新新增的資料有空間存放。


volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限於在過期集合的鍵,使得新新增的資料有空間存放。


allkeys-random: 回收隨機的鍵使得新新增的資料有空間存放。


volatile-random: 回收隨機的鍵使得新新增的資料有空間存放,但僅限於在過期集合的鍵。volatile-ttl: 回收在過期集合的鍵,並且優先回收存活時間(TTL)較短的鍵,使得新新增的資料有空間存放。


9、Redis 叢集為什麼至少需要三個主節點

因為新主節點的選舉現需要大於半數的叢集主節點同意才能選舉成功,只有兩個的話,其中一個掛了,達不到選舉新主節點條件的。


10、Redis叢集為什麼推薦奇數個節點

在掛掉相同機器的前提下,奇數和奇數+1的偶數,效果是一樣的,但是卻多浪費了一臺機器


例如:3臺機器掛兩臺,和4臺機器掛兩臺同樣都不可用。



11、請說一下快取擊穿問題

快取擊穿: 指熱點key在某個時間點過期的時候,而恰好在這個時間點對這個Key有大量的併發請求過來,從而大量的請求打到db。


快取擊穿看著有點像,其實它兩區別是,快取雪奔是指資料庫壓力過大甚至down機,快取擊穿只是大量併發請求到了DB資料庫層面。可以認為擊穿是快取雪奔的一個子集吧。有些文章認為它倆區別,是區別在於擊穿針對某一熱點key快取,雪奔則是很多key。


解決方案就有兩種:


1.使用互斥鎖方案。快取失效時,不是立即去載入db資料,而是先使用某些帶成功返回的原子操作命令,如(Redis的setnx)去操作,成功的時候,再去載入db資料庫資料和設定快取。否則就去重試獲取快取。


2. “永不過期”,是指沒有設定過期時間,但是熱點資料快要過期時,非同步執行緒去更新和設定過期時間。


12、說說Redis的常用應用場景

快取、排行榜、計數器應用、共享Session、分散式鎖、社交網路、訊息佇列、位操作


13、什麼是熱Key問題,如何解決熱key問題

什麼是熱Key呢?在Redis中,我們把訪問頻率高的key,稱為熱點key。如果某一熱點key的請求到伺服器主機時,由於請求量特別大,可能會導致主機資源不足,甚至當機,從而影響正常的服務。而熱點Key是怎麼產生的呢?主要原因有兩個:


使用者消費的資料遠大於生產的資料,如秒殺、熱點新聞等讀多寫少的場景。


請求分片集中,超過單Redi伺服器的效能,比如固定名稱key,Hash落入同一臺伺服器,瞬間訪問量極大,超過機器瓶頸,產生熱點Key問題。


14、那麼在日常開發中,如何識別到熱點key呢?

憑經驗判斷哪些是熱Key;


客戶端統計上報;


服務代理層上報


15、如何解決熱key問題?

Redis叢集擴容:增加分片副本,均衡讀流量;


將熱key分散到不同的伺服器中;


使用二級快取,即JVM本地快取,減少Redis的讀請求。


16、如何實現一個排行榜功能?

比如,使用者每天上傳影片,獲得點讚的排行榜可以這樣設計:


1.使用者Jay上傳一個影片,獲得6個贊,可以醬紫:


zadd user:ranking:2021-03-03 Jay 3


2.過了一段時間,再獲得一個贊,可以這樣:


zincrby user:ranking:2021-03-03 Jay 1


3.如果某個使用者John作弊,需要刪除該使用者:


zrem user:ranking:2021-03-03 John

-----------------------------------

©著作權歸作者所有:來自51CTO部落格作者LinkSLA的原創作品,請聯絡作者獲取轉載授權,否則將追究法律責任

乾貨技巧|關於Redis的16個使用技巧

https://blog.51cto.com/u_15576159/5578335


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2910489/,如需轉載,請註明出處,否則將追究法律責任。

相關文章