常見問題之redis

  • redis過期鍵刪除策略
    1.立即刪除:有定時處理器處理,發現鍵過期立刻刪除(對cpu不友好,對內存友好)
    2.惰性刪除:當需要用某個鍵時再判斷是否需要刪除,沒用到的鍵一直在(對cpu友好,對內存不友好)
    3.定時刪除:定時刪除就是在某個時間點,去定時刪除某些過期的鍵(對cpu影響小,對內存消耗少,需要控制好時長和頻率)

  • redis的數據淘汰策略
    1.volatile-lru 從已 [ 設置過期時間 ] 的數據集中挑選最近[ 最少 ] 使用的數據淘汰
    2.volatile-ttl 從已設置過期時間的數據集中挑選將要過期的數據淘汰
    3.volatile-random 從已設置過期時間的數據集中任意選擇數據淘汰
    4.volatile-leu 從已設置過期時間的數據集中
    5.allkeys-lru 從所有數據集中挑選最近最少使用的數據淘汰
    6.allkeys-random 從所有數據集中任意選擇數據進行淘汰
    7.allkeys-lfu 從所有數據集中Least Frequently Used最少使用
    8.noeviction 不刪除策略,達到最大內存限制時,如果需要更多內存,直接返回錯誤信息。大多數寫命令都會導致佔用更多的內存
    注意(如過讀者想做實現,啓動 redis 後,使用客戶端 執行 info memory 命令看看 used_memory ,然後設置
    在 config 文件 中設置 maxmemory配置項,設置大於一點點,那麼會觸發淘汰算法 )

  • 緩存雪崩概念
    存儲的緩存key/value在同一時間失效,造成在某一時刻大量數據都直接訪問數據庫,造成數據庫短時間內承受大量請求而崩掉。

  • 緩存雪崩解決方案
    1.緩存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生
    2.如果併發量不是很大,對性能要求不是很高的話用鎖進行排隊,這裏並不是指的分佈式鎖,java自帶的Lock,sync就可以了,因爲這裏不考慮併發的問題,只是不希望大量數據同一時間打到數據庫上
    3.給每一個緩存數據增加相應的緩存標記,記錄緩存的是否失效,如果緩存標記失效,則更新數據緩存。

  • 緩存穿透概念
    緩存和數據庫中都沒有的數據,導致所有的請求都落到數據庫上,造成數據庫短時間內承受大量請求而崩掉。一般來說都是一些惡意的請求。

  • 緩存穿透解決方案
    1.對用戶權限進行校驗,校驗用戶id,id<=0的直接拒絕
    2.可以給這種惡意攻擊用戶設置一個key,然後value=null,設置30s的過期時間,這樣同一個用戶30s內至少是無法暴力攻擊的。
    3.採用布隆過濾器,將所有可能存在的數據哈希到一個足夠大的 bitmap 中,一個一定不存在的數據會被這個 bitmap 攔截掉,從而避免了對底層存儲系統的查詢壓力

  • 緩存擊穿概念
    緩存中沒有,但是數據庫中有這條數據,原因是因爲緩存時間已經到了。當在高併發的情況下,由於某條數據是很多接口必查的數據,那麼緩存失效,必然導致數據庫直接面向這些請求,導致數據庫崩掉。

  • 緩存雪崩和緩存擊穿的區別
    想要搞明白這兩個區別,其實只要明白一個例子就行了。緩存雪崩是指多個用戶維度的數據同時失效,導致多個用戶同時請求打在數據庫上面(用戶token緩存);緩存擊穿是指所有用戶都要用到的一條數據,一旦失效,所有用戶都會去數據庫併發查詢這條公用的數據,導致大量請求打到數據庫上,數據庫崩潰(面向所有用戶公用的一條配置)。

  • 緩存擊穿解決方案
    1.因爲是面向所有用戶的數據,比如面向所有用戶配置,設置不過期
    2.加互斥鎖
    3.可以通過緩存預熱,每次手動刷新這個緩存,這種數據大多是爲了可配置

  • 緩存預熱
    將相關的緩存數據直接加載到緩存系統。這樣就可以避免在用戶請求的時候,先查詢數據庫,然後再將數據緩存的問題!用戶直接查詢事先被預熱的緩存數據

  • 緩存預熱解決方案
    1.直接寫個緩存刷新頁面,上線時手工操作一下;
    2.數據量不大,可以在項目啓動的時候自動進行加載;
    3.定時刷新緩存,分批刷新緩存;

  • 五種數據結構
    1.string(存儲字符串,整數,小數)
    2.list (存儲 任意數據的有序集合,元素可以相同)
    3.set(存儲 任意數據的無序集合,元素不可以相同)
    4.hash(存儲 任意數據的hash表,key不能相同)
    5.zset(存儲 任意數據的有序集合,元素不可以相同)

  • 緩存與數據庫數據不一致問題
    待收集

  • 使用場景
    1.計數器(讀寫效率高,單線程不存在更新丟失覆蓋問題)
    2.緩存一些熱數據,配置最大內存和淘汰策略,提高命中率
    3.會話緩存,存儲token之類的,這樣可以更好實現會話統一管理,確保應用服務器無狀態,可擴展
    4.分佈式鎖的實現
    5.使用list實現消息隊列的功能,不過最好使用kafak,rocketMq
    6.使用zset,可以實現排行榜的功能

  • redis和memcached的區別
    1.redis是單線程架構的,memcached是多線程,非阻塞io多路複用
    2.redis支持豐富的數據結構,memcached只是支持文本,二進制
    3.redis支持RDB,AOF的持久化策略,memcached不支持持久化

  • redis的持久化策略
    1.RDB
    2.AOF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章