Redis 面試準備

2021-10-06 20:28:50 字數 3208 閱讀 1473

redis資料庫中的所有資料都儲存在記憶體中。由於記憶體的讀寫速度遠快於硬碟,因此redis的的的在效能上對比其他基於硬碟儲存的資料庫有非常明顯的優勢。(資料雖在記憶體,但是提供了持久化的支援,即可以將記憶體中的資料非同步寫入到硬碟中,同時不影響繼續提供服務)

為什麼快:

(一)純記憶體操作

(二)單執行緒操作,避免了頻繁的上下文切換

(三)採用了非阻塞i/o多路復用機制

redis的的是完全開源免費的,遵守bsd協議,是乙個高效能的鍵值資料庫。是當前最熱門的的的nosql資料庫之一,也被人們稱為資料結構伺服器。

使用場景:

1.我們在碰到需要執行耗時特別久,且結果不頻繁變動的sql,就特別適合將執行結果放入快取,這樣,後面的請求就去快取中讀取,請求使得能夠迅速響應

2.在大併發的情況下,所有的請求直接訪問資料庫,資料庫會出現連線異常。這個時候,就需要使用的的redis的做乙個緩衝操作,讓請求先訪問到的redis的的,而不是直接訪問資料庫。

【redis資料結構 – 簡介】

redis是一種高階的key:value儲存系統,其中value支援五種資料型別:

1.字串(strings)

2.字串列表(lists)

3.字串集合(sets)

4.有序字串集合(sorted sets)

5.雜湊(hashes)

而關於key,有幾個點要提醒大家:

1.key不要太長,盡量不要超過1024位元組,這不僅消耗記憶體,而且會降低查詢的效率;

2.key也不要太短,太短的話,key的可讀性會降低;

3.在乙個專案中,key最好使用統一的命名模式,例如user:10000:passwd。

1.第一種鎖命令incr

在遇到數值操作時,redis會將字串型別轉換成數值。

由於incr等指令本身就具有原子操作的特性,所以我們完全可以利用redis的incr、incrby、decr、decrby等指令來實現原子計數的效果,假如,在某種場景下有3個客戶端同時讀取了mynum的值(值為2),然後對其同時進行了加1的操作,那麼,最後mynum的值一定是5。不少**都利用redis的這個特性來實現業務上的統計計數需求。

這種加鎖的思路是, key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 incr 操作進行加一。 

然後其它使用者在執行 incr 操作進行加一時,如果返回的數大於 1 ,說明這個鎖正在被使用當中。

2.lists的應用相當廣泛,隨便舉幾個例子:

rdb,簡而言之,就是在不同的時間點,將redis儲存的資料生成快照並儲存到磁碟等介質上;

aof,則是換了乙個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重複執行一遍,就可以實現資料恢復了。

其實rdb和aof兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優先採用aof方式來進行資料恢復,這是因為aof方式的資料恢復完整度更高。

如果你沒有資料持久化的需求,也完全可以關閉rdb和aof方式,這樣的話,redis將變成乙個純記憶體資料庫,就像memcache一樣

分析:這個問題其實相當重要,到底redis有沒用到家,這個問題就可以看出來。比如你redis只能存5g資料,可是你寫了10g,那會刪5g的資料。怎麼刪的,這個問題思考過麼?還有,你的資料已經設定了過期時間,但是時間到了,記憶體佔用率還是比較高,有思考過原因麼?

回答:redis採用的是定期刪除+惰性刪除策略。

為什麼不用定時刪除策略?

定期刪除+惰性刪除是如何工作的呢?

定期刪除,redis預設每個100ms檢查,是否有過期的key,有過期key則刪除。需要說明的是,redis不是每個100ms將所有的key檢查一次,而是隨機抽取進行檢查(如果每隔100ms,全部key進行檢查,redis豈不是卡死)。因此,如果只採用定期刪除策略,會導致很多key到時間沒有刪除。

於是,惰性刪除派上用場。也就是說在你獲取某個key的時候,redis會檢查一下,這個key如果設定了過期時間那麼是否過期了?如果過期了此時就會刪除。

採用定期刪除+惰性刪除就沒其他問題了麼?

不是的,如果定期刪除沒刪除key。然後你也沒即時去請求key,也就是說惰性刪除也沒生效。這樣,redis的記憶體會越來越高。那麼就應該採用記憶體淘汰機制。

快取穿透,即黑客故意去請求快取中不存在的資料,導致所有的請求都懟到資料庫上,從而資料庫連線異常。

解決方案:

(一)利用互斥鎖,快取失效的時候,先去獲得鎖,得到鎖了,再去請求資料庫。沒得到鎖,則休眠一段時間重試

(二)採用非同步更新策略,無論key是否取到值,都直接返回。value值中維護乙個快取失效時間,快取如果過期,非同步起乙個執行緒去讀資料庫,更新快取。需要做快取預熱(專案啟動前,先載入快取)操作。

(三)提供乙個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的key。迅速判斷出,請求所攜帶的key是否合法有效。如果不合法,則直接返回。

快取雪崩,即快取同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到資料庫上,從而導致資料庫連線異常。

解決方案:

(一)給快取的失效時間,加上乙個隨機值,避免集體失效。

(二)使用互斥鎖,但是該方案吞吐量明顯下降了。

(三)雙快取。我們有兩個快取,快取a和快取b。快取a的失效時間為20分鐘,快取b不設失效時間。自己做快取預熱操作。然後細分以下幾個小點

回答:如下所示

(1)如果對這個key操作,不要求順序

這種情況下,準備乙個分布式鎖,大家去搶鎖,搶到鎖就做set操作即可,比較簡單。

(2)如果對這個key操作,要求順序

假設有乙個key1,系統a需要將key1設定為valuea,系統b需要將key1設定為valueb,系統c需要將key1設定為valuec.

期望按照key1的value值按照 valuea–>valueb–>valuec的順序變化。這種時候我們在資料寫入資料庫的時候,需要儲存乙個時間戳。假設時間戳如下

系統a key 1 

系統b key 1 

系統c key 1 

那麼,假設這會系統b先搶到鎖,將key1設定為。接下來系統a搶到鎖,發現自己的valuea的時間戳早於快取中的時間戳,那就不做set操作了。以此類推。

其他方法,比如利用佇列,將set方法變成序列訪問也可以

面試準備前的複習 Redis

redis 基於c k v資料庫 非關係型資料庫 todo 什麼是非關係型資料庫 文件型資料庫。todo 為什麼快 安裝目錄 redis bin redis cli redis server client要選擇 h 主機位址 p 埠號 redis配置 安裝目錄 redis redis.conf 1....

C 面試準備日記1 redis

redis是乙個開源的 基於記憶體的 key value資料庫,並提供多種語言的api。redis是乙個儲存系統,它指出儲存的value型別相對多,包括string list 鍊錶 set 集合 zset 有序集合 這些資料型別都支援push pop add remove等操作。redis為了保證效...

2012面試準備 2012 10 26面試準備

c 1 什麼純虛函式?首先,二者申明不一樣。virtual void test void 虛函式 virtual void test void 0 純虛函式 其次,如果乙個類包含了乙個純虛函式 哪怕只有乙個是純虛函式 那麼它就是乙個抽象類 就是不能生成具體的物件!但如果類中只包含虛函式,那麼是可以定...