天天看點

Redis常見面試題彙總1

1.什麼是Redis

Redis是一種使用C語言編寫的高性能鍵值對key-value形式存儲的非關系型資料庫,Redis支援五種資料類型:字元串、清單、集合、散清單、有序集合,Redis中的鍵類型隻能是字元串類型。
    Redis的資料存儲在緩存中,是以讀寫速度快,每秒可以處理10萬次讀寫操作,Redis經常用來做分布式鎖,除此之外Redis支援事務、持久化、LUA腳本、LRU驅動事件、多種叢集方案。
           

2.Redis的優缺點

優點:
        1.讀寫性能優異, Redis能讀的速度是110000次/s,寫的速度是81000次/s。
        2.支援資料持久化,支援AOF和RDB兩種持久化方式。
        3.支援事務
        4.資料結構豐富:支援Stirng類型的value還支援hash,set,zset,list等資料結構
        5.支援主從複制,主機會自動将資料同步到從機,可以進行讀寫分離
    缺點:
        1.資料庫容量受到實體記憶體的限制,不能用作海量資料的高性能讀寫。
        2.主機從機的當機都會導緻部分讀寫請求失敗
        3.主機當機,當機前部分資料沒有及時同步到從機,切換IP後還會引入資料不易的問題。
        4.Redis較難支援線上拓容。
           

3.Redis為什麼用緩存

主要從"高性能"和"高并發"這兩點來看待這個問題。
    高性能:使用者第一次通路資料庫中的某些資料,過程會比較慢,因為是從硬碟上讀取的,将該使用者通路的資料存在緩存中,這樣下一次通路這些資料的時候就可以直接從緩存中擷取,如果資料庫中的對應資料改變,同步改變緩存中相應的資料即可。
    高并發: 直接操作緩存能夠承受的請求是遠遠大于直接通路資料庫的,是以我們可以考慮把資料庫中的部分資料轉移到緩存中去,這樣使用者的一部分請求會直接到緩存這裡而不用經過資料庫。
           

4.Redis過期鍵的删除政策

Redis的過期政策就是指當Redis中緩存的key過期了,Redis如何處理有三種處理方式
定時删除:每個key都有一個定時器,到過期時間就立即清除
惰性删除:通路一個key時,才會判斷key是否過期,過期則清理
定期删除:每隔一段時間掃描資料庫的key,并清除其中已過期的key
           

5.如何保證redis中都是熱點資料(記憶體淘汰機制和淘汰政策)

Redis的記憶體淘汰政策是指在Redis緩存内容不足時,需要清理騰出額外的資料空間,在Redis5.0有4類淘汰機制和8種淘汰政策,淘汰政策通過maxmemroy-policy配置。
淘汰機制:
LRU:從資料庫中删除最近最少的通路資料
LFU:淘汰一段時間内使用次數做少的資料
TTL:淘汰設定了過期時間的資料
随機淘汰:随便淘汰

淘汰政策:
no-eviction: 不删除政策。當達到最大記憶體限制時, 如果需要使用更多記憶體,則直接傳回錯誤資訊。(redis預設淘汰政策)
allkeys-lru: 在所有key中優先删除最近最少使用(less recently used ,LRU) 的 key。(最常使用)
allkeys-random: 在所有key中随機删除一部分 key。
allkeys-lfu:與volatile-lfu差不多,資料集從設定過期時間資料變成全體資料。
volatile-lru: 在設定了逾時時間(expire )的key中優先删除最近最少使用(less recently used ,LRU) 的 key。
volatile-random: 在設定了逾時時間(expire)的key中随機删除一部分 key。
volatile-ttl: 在設定了逾時時間(expire )的key中優先删除剩餘時間(time to live,TTL) 短的key。
volatile-lfu:找到已經設定過期時間的資料集,将一段時間内,使用次數最少的資料幹掉。
           

6.Redis為什麼快

1.完全基于記憶體,絕大部分請求是純粹的記憶體操作,非常快速。
    2.資料結構簡單,資料操作也簡單,Redis中的資料結構是專門設計的。
    3.采用單線程,避免了不必要的上下文切換和競争條件, 也不存在多程序或者多線程導緻的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導緻的性能消耗
    4.使用I/O複用模型,非阻塞IO
    5. 使用底層模型不同,它們之間底層實作方式以及與用戶端之間通信的應用協定不一樣,Redis 直接自己建構了 VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求
           

