1.Redis支持的數據類型?java
答:五種,在第一節redis相關的博客我就說過,String,Hash,List,Set,zSet,也就是咱們的字符串,哈希,列表,集合,有序集合五種。結構圖以下。redis
2.什麼是Redis持久化?Redis有哪幾種持久化方式?優缺點是什麼?算法
答:Redis持久化主要分爲三種,RDB、AOF還有咱們的混合持久化,RDB是一個二進制文件,AOF是保存咱們的每一次操做的命令,默認是使用RDB的持久化方式。RDB,二進制文件,速度快,可是數據安全性差,可能形成數據的丟失,AOF,命令文件,速度慢,數據安全性視配置文件而定,相對要更安全一些,數據不容易丟失,BGREWRITEAOF重寫能夠壓縮咱們已有的AOF文件,混合持久化模式就是以RDB和AOF共同使用的。數據庫
3.Redis 有哪些架構模式?講講各自的特色緩存
答:主從模式,通常是一個主節點,一或多個從節點,爲了保證咱們的主節點宕機後,數據不丟失,咱們將主節點的數據備份到從節點,從節點並不進行實際操做,只作實時同步操做,並不能起到高併發的目的。安全
哨兵模式,一個哨兵集羣和一組主從架構組成。比主從更好的是當咱們的主節點宕機之後,哨兵會主動選舉出一個主節點繼續向外提供服務。服務器
集羣架構,由不少個小主從彙集在一塊兒,一塊兒向外提供服務的,將16384個卡槽切分存儲,並非一個強一致性的集羣架構,每個小主從節點內會存在選舉機制,保證對外的高可用架構。網絡
4.Redis經常使用命令?多線程
答:setnx,單次插入,incr,DECR原子加減,lpush列表左側插入,rpush列表右側插入,rpop列表右側移除,blpop key timeout 從列表key的表頭(最左側)彈出第一個元素,sadd集合中添加元素,sismember判斷元素是否在集合中,sinter交集,sunion並集,sdiff差集,zadd有序集合添加元素。架構
5.使用過Redis分佈式鎖麼,它是怎麼實現的?
答:用過度布式鎖,用setnx來簡單實現的,設置setnx,也就是鎖的爭搶,設置成功的即爲拿到鎖的,鎖須要設置最大等待時間,並設置方法內的惟一UUID做爲Value,防止其它線程解鎖。方法結束之後,用finnal來解鎖,須要判斷value值爲當前UUID才能夠解鎖,這樣就簡單實現了一個分佈式的鎖,爲了保證原子性操做能夠採用lua腳原本執行中間判斷步驟。還有很成熟的redisson來設置咱們的分佈式鎖,也解決了咱們上面最大等待時間多久合適的爭議。redisson底層是這樣來作的,咱們設置了一個線程鎖,超時時間好比設置了30秒,方法開始執行,這時redisson會開啓一個分線程,來查詢主線程的方法是否執行完成,大概是沒30/3秒執行一次,即便到了30秒尚未執行完,redisson也不會將鎖釋放掉,會繼續給予鎖10秒的生命時間,來繼續使主線程正常運行,直到時間加到主線程執行完成爲止。
6.使用過Redis作異步隊列麼,你是怎麼用的?有什麼缺點?
答:用過,用列表數據來實現的。大體就是左側進入lpush,右側彈出brpop,或者相反的方向也是能夠的,可是用咱們的redis實現的消息隊列,消息的發佈是無狀態的,沒法保證可達,若訂閱者在發送者發佈消息期間下線,以後咱們再上線將沒法接受到剛纔發送的消息,解決辦法就是使用消息隊列
7.什麼是緩存穿透?如何避免?什麼是緩存雪崩?何如避免?
答:緩存擊穿是指通過緩存層並無獲得咱們想要的數據,請求會向下請求咱們的數據庫,這就是緩存擊穿,咱們能夠在每次請求數據庫返回時作一個保存操做,即便沒有值也保存一下,記得設置好超時時間,如今沒有值,不表明永遠沒有值。
緩存雪崩是指redis宕機形成服務沒法繼續使用,或者大量的命令阻塞的redis,形成假死現象,使得請求直接訪問咱們的數據庫,請求量巨大,可能壓垮咱們的數據服務器,可使用高可用的架構來作redis服務,好比哨兵架構,集羣架構,避免用單機的redis來做爲緩存服務,對於併發量超大的狀況咱們可使用限流的方式來控制。好比hystrix
8.redis的單線程爲何那麼快
答:由於它全部的數據都在內存中,全部的運算都是內存級別的運算,並且單線程避免了多線程的切換中性能損耗的問題。
9.Redis有哪幾種數據淘汰策略?
答:默認策略是volatile-lru,即超過最大內存後,在過時鍵中使用lru算法進行key的剔除,保證不過時數據不被刪除,可是可能會出現OOM問題。
其餘策略以下:
allkeys-lru:根據LRU算法刪除鍵,無論數據有沒有設置超時屬性,直到騰出足夠空間爲止。
allkeys-random:隨機刪除全部鍵,直到騰出足夠空間爲止。
volatile-random: 隨機刪除過時鍵,直到騰出足夠空間爲止。
volatile-ttl:根據鍵值對象的ttl屬性,刪除最近將要過時數據。若是沒有,回退到noeviction策略。
noeviction:不會剔除任何數據,拒絕全部寫入操做並返回客戶端錯誤信息"(error)OOM command not allowed when used memory",此時Redis只響應讀操做。
10.一個字符串類型的值能存儲最大容量是多少?
答:512M,可是並不建議存儲bigKeys的數值,原本就是單線程的redis,若是你使用了bigKey的體積較大的數值可能形成網絡擁塞,同時也影響使用的效率,建議單個鍵值對大小不超過10kb。
11.Redis有哪些適合的場景?
答:文章點贊模型,incr,DECR原子加減來實現,隊列操做lpush和rpop,棧的操做lpush和lpop,關注模型,使用列表的交集並集來推薦可能認識的人,購物車模型,使用哈希存儲來方面存取。
12.Jedis與Redisson對比有什麼優缺點?
答:Jedis是鏈接redis最經常使用的插件,底層用java編寫的,對於redis的單機命令集成的很是好,可是對於一些集羣的操做不是很友好的,而Redisson也是鏈接咱們redis的重要插件,可是集成的redis命令並不理想,可他提供了強大的分佈式鎖供咱們來使用,在分佈式中,相比jedis,redisson表現的更爲出色。
13.Redis中的管道有什麼用?
答:管道就是經過一次網絡請求,一塊兒塞給Redis客戶端多條命令,不存在事務的控制,就是說,當咱們其中的命令報錯了,並不會中斷咱們管道的繼續執行,同時已經執行完的操做,也會持久化下來。
14.談一下redis中的事務
答:redis自身的事務並非很好用的,通常我用Lua腳原本代替Redis的事務。用eval來執行咱們的Lua腳本。
15.Redis如何作內存優化?
答:上述提到過一些優化的方法,好比咱們的鍵最好設置爲見名識意的,可是不要設置的過長,盡力的避免設置bigkey,若是真的沒法避免bigkey,能夠考慮水平拆分。
16.Redis分區有什麼缺點?
答:redis集羣並非一個強一致的集羣,經過CRC16算法分配咱們的16384個卡槽上的,這時可能形成咱們的一些命令失效,好比咱們取得交集,並集等命令,還有咱們的批量get,批量set命令。若是不在一個服務主從集羣上,會形成命令報錯。
最進弄了一個公衆號,小菜技術,歡迎你們的加入