redis是乙個key-vakue儲存系統,支援五種儲存結構:string,hash,list,set,sorted set。與memcached一樣為了保證效率,將資料儲存在記憶體中。區別的是redis會週期的把更新的資料寫入磁碟或者把修改操作寫入追加的檔案中,並在此基礎上實現了主從同步。
2.1 redis每種資料型別的使用場景
2.2 redis的優缺點
使用redis主要考慮兩個角度(優點):效能和併發。
(1)我們在碰到需要執行耗時特別久,且結果不頻繁變動的sql,就特別適合**執行結果放入快取,這樣,後面的請求就去快取中讀取,使得請求能夠迅速響應。
(2)在大併發的情況下,所有請求直接訪問資料庫,資料庫會出現連線異常。這個時候,就需要使用redis做乙個緩衝操作,讓請求先訪問到redis,而不是直接訪問資料庫。
使用redis也有一些缺點:
(1)快取和資料庫雙寫寫一致性問題;
(2)快取雪崩問題;
(3)快取擊穿問題;
(4)快取的併發競爭問題
2.3 redis的速度為什麼這麼快?
(1)純記憶體操作
(2)單執行緒操作,避免了頻繁的上下文切換
(3)採用了非阻塞io多路復用機制
2.4 redis的過期策略以及記憶體淘汰機制
採用定期刪除和惰性刪除的策略。
定期刪除,redis預設沒個100ms檢查是否有過期的key需要刪除,有過去則刪除,需要說明的是,redis不是每隔100ms將所有的key檢查一次,而是隨機抽查進行檢查(如果每隔100ms將全部key積蓄檢查,redis豈不是卡死)。因此,如果只採用定期刪除策略,會導致很多key到時間沒有刪除。
於是,惰性刪除就派上用場了。大概我們獲取乙個key的時候,redis會檢查一下,這個key有沒有過期,過期的話就刪除了。
採用定期刪除+惰性刪除也會有問題。如果定期刪除沒有刪除key,然後也沒有即時請求key 也就是惰性殺出沒生效。這樣,redis的記憶體會越來越高。那麼就應該採用記憶體淘汰機制。
在redis.conf中有一行配置
#maxmemory-policy volatile-lru
該配置就是配置記憶體淘汰策略的。
2.5 redis和資料庫雙寫一致性問題
分析:一致性問題是分布式常見問題,還可以再分為最終一致性和強一致性。資料庫和快取雙寫,就必然會存在不一致的問題。答這個問題,先明白乙個前提。就是如果對資料有強一致性要求,不能放快取。我們所做的一切,只能保證最終一致性。另外,我們所做的方案其實從根本上來說,只能說降低不一致發生的概率,無法完全避免。因此,有強一致性要求的資料,不能放快取。
回答:首先,採取正確更新策略,先更新資料庫,再刪快取。其次,因為可能存在刪除快取失敗的問題,提供乙個補償措施即可,例如利用訊息佇列。
2.6 如何應對快取穿透和快取雪崩問題
快取穿透,即黑客故意去請求快取中不存在的資料,導致所有的請求都懟到資料庫上,從而資料庫連線異常。
解決方案:
快取雪崩,即快取同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到資料庫上,從而導致資料庫連線異常。
解決方案:
2.7 如何解決redis的併發競爭key問題
分析:這個問題大致就是,同時有多個子系統去set乙個key。這個時候要注意什麼呢?大家思考過麼。回答:如下所示
2.8 redis的持久化
redis 提供了多種不同級別的持久化方式:
你甚至可以關閉持久化功能,讓資料只在伺服器執行時存在。
rdb
工作原理:每隔一定時間給記憶體照乙個快照,將記憶體中的資料寫入檔案(rdb檔案)
配置引數:redis.conf檔案
rdb示例測試:可以使用redis-benchmark進行壓力測試
./bin/redis-benchmark -n 100000 表示執行100000個操作
rdb的缺點:
在兩次快照之間,如果發生斷電,資料會丟失
舉例:在生成rdb後,插入新值。突然斷電,資料可能會丟失
aof:通過日誌的方式
工作原理:記錄操作的命令
配置引數:
什麼是aof的重寫:rewrite
將記憶體中的key逆向生成命令,如同乙個key,反覆操作了100次,aof檔案會記錄100次操作,這樣會導致aof檔案過大
例如:set age 0
incr age
incr age
… 100次
最後 age的值是100
經過重寫後,直接執行: set age 100
可以通過觀察aof日誌檔案的大小
3、redis持久化注意的問題
redis經典面試問題鏈結
redis基礎知識,資料結構,分布式鎖,keys作用與問題,非同步佇列,延時佇列,持久化,pipeline。同步機制 面了bat,我總結了他們會問的redis基礎知識 redis最常問的三個問題 快取雪崩 擊穿 穿透 帶答案 redis,哨兵 持久化 主從 手撕lru redis,雙寫一致性 併發競...
Redis常見面試問題
redis穿透 單使用者請求,該資料在資料庫中就為空,那麼自然在redis中也不可能存在,這也被成為命中率問題.解決的方案為 1.簡單粗暴 該資料本來為空時,那我們就在redis中set乙個該資料為空的值,但是要注意的一點是 過期時間不要設定太長,2 布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大...
It面試問題
一般第一輪技術面都是來考察你最基本的技術功底。招聘季節,隨處可見抱著厚厚的 程式設計師面試寶典 啃的學生。偶爾也能看見 程式設計之美 劍指offer 的神書。這些經驗書確實有用。但是要想全面的掌握筆試面試的基礎考點,還是需要完整的複習。其實,筆試面試對計算機基礎的考察是萬變不離其宗的。其考點無非分為...