7.緩存雪崩

緩存雪崩是指緩存同一時間大面積的失效,是以,後面的請求都會落到資料庫上,造成資料庫短時間内承受大量請求而崩掉。
解決方案:
緩存資料的過期時間設定随機,防止同一時間大量資料過期現象發生。
一般并發量不是特别多的時候,使用最多的解決方案是加鎖排隊。
給每一個緩存資料增加相應的緩存标記,記錄緩存的是否失效,如果緩存标記失效,則更新資料緩存。
           

8.緩存穿透

緩存穿透是指緩存和資料庫中都沒有的資料,導緻所有的請求都落到資料庫上,造成資料庫短時間内承受大量請求而崩掉。
解決方案
接口層增加校驗,如使用者鑒權校驗,id做基礎校驗,id<=0的直接攔截;
從緩存取不到的資料,在資料庫中也沒有取到,這時也可以将key-value對寫為key-null,緩存有效時間可以設定短點,如30秒(設定太長會導緻正常情況也沒法使用)。這樣可以防止攻擊使用者反複用同一個id暴力攻擊
采用布隆過濾器,将所有可能存在的資料哈希到一個足夠大的 bitmap 中,一個一定不存在的資料會被這個 bitmap 攔截掉,進而避免了對底層存儲系統的查詢壓力
           

9.緩存擊穿

緩存擊穿是指緩存中沒有但資料庫中有的資料(一般是緩存時間到期),這時由于并發使用者特别多,同時讀緩存沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。和緩存雪崩不同的是,緩存擊穿指并發查同一條資料,緩存雪崩是不同資料都過期了,很多資料都查不到進而查資料庫。
解決方案:
    1.設定熱點資料永遠不過期
    2.加互斥鎖
           

10.緩存預熱

緩存預熱就是系統上線後,将相關的緩存資料直接加載到緩存系統。這樣就可以避免在使用者請求的時候,先查詢資料庫,然後再将資料緩存的問題!使用者直接查詢事先被預熱的緩存資料!
           

11.Redis中的資料類型

Stirng類型
            set key value :存入鍵值對
            get key:根據鍵擷取值
            incr key:把值遞增1
            decr key:把值遞減1
            del key:根據鍵删除鍵值對
            setex key timeout value:存入鍵值對,timeout表示失效時間s為機關
            ttl key:查詢目前key多長時間過期


hash類型
            hset key hashkey hashvalue:存入一個hash對象
            hget key hashkey:根據hash對象鍵取出值
            hexists key hashkey:判斷hash對象是否含某個鍵
            hdel key hashkey:根據hashkey删除hash對象鍵值對

list類型
            rpush key value:從清單右邊添加資料
            lpush key value:從清單左邊添加資料
            lpop key:彈出清單最左邊的資料
            rpop key:彈出清單最右邊的資料
            lrange key start end:範圍顯示清單中的資料,全顯設定0 , -1
            llen key:擷取清單長度

set類型
            sadd key value:在set集合中添加元素
            smembers key:列出set集合中的元素
            srem key value:删除set集合中的元素
            spop key count:随機彈出集合中的元素,count設定彈出集合的元素個數

zset類型
                zadd key num name:存入分數和名稱
                zrange key start end:按照分數升序輸出名稱
                zrevrange key start end:按照分數降序輸出名稱
                zincrby key num name:偏移名稱對應的分數
                zrank key name:升序傳回排名
                zrevrank key name:降序傳回排名
                zcard key:傳回元素個數

進階操作
            keys *:傳回所有的鍵
            exists key:判斷是否存在指定的key
            flushdb:清空目前資料庫中的所有鍵值對
           

12.Redis持久化機制

持久化就是把記憶體的資料寫到磁盤中,防止服務當機了記憶體資料丢失
    redis持久化機制分為兩種:
        1.RDB(快照):預設方式将記憶體中以快照的方式寫到二進制檔案中預設是dump.rdb, 通過redis.windows-service.conf配置檔案中Snapshotting的save參數來定義快照的周期。
        2.AOF:将Redis執行的每次指令記錄到單獨的日志檔案中,當重新開機Redis會重新将持久化的日志中檔案恢複資料。
           

繼續閱讀