主頁 >  其他 > Redis面試總結&史上最全Redis面試題及答案(轉)

Redis面試總結&史上最全Redis面試題及答案(轉)

2020-12-28 06:26:49 其他

轉載至:https://cloudpai.gitee.io/2018/04/18/2018-04-18-3/

Redis 有哪些資料結構?

字串 String、字典 Hash、串列 List、集合 Set、有序集合 SortedSet,

如果你是 Redis 中高級用戶,還需要加上下面幾種資料結構 HyperLogLog、Geo、Pub/Sub,

如果你說還玩過 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發亮了,

使用過 Redis 分布式鎖么,它是什么回事?

先拿 setnx 來爭搶鎖,搶到之后,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放,

這時候對方會告訴你說你回答得不錯,然后接著問如果在 setnx 之后執行 expire 之前行程意外 crash 或者要重啟維護了,那會怎么樣?

這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了,緊接著你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然后回答:我記得 set 指令有非常復雜的引數,這個應該是可以同時把 setnx 和 expire 合成一條指令來用的!對方這時會顯露笑容,心里開始默念:摁,這小子還不錯,

假如 Redis 里面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?

使用 keys 指令可以掃出指定模式的 key 串列,

對方接著追問:如果這個 redis 正在給線上的業務提供服務,那使用 keys 指令會有什么問題?

這個時候你要回答 redis 關鍵的一個特性:redis 的單執行緒的,keys 指令會導致執行緒阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復,這個時候可以使用 scan 指令,scan 指令可以無阻塞的提取出指定模式的 key 串列,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys 指令長,

使用過 Redis 做異步佇列么,你是怎么用的?

一般使用 list 結構作為佇列,rpush 生產訊息,lpop 消費訊息,當 lpop 沒有訊息的時候,要適當 sleep 一會再重試,

如果對方追問可不可以不用 sleep 呢?list 還有個指令叫 blpop,在沒有訊息的時候,它會阻塞住直到訊息到來,

如果對方追問能不能生產一次消費多次呢?使用 pub/sub 主題訂閱者模式,可以實作 1:N 的訊息佇列,

如果對方追問 pub/sub 有什么缺點?在消費者下線的情況下,生產的訊息會丟失,得使用專業的訊息佇列如 rabbitmq 等,

如果對方追問 redis 如何實作延時佇列?我估計現在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問的這么詳細,但是你很克制,然后神態自若的回答道:使用 sortedset,拿時間戳作為 score,訊息內容作為 key 呼叫 zadd 來生產訊息,消費者用 zrangebyscore 指令獲取 N 秒之前的資料輪詢進行處理,

到這里,面試官暗地里已經對你豎起了大拇指,但是他不知道的是此刻你卻豎起了中指,在椅子背后,

如果有大量的 key 需要設定同一時間過期,一般需要注意什么?

如果大量的 key 過期時間設定的過于集中,到過期的那個時間點,redis 可能會出現短暫的卡頓現象,一般需要在時間上加一個隨機值,使得過期時間分散一些,

Redis 如何做持久化的?

bgsave 做鏡像全量持久化,aof 做增量持久化,因為 bgsave 會耗費較長時間,不夠實時,在停機的時候會導致大量丟失資料,所以需要 aof 來配合使用,在 redis 實體重啟時,會使用 bgsave 持久化檔案重新構建記憶體,再使用 aof 重放近期的操作指令來實作完整恢復重啟之前的狀態,

對方追問那如果突然機器掉電會怎樣?取決于 aof 日志 sync 屬性的配置,如果不要求性能,在每條寫指令時都 sync 一下磁盤,就不會丟失資料,但是在高性能的要求下每次都 sync 是不現實的,一般都使用定時 sync,比如 1s1 次,這個時候最多就會丟失 1s 的資料,

對方追問 bgsave 的原理是什么?你給出兩個詞匯就可以了,fork 和 cow,fork 是指 redis 通過創建子行程來進行 bgsave 操作,cow 指的是 copy on write,子行程創建后,父子行程共享資料段,父行程繼續提供讀寫服務,寫臟的頁面資料會逐漸和子行程分離開來,

Pipeline 有什么好處,為什么要用 pipeline?

可以將多次 IO 往返的時間縮減為一次,前提是 pipeline 執行的指令之間沒有因果相關性,使用 redis-benchmark 進行壓測的時候可以發現影響 redis 的 QPS 峰值的一個重要因素是 pipeline 批次指令的數目,

Redis 的同步機制了解么?

Redis 可以使用主從同步,從從同步,第一次同步時,主節點做一次 bgsave,并同時將后續修改操作記錄到記憶體 buffer,待完成后將 rdb 檔案全量同步到復制節點,復制節點接受完成后將 rdb 鏡像加載到記憶體,加載完成后,再通知主節點將期間修改的操作記錄同步到復制節點進行重放就完成了同步程序,

是否使用過 Redis 集群,集群的原理是什么?

Redis Sentinal 著眼于高可用,在 master 宕機時會自動將 slave 提升為 master,繼續提供服務,

Redis Cluster 著眼于擴展性,在單個 redis 記憶體不足時,使用 Cluster 進行分片存盤,


史上最全Redis面試題及答案

1、什么是Redis?

Redis本質上是一個Key-Value型別的記憶體資料庫,很像memcached,整個資料庫統統加載在記憶體當中進行操作,定期通過異步操作把資料庫資料flush到硬碟上進行保存,因為是純記憶體操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB, Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種資料結構,此外單個value的最大限制是1GB,不像 memcached只能保存1MB的資料,因此Redis可以用來實作很多有用的功能,比方說用他的List來做FIFO雙向鏈表,實作一個輕量級的高性 能訊息佇列服務,用他的Set可以做高性能的tag系統等等,另外Redis也可以對存入的Key-Value設定expire時間,因此也可以被當作一 個功能加強版的memcached來用, Redis的主要缺點是資料庫容量受到物理記憶體的限制,不能用作海量資料的高性能讀寫,因此Redis適合的場景主要局限在較小資料量的高性能操作和運算上,

2、Redis相比memcached有哪些優勢?

(1) memcached所有的值均是簡單的字串,redis作為其替代者,支持更為豐富的資料型別

(2) redis的速度比memcached快很多

(3) redis可以持久化其資料

3、Redis支持哪幾種資料型別?

String、List、Set、Sorted Set、hashes

4、Redis主要消耗什么物理資源?

記憶體,

5、Redis的全稱是什么?

Remote Dictionary Server,

6、Redis有哪幾種資料淘汰策略?

noeviction:回傳錯誤當記憶體限制達到并且客戶端嘗試執行會讓更多記憶體被使用的命令(大部分的寫入指令,但DEL和幾個例外)

allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的資料有空間存放,

volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的資料有空間存放,

allkeys-random: 回收隨機的鍵使得新添加的資料有空間存放,

volatile-random: 回收隨機的鍵使得新添加的資料有空間存放,但僅限于在過期集合的鍵,

volatile-ttl: 回收在過期集合的鍵,并且優先回收存活時間(TTL)較短的鍵,使得新添加的資料有空間存放,

7、Redis官方為什么不提供Windows版本?

因為目前Linux版本已經相當穩定,而且用戶量很大,無需開發windows版本,反而會帶來兼容性等問題,

8、一個字串型別的值能存盤最大容量是多少?

512M

9、為什么Redis需要把所有資料放到記憶體中?

Redis為了達到最快的讀寫速度將資料都讀到記憶體中,并通過異步的方式將資料寫入磁盤,所以redis具有快速和資料持久化的特征,如果不將資料放在記憶體中,磁盤I/O速度為嚴重影響redis的性能,在記憶體越來越便宜的今天,redis將會越來越受歡迎, 如果設定了最大使用的記憶體,則資料已有記錄數達到記憶體限值后不能繼續插入新值,

10、Redis集群方案應該怎么做?都有哪些方案?

  1.twemproxy,大概概念是,它類似于一個代理方式,使用方法和普通redis無任何區別,設定好它下屬的多個redis實體后,使用時在本需要連接redis的地方改為連接twemproxy,它會以一個代理的身份接收請求并使用一致性hash演算法,將請求轉接到具體redis,將結果再回傳twemproxy,使用方式簡便(相對redis只需修改連接埠),對舊專案擴展的首選, 問題:twemproxy自身單埠實體的壓力,使用一致性hash后,對redis節點數量改變時候的計算值的改變,資料無法自動移動到新的節點,

  2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 節點數量改變情況下,舊節點資料可恢復到新hash節點,

  3.redis cluster3.0自帶的集群,特點在于他的分布式演算法不是一致性hash,而是hash槽的概念,以及自身支持節點設定從節點,具體看官方檔案介紹,

  4.在業務代碼層實作,起幾個毫無關聯的redis實體,在代碼層,對key 進行hash計算,然后去對應的redis實體操作資料, 這種方式對hash層代碼要求比較高,考慮部分包括,節點失效后的替代演算法方案,資料震蕩后的自動腳本恢復,實體的監控,等等,

11、Redis集群方案什么情況下會導致整個集群不可用?

有A,B,C三個節點的集群,在沒有復制模型的情況下,如果節點B失敗了,那么整個集群就會以為缺少5501-11000這個范圍的槽而不可用,

12、MySQL里有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料?

redis記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略,

13、Redis有哪些適合的場景?

(1)、會話快取(Session Cache)

最常用的一種使用Redis的情景是會話快取(session cache),用Redis快取會話比其他存盤(如Memcached)的優勢在于:Redis提供持久化,當維護一個不是嚴格要求一致性的快取時,如果用戶的購物車資訊全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?

幸運的是,隨著 Redis 這些年的改進,很容易找到怎么恰當的使用Redis來快取會話的檔案,甚至廣為人知的商業平臺Magento也提供Redis的插件,

(2)、全頁快取(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺,回到一致性問題,即使重啟了Redis實體,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC,

再次以Magento為例,Magento提供一個插件來使用Redis作為全頁快取后端,

此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面,

(3)、佇列

Reids在記憶體存盤引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用,Redis作為佇列使用的操作,就類似于本地程式語言(如Python)對 list 的 push/pop 操作,

如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源專案,這些專案的目的就是利用Redis創建非常好的后端工具,以滿足各種佇列需求,例如,Celery有一個后臺就是使用Redis作為broker,你可以從這里去查看,

(4)、排行榜/計數器

Redis在記憶體中對數字進行遞增或遞減的操作實作的非常好,集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種資料結構,所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:

當然,這是假定你是根據你用戶的分數做遞增的排序,如果你想回傳用戶及用戶的分數,你需要這樣執行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一個很好的例子,用Ruby實作的,它的排行榜就是使用Redis來存盤資料的,你可以在這里看到,

(5)、發布/訂閱

最后(但肯定不是最不重要的)是Redis的發布/訂閱功能,發布/訂閱的使用場景確實非常多,我已看見人們在社交網路連接中使用,還可作為基于發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實),

14、Redis支持的Java客戶端都有哪些?官方推薦用哪個?

Redisson、Jedis、lettuce等等,官方推薦使用Redisson,

15、Redis和Redisson有什么關系?

Redisson是一個高級的分布式協調Redis客服端,能幫助用戶在分布式環境中輕松實作一些Java的物件 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog),

16、Jedis與Redisson對比有什么優缺點?

Jedis是Redis的Java實作的客戶端,其API提供了比較全面的Redis命令的支持;Redisson實作了分布式和可擴展的Java資料結構,和Jedis相比,功能較為簡單,不支持字串操作,不支持排序、事務、管道、磁區等Redis特性,Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上,

17、Redis如何設定密碼及驗證密碼?

設定密碼:config set requirepass 123456

授權密碼:auth 123456

18、說說Redis哈希槽的概念?

Redis集群沒有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節點負責一部分hash槽,

19、Redis集群的主從復制模型是怎樣的?

為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節點都會有N-1個復制品.

20、Redis集群會有寫操作丟失嗎?為什么?

Redis并不能保證資料的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作,

21、Redis集群之間是如何復制的?

異步復制

22、Redis集群最大節點個數是多少?

16384個,

23、Redis集群如何選擇資料庫?

Redis集群目前無法做資料庫選擇,默認在0資料庫,

24、怎么測驗Redis的連通性?

ping

25、Redis中的管道有什么用?

一次請求/回應服務器能實作處理新的請求即使舊的請求還未被回應,這樣就可以將多個命令發送到服務器,而不用等待回復,最后在一個步驟中讀取該答復,

這就是管道(pipelining),是一種幾十年來廣泛使用的技術,例如許多POP3協議已經實作支持這個功能,大大加快了從服務器下載新郵件的程序,

26、怎么理解Redis事務?

事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行,事務在執行的程序中,不會被其他客戶端發送來的命令請求所打斷,

事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行,

27、Redis事務相關的命令有哪幾個?

MULTI、EXEC、DISCARD、WATCH

28、Redis key的過期時間和永久有效分別怎么設定?

EXPIRE和PERSIST命令,

29、Redis如何做記憶體優化?

盡可能使用散串列(hashes),散串列(是說散串列里面存盤的數少)使用的記憶體非常小,所以你應該盡可能的將你的資料模型抽象到一個散串列里面,比如你的web系統中有一個用戶物件,不要為這個用戶的名稱,姓氏,郵箱,密碼設定單獨的key,而是應該把這個用戶的所有資訊存盤到一張散串列里面.

30、Redis回收行程如何作業的?

一個客戶端運行了新的命令,添加了新的資料,
Redi檢查記憶體使用情況,如果大于maxmemory的限制, 則根據設定好的策略進行回收,
一個新的命令被執行,等等,
所以我們不斷地穿越記憶體限制的邊界,通過不斷達到邊界然后不斷地回識訓到邊界以下,
如果一個命令的結果導致大量記憶體被使用(例如很大的集合的交集保存到一個新的鍵),不用多久記憶體限制就會被這個記憶體使用量超越,

31、Redis回收使用的是什么演算法?

LRU演算法

32、Redis如何做大量資料插入?

Redis2.6開始redis-cli支持一種新的被稱之為pipe mode的新模式用于執行大量資料插入作業,

33、為什么要做Redis磁區?

磁區可以讓Redis管理更大的記憶體,Redis將可以使用所有機器的記憶體,如果沒有磁區,你最多只能使用一臺機器的記憶體,磁區使Redis的計算能力通過簡單地增加計算機得到成倍提升,Redis的網路帶寬也會隨著計算機和網卡的增加而成倍增長,

34、你知道有哪些Redis磁區實作方案?

客戶端磁區就是在客戶端就已經決定資料會被存盤到哪個redis節點或者從哪個redis節點讀取,大多數客戶端已經實作了客戶端磁區,

代理磁區 意味著客戶端將請求發送給代理,然后代理決定去哪個節點寫資料或者讀資料,代理根據磁區規則決定請求哪些Redis實體,然后根據Redis的回應結果回傳給客戶端,redis和memcached的一種代理實作就是Twemproxy

查詢路由(Query routing) 的意思是客戶端隨機地請求任意一個redis實體,然后由Redis將請求轉發給正確的Redis節點,Redis Cluster實作了一種混合形式的查詢路由,但并不是直接將請求從一個redis節點轉發到另一個redis節點,而是在客戶端的幫助下直接redirected到正確的redis節點,

35、Redis磁區有什么缺點?

涉及多個key的操作通常不會被支持,例如你不能對兩個集合求交集,因為他們可能被存盤到不同的Redis實體(實際上這種情況也有辦法,但是不能直接使用交集指令),
同時操作多個key,則不能使用Redis事務.
磁區使用的粒度是key,不能使用一個非常長的排序key存盤一個資料集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set).
當使用磁區的時候,資料處理會非常復雜,例如為了備份你必須從不同的Redis實體和主機同時收集RDB / AOF檔案,
磁區時動態擴容或縮容可能非常復雜,Redis集群在運行時增加或者洗掉Redis節點,能做到最大程度對用戶透明地資料再平衡,但其他一些客戶端磁區或者代理磁區方法則不支持這種特性,然而,有一種預分片的技術也可以較好的解決這個問題,


36、Redis持久化資料和快取怎么做擴容?

如果Redis被當做快取使用,使用一致性哈希實作動態擴容縮容,
如果Redis被當做一個持久化存盤使用,必須使用固定的keys-to-nodes映射關系,節點的數量一旦確定不能變化,否則的話(即Redis節點需要動態變化的情況),必須使用可以在運行時進行資料再平衡的一套系統,而當前只有Redis集群可以做到這樣,

37、分布式Redis是前期做還是后期規模上來了再做好?為什么?

既然Redis是如此的輕量(單實體只使用1M記憶體),為防止以后的擴容,最好的辦法就是一開始就啟動較多實體,即便你只有一臺服務器,你也可以一開始就讓Redis以分布式的方式運行,使用磁區,在同一臺服務器上啟動多個實體,

一開始就多設定幾個Redis實體,例如32或者64個實體,對大多數用戶來說這操作起來可能比較麻煩,但是從長久來看做這點犧牲是值得的,

這樣的話,當你的資料不斷增長,需要更多的Redis服務器時,你需要做的就是僅僅將Redis實體從一臺服務遷移到另外一臺服務器而已(而不用考慮重新磁區的問題),一旦你添加了另一臺服務器,你需要將你一半的Redis實體從第一臺機器遷移到第二臺機器,

38、Twemproxy是什么?

Twemproxy是Twitter維護的(快取)代理系統,代理Memcached的ASCII協議和Redis協議,它是單執行緒程式,使用c語言撰寫,運行起來非常快,它是采用Apache 2.0 license的開源軟體, Twemproxy支持自動磁區,如果其代理的其中一個Redis節點不可用時,會自動將該節點排除(這將改變原來的keys-instances的映射關系,所以你應該僅在把Redis當快取時使用Twemproxy), Twemproxy本身不存在單點問題,因為你可以啟動多個Twemproxy實體,然后讓你的客戶端去連接任意一個Twemproxy實體, Twemproxy是Redis客戶端和服務器端的一個中間層,由它來處理磁區功能應該不算復雜,并且應該算比較可靠的,

39、支持一致性哈希的客戶端有哪些?

Redis-rb、Predis等,

40、Redis與其他key-value存盤有什么不同?

Redis有著更為復雜的資料結構并且提供對他們的原子性操作,這是一個不同于其他資料庫的進化路徑,Redis的資料型別都是基于基本資料結構的同時對程式員透明,無需進行額外的抽象,
Redis運行在記憶體中但是可以持久化到磁盤,所以在對不同資料集進行高速讀寫時需要權衡記憶體,應為資料量不能大于硬體記憶體,在記憶體資料庫方面的另一個優點是, 相比在磁盤上相同的復雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情, 同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們并不需要進行隨機訪問,

41、Redis的記憶體占用情況怎么樣?

給你舉個例子: 100萬個鍵值對(鍵是0到999999值是字串“hello world”)在我的32位的Mac筆記本上 用了100MB,同樣的資料放到一個key里只需要16MB, 這是因為鍵值有一個很大的開銷, 在Memcached上執行也是類似的結果,但是相對Redis的開銷要小一點點,因為Redis會記錄型別資訊參考計數等等,

當然,大鍵值對時兩者的比例要好很多,

64位的系統比32位的需要更多的記憶體開銷,尤其是鍵值對都較小時,這是因為64位的系統里指標占用了8個位元組, 但是,當然,64位系統支持更大的記憶體,所以為了運行大型的Redis服務器或多或少的需要使用64位的系統,

42、都有哪些辦法可以降低Redis的記憶體使用情況呢?

如果你使用的是32位的Redis實體,可以好好利用Hash,list,sorted set,set等集合型別資料,因為通常情況下很多小的Key-Value可以用更緊湊的方式存放到一起,

43、查看Redis使用情況及狀態資訊用什么命令?

info

44、Redis的記憶體用完了會發生什么?

如果達到設定的上限,Redis的寫命令會回傳錯誤資訊(但是讀命令還可以正常回傳,)或者你可以將Redis當快取來使用配置淘汰機制,當Redis達到記憶體上限時會沖刷掉舊的內容,

45、Redis是單執行緒的,如何提高多核CPU的利用率?

可以在同一個服務器部署多個Redis的實體,并把他們當作不同的服務器來使用,在某些時候,無論如何一個服務器是不夠的, 所以,如果你想使用多個CPU,你可以考慮一下分片(shard),

46、一個Redis實體最多能存放多少的keys?List、Set、Sorted Set他們最多能存放多少元素?

理論上Redis可以處理多達232的keys,并且在實際中進行了測驗,每個實體至少存放了2億5千萬的keys,我們正在測驗一些較大的值,

任何list、set、和sorted set都可以放232個元素,

換句話說,Redis的存盤極限是系統中的可用記憶體值,

47、Redis常見性能問題和解決方案?

(1) Master最好不要做任何持久化作業,如RDB記憶體快照和AOF日志檔案

(2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

(3) 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個局域網內

(4) 盡量避免在壓力很大的主庫上增加從庫

(5) 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3…

這樣的結構方便解決單點故障問題,實作Slave對Master的替換,如果Master掛了,可以立刻啟用Slave1做Master,其他不變,

48、Redis提供了哪幾種持久化方式?

RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照存盤.
AOF持久化方式記錄每次對服務器寫的操作,當服務器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加保存每次寫的操作到檔案末尾.Redis還能對AOF檔案進行后臺重寫,使得AOF檔案的體積不至于過大.
如果你只希望你的資料在服務器運行的時候存在,你也可以不使用任何持久化方式.
你也可以同時開啟兩種持久化方式, 在這種情況下, 當redis重啟的時候會優先載入AOF檔案來恢復原始的資料,因為在通常情況下AOF檔案保存的資料集要比RDB檔案保存的資料集要完整.
最重要的事情是了解RDB和AOF持久化方式的不同,讓我們以RDB持久化方式開始,

49、如何選擇合適的持久化方式?

一般來說, 如果想達到足以媲美PostgreSQL的資料安全性, 你應該同時使用兩種持久化功能,如果你非常關心你的資料, 但仍然可以承受數分鐘以內的資料丟失,那么你可以只使用RDB持久化,

有很多用戶都只使用AOF持久化,但并不推薦這種方式:因為定時生成RDB快照(snapshot)非常便于進行資料庫備份, 并且 RDB 恢復資料集的速度也要比AOF恢復的速度要快,除此之外, 使用RDB還可以避免之前提到的AOF程式的bug,

50、修改配置不重啟Redis會實時生效嗎?

針對運行實體,有許多配置選項可以通過 CONFIG SET 命令進行修改,而無需執行任何形式的重啟, 從 Redis 2.2 開始,可以從 AOF 切換到 RDB 的快照持久性或其他方式而不需要重啟 Redis,檢索 ‘CONFIG GET *’ 命令獲取更多資訊,

但偶爾重新啟動是必須的,如為升級 Redis 程式到新的版本,或者當你需要修改某些目前 CONFIG 命令還不支持的配置引數的時候,

Redis 有哪些資料結構?

字串 String、字典 Hash、串列 List、集合 Set、有序集合 SortedSet,

如果你是 Redis 中高級用戶,還需要加上下面幾種資料結構 HyperLogLog、Geo、Pub/Sub,

如果你說還玩過 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發亮了,

使用過 Redis 分布式鎖么,它是什么回事?

先拿 setnx 來爭搶鎖,搶到之后,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放,

這時候對方會告訴你說你回答得不錯,然后接著問如果在 setnx 之后執行 expire 之前行程意外 crash 或者要重啟維護了,那會怎么樣?

這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了,緊接著你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然后回答:我記得 set 指令有非常復雜的引數,這個應該是可以同時把 setnx 和 expire 合成一條指令來用的!對方這時會顯露笑容,心里開始默念:摁,這小子還不錯,

假如 Redis 里面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?

使用 keys 指令可以掃出指定模式的 key 串列,

對方接著追問:如果這個 redis 正在給線上的業務提供服務,那使用 keys 指令會有什么問題?

這個時候你要回答 redis 關鍵的一個特性:redis 的單執行緒的,keys 指令會導致執行緒阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復,這個時候可以使用 scan 指令,scan 指令可以無阻塞的提取出指定模式的 key 串列,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys 指令長,

使用過 Redis 做異步佇列么,你是怎么用的?

一般使用 list 結構作為佇列,rpush 生產訊息,lpop 消費訊息,當 lpop 沒有訊息的時候,要適當 sleep 一會再重試,

如果對方追問可不可以不用 sleep 呢?list 還有個指令叫 blpop,在沒有訊息的時候,它會阻塞住直到訊息到來,

如果對方追問能不能生產一次消費多次呢?使用 pub/sub 主題訂閱者模式,可以實作 1:N 的訊息佇列,

如果對方追問 pub/sub 有什么缺點?在消費者下線的情況下,生產的訊息會丟失,得使用專業的訊息佇列如 rabbitmq 等,

如果對方追問 redis 如何實作延時佇列?我估計現在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問的這么詳細,但是你很克制,然后神態自若的回答道:使用 sortedset,拿時間戳作為 score,訊息內容作為 key 呼叫 zadd 來生產訊息,消費者用 zrangebyscore 指令獲取 N 秒之前的資料輪詢進行處理,

到這里,面試官暗地里已經對你豎起了大拇指,但是他不知道的是此刻你卻豎起了中指,在椅子背后,

如果有大量的 key 需要設定同一時間過期,一般需要注意什么?

如果大量的 key 過期時間設定的過于集中,到過期的那個時間點,redis 可能會出現短暫的卡頓現象,一般需要在時間上加一個隨機值,使得過期時間分散一些,

Redis 如何做持久化的?

bgsave 做鏡像全量持久化,aof 做增量持久化,因為 bgsave 會耗費較長時間,不夠實時,在停機的時候會導致大量丟失資料,所以需要 aof 來配合使用,在 redis 實體重啟時,會使用 bgsave 持久化檔案重新構建記憶體,再使用 aof 重放近期的操作指令來實作完整恢復重啟之前的狀態,

對方追問那如果突然機器掉電會怎樣?取決于 aof 日志 sync 屬性的配置,如果不要求性能,在每條寫指令時都 sync 一下磁盤,就不會丟失資料,但是在高性能的要求下每次都 sync 是不現實的,一般都使用定時 sync,比如 1s1 次,這個時候最多就會丟失 1s 的資料,

對方追問 bgsave 的原理是什么?你給出兩個詞匯就可以了,fork 和 cow,fork 是指 redis 通過創建子行程來進行 bgsave 操作,cow 指的是 copy on write,子行程創建后,父子行程共享資料段,父行程繼續提供讀寫服務,寫臟的頁面資料會逐漸和子行程分離開來,

Pipeline 有什么好處,為什么要用 pipeline?

可以將多次 IO 往返的時間縮減為一次,前提是 pipeline 執行的指令之間沒有因果相關性,使用 redis-benchmark 進行壓測的時候可以發現影響 redis 的 QPS 峰值的一個重要因素是 pipeline 批次指令的數目,

Redis 的同步機制了解么?

Redis 可以使用主從同步,從從同步,第一次同步時,主節點做一次 bgsave,并同時將后續修改操作記錄到記憶體 buffer,待完成后將 rdb 檔案全量同步到復制節點,復制節點接受完成后將 rdb 鏡像加載到記憶體,加載完成后,再通知主節點將期間修改的操作記錄同步到復制節點進行重放就完成了同步程序,

是否使用過 Redis 集群,集群的原理是什么?

Redis Sentinal 著眼于高可用,在 master 宕機時會自動將 slave 提升為 master,繼續提供服務,

Redis Cluster 著眼于擴展性,在單個 redis 記憶體不足時,使用 Cluster 進行分片存盤,


史上最全Redis面試題及答案

1、什么是Redis?

Redis本質上是一個Key-Value型別的記憶體資料庫,很像memcached,整個資料庫統統加載在記憶體當中進行操作,定期通過異步操作把資料庫資料flush到硬碟上進行保存,因為是純記憶體操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB, Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種資料結構,此外單個value的最大限制是1GB,不像 memcached只能保存1MB的資料,因此Redis可以用來實作很多有用的功能,比方說用他的List來做FIFO雙向鏈表,實作一個輕量級的高性 能訊息佇列服務,用他的Set可以做高性能的tag系統等等,另外Redis也可以對存入的Key-Value設定expire時間,因此也可以被當作一 個功能加強版的memcached來用, Redis的主要缺點是資料庫容量受到物理記憶體的限制,不能用作海量資料的高性能讀寫,因此Redis適合的場景主要局限在較小資料量的高性能操作和運算上,

2、Redis相比memcached有哪些優勢?

(1) memcached所有的值均是簡單的字串,redis作為其替代者,支持更為豐富的資料型別

(2) redis的速度比memcached快很多

(3) redis可以持久化其資料

3、Redis支持哪幾種資料型別?

String、List、Set、Sorted Set、hashes

4、Redis主要消耗什么物理資源?

記憶體,

5、Redis的全稱是什么?

Remote Dictionary Server,

6、Redis有哪幾種資料淘汰策略?

noeviction:回傳錯誤當記憶體限制達到并且客戶端嘗試執行會讓更多記憶體被使用的命令(大部分的寫入指令,但DEL和幾個例外)

allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的資料有空間存放,

volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的資料有空間存放,

allkeys-random: 回收隨機的鍵使得新添加的資料有空間存放,

volatile-random: 回收隨機的鍵使得新添加的資料有空間存放,但僅限于在過期集合的鍵,

volatile-ttl: 回收在過期集合的鍵,并且優先回收存活時間(TTL)較短的鍵,使得新添加的資料有空間存放,

7、Redis官方為什么不提供Windows版本?

因為目前Linux版本已經相當穩定,而且用戶量很大,無需開發windows版本,反而會帶來兼容性等問題,

8、一個字串型別的值能存盤最大容量是多少?

512M

9、為什么Redis需要把所有資料放到記憶體中?

Redis為了達到最快的讀寫速度將資料都讀到記憶體中,并通過異步的方式將資料寫入磁盤,所以redis具有快速和資料持久化的特征,如果不將資料放在記憶體中,磁盤I/O速度為嚴重影響redis的性能,在記憶體越來越便宜的今天,redis將會越來越受歡迎, 如果設定了最大使用的記憶體,則資料已有記錄數達到記憶體限值后不能繼續插入新值,

10、Redis集群方案應該怎么做?都有哪些方案?

1.twemproxy,大概概念是,它類似于一個代理方式,使用方法和普通redis無任何區別,設定好它下屬的多個redis實體后,使用時在本需要連接redis的地方改為連接twemproxy,它會以一個代理的身份接收請求并使用一致性hash演算法,將請求轉接到具體redis,將結果再回傳twemproxy,使用方式簡便(相對redis只需修改連接埠),對舊專案擴展的首選, 問題:twemproxy自身單埠實體的壓力,使用一致性hash后,對redis節點數量改變時候的計算值的改變,資料無法自動移動到新的節點,

2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 節點數量改變情況下,舊節點資料可恢復到新hash節點,

3.redis cluster3.0自帶的集群,特點在于他的分布式演算法不是一致性hash,而是hash槽的概念,以及自身支持節點設定從節點,具體看官方檔案介紹,

4.在業務代碼層實作,起幾個毫無關聯的redis實體,在代碼層,對key 進行hash計算,然后去對應的redis實體操作資料, 這種方式對hash層代碼要求比較高,考慮部分包括,節點失效后的替代演算法方案,資料震蕩后的自動腳本恢復,實體的監控,等等,

11、Redis集群方案什么情況下會導致整個集群不可用?

有A,B,C三個節點的集群,在沒有復制模型的情況下,如果節點B失敗了,那么整個集群就會以為缺少5501-11000這個范圍的槽而不可用,

12、MySQL里有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料?

redis記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略,

13、Redis有哪些適合的場景?

(1)、會話快取(Session Cache)

最常用的一種使用Redis的情景是會話快取(session cache),用Redis快取會話比其他存盤(如Memcached)的優勢在于:Redis提供持久化,當維護一個不是嚴格要求一致性的快取時,如果用戶的購物車資訊全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?

幸運的是,隨著 Redis 這些年的改進,很容易找到怎么恰當的使用Redis來快取會話的檔案,甚至廣為人知的商業平臺Magento也提供Redis的插件,

(2)、全頁快取(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平臺,回到一致性問題,即使重啟了Redis實體,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似PHP本地FPC,

再次以Magento為例,Magento提供一個插件來使用Redis作為全頁快取后端,

此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面,

(3)、佇列

Reids在記憶體存盤引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用,Redis作為佇列使用的操作,就類似于本地程式語言(如Python)對 list 的 push/pop 操作,

如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源專案,這些專案的目的就是利用Redis創建非常好的后端工具,以滿足各種佇列需求,例如,Celery有一個后臺就是使用Redis作為broker,你可以從這里去查看,

(4),排行榜/計數器

Redis在記憶體中對數字進行遞增或遞減的操作實作的非常好,集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種資料結構,所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執行即可:

當然,這是假定你是根據你用戶的分數做遞增的排序,如果你想回傳用戶及用戶的分數,你需要這樣執行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一個很好的例子,用Ruby實作的,它的排行榜就是使用Redis來存盤資料的,你可以在這里看到,

(5)、發布/訂閱

最后(但肯定不是最不重要的)是Redis的發布/訂閱功能,發布/訂閱的使用場景確實非常多,我已看見人們在社交網路連接中使用,還可作為基于發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實),

14、Redis支持的Java客戶端都有哪些?官方推薦用哪個?

Redisson、Jedis、lettuce等等,官方推薦使用Redisson,

15、Redis和Redisson有什么關系?

Redisson是一個高級的分布式協調Redis客服端,能幫助用戶在分布式環境中輕松實作一些Java的物件 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog),

16、Jedis與Redisson對比有什么優缺點?

Jedis是Redis的Java實作的客戶端,其API提供了比較全面的Redis命令的支持;Redisson實作了分布式和可擴展的Java資料結構,和Jedis相比,功能較為簡單,不支持字串操作,不支持排序、事務、管道、磁區等Redis特性,Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上,

17、Redis如何設定密碼及驗證密碼?

設定密碼:config set requirepass 123456

授權密碼:auth 123456

18、說說Redis哈希槽的概念?

Redis集群沒有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節點負責一部分hash槽,

19、Redis集群的主從復制模型是怎樣的?

為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節點都會有N-1個復制品.

20、Redis集群會有寫操作丟失嗎?為什么?

Redis并不能保證資料的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作,

21、Redis集群之間是如何復制的?

異步復制

22、Redis集群最大節點個數是多少?

16384個,

23、Redis集群如何選擇資料庫?

Redis集群目前無法做資料庫選擇,默認在0資料庫,

24、怎么測驗Redis的連通性?

ping

25、Redis中的管道有什么用?

一次請求/回應服務器能實作處理新的請求即使舊的請求還未被回應,這樣就可以將多個命令發送到服務器,而不用等待回復,最后在一個步驟中讀取該答復,

這就是管道(pipelining),是一種幾十年來廣泛使用的技術,例如許多POP3協議已經實作支持這個功能,大大加快了從服務器下載新郵件的程序,

26、怎么理解Redis事務?

事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行,事務在執行的程序中,不會被其他客戶端發送來的命令請求所打斷,

事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行,

27、Redis事務相關的命令有哪幾個?

MULTI、EXEC、DISCARD、WATCH

28、Redis key的過期時間和永久有效分別怎么設定?

EXPIRE和PERSIST命令,

29、Redis如何做記憶體優化?

盡可能使用散串列(hashes),散串列(是說散串列里面存盤的數少)使用的記憶體非常小,所以你應該盡可能的將你的資料模型抽象到一個散串列里面,比如你的web系統中有一個用戶物件,不要為這個用戶的名稱,姓氏,郵箱,密碼設定單獨的key,而是應該把這個用戶的所有資訊存盤到一張散串列里面.

30、Redis回收行程如何作業的?

一個客戶端運行了新的命令,添加了新的資料,
Redi檢查記憶體使用情況,如果大于maxmemory的限制, 則根據設定好的策略進行回收,
一個新的命令被執行,等等,
所以我們不斷地穿越記憶體限制的邊界,通過不斷達到邊界然后不斷地回識訓到邊界以下,
如果一個命令的結果導致大量記憶體被使用(例如很大的集合的交集保存到一個新的鍵),不用多久記憶體限制就會被這個記憶體使用量超越,

31、Redis回收使用的是什么演算法?

LRU演算法

32、Redis如何做大量資料插入?

Redis2.6開始redis-cli支持一種新的被稱之為pipe mode的新模式用于執行大量資料插入作業,

33、為什么要做Redis磁區?

磁區可以讓Redis管理更大的記憶體,Redis將可以使用所有機器的記憶體,如果沒有磁區,你最多只能使用一臺機器的記憶體,磁區使Redis的計算能力通過簡單地增加計算機得到成倍提升,Redis的網路帶寬也會隨著計算機和網卡的增加而成倍增長,

34、你知道有哪些Redis磁區實作方案?

客戶端磁區就是在客戶端就已經決定資料會被存盤到哪個redis節點或者從哪個redis節點讀取,大多數客戶端已經實作了客戶端磁區,

代理磁區 意味著客戶端將請求發送給代理,然后代理決定去哪個節點寫資料或者讀資料,代理根據磁區規則決定請求哪些Redis實體,然后根據Redis的回應結果回傳給客戶端,redis和memcached的一種代理實作就是Twemproxy

查詢路由(Query routing) 的意思是客戶端隨機地請求任意一個redis實體,然后由Redis將請求轉發給正確的Redis節點,Redis Cluster實作了一種混合形式的查詢路由,但并不是直接將請求從一個redis節點轉發到另一個redis節點,而是在客戶端的幫助下直接redirected到正確的redis節點,

35、Redis磁區有什么缺點?

涉及多個key的操作通常不會被支持,例如你不能對兩個集合求交集,因為他們可能被存盤到不同的Redis實體(實際上這種情況也有辦法,但是不能直接使用交集指令),
同時操作多個key,則不能使用Redis事務.
磁區使用的粒度是key,不能使用一個非常長的排序key存盤一個資料集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set).
當使用磁區的時候,資料處理會非常復雜,例如為了備份你必須從不同的Redis實體和主機同時收集RDB / AOF檔案,
磁區時動態擴容或縮容可能非常復雜,Redis集群在運行時增加或者洗掉Redis節點,能做到最大程度對用戶透明地資料再平衡,但其他一些客戶端磁區或者代理磁區方法則不支持這種特性,然而,有一種預分片的技術也可以較好的解決這個問題,
36、Redis持久化資料和快取怎么做擴容?

如果Redis被當做快取使用,使用一致性哈希實作動態擴容縮容,
如果Redis被當做一個持久化存盤使用,必須使用固定的keys-to-nodes映射關系,節點的數量一旦確定不能變化,否則的話(即Redis節點需要動態變化的情況),必須使用可以在運行時進行資料再平衡的一套系統,而當前只有Redis集群可以做到這樣,
37、分布式Redis是前期做還是后期規模上來了再做好?為什么?

既然Redis是如此的輕量(單實體只使用1M記憶體),為防止以后的擴容,最好的辦法就是一開始就啟動較多實體,即便你只有一臺服務器,你也可以一開始就讓Redis以分布式的方式運行,使用磁區,在同一臺服務器上啟動多個實體,

一開始就多設定幾個Redis實體,例如32或者64個實體,對大多數用戶來說這操作起來可能比較麻煩,但是從長久來看做這點犧牲是值得的,

這樣的話,當你的資料不斷增長,需要更多的Redis服務器時,你需要做的就是僅僅將Redis實體從一臺服務遷移到另外一臺服務器而已(而不用考慮重新磁區的問題),一旦你添加了另一臺服務器,你需要將你一半的Redis實體從第一臺機器遷移到第二臺機器,

38、Twemproxy是什么?

Twemproxy是Twitter維護的(快取)代理系統,代理Memcached的ASCII協議和Redis協議,它是單執行緒程式,使用c語言撰寫,運行起來非常快,它是采用Apache 2.0 license的開源軟體, Twemproxy支持自動磁區,如果其代理的其中一個Redis節點不可用時,會自動將該節點排除(這將改變原來的keys-instances的映射關系,所以你應該僅在把Redis當快取時使用Twemproxy), Twemproxy本身不存在單點問題,因為你可以啟動多個Twemproxy實體,然后讓你的客戶端去連接任意一個Twemproxy實體, Twemproxy是Redis客戶端和服務器端的一個中間層,由它來處理磁區功能應該不算復雜,并且應該算比較可靠的,

39、支持一致性哈希的客戶端有哪些?

Redis-rb、Predis等,

40、Redis與其他key-value存盤有什么不同?

Redis有著更為復雜的資料結構并且提供對他們的原子性操作,這是一個不同于其他資料庫的進化路徑,Redis的資料型別都是基于基本資料結構的同時對程式員透明,無需進行額外的抽象,
Redis運行在記憶體中但是可以持久化到磁盤,所以在對不同資料集進行高速讀寫時需要權衡記憶體,應為資料量不能大于硬體記憶體,在記憶體資料庫方面的另一個優點是, 相比在磁盤上相同的復雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情, 同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們并不需要進行隨機訪問,
41、Redis的記憶體占用情況怎么樣?

給你舉個例子: 100萬個鍵值對(鍵是0到999999值是字串“hello world”)在我的32位的Mac筆記本上 用了100MB,同樣的資料放到一個key里只需要16MB, 這是因為鍵值有一個很大的開銷, 在Memcached上執行也是類似的結果,但是相對Redis的開銷要小一點點,因為Redis會記錄型別資訊參考計數等等,

當然,大鍵值對時兩者的比例要好很多,

64位的系統比32位的需要更多的記憶體開銷,尤其是鍵值對都較小時,這是因為64位的系統里指標占用了8個位元組, 但是,當然,64位系統支持更大的記憶體,所以為了運行大型的Redis服務器或多或少的需要使用64位的系統,

42、都有哪些辦法可以降低Redis的記憶體使用情況呢?

如果你使用的是32位的Redis實體,可以好好利用Hash,list,sorted set,set等集合型別資料,因為通常情況下很多小的Key-Value可以用更緊湊的方式存放到一起,

43、查看Redis使用情況及狀態資訊用什么命令?

info

44、Redis的記憶體用完了會發生什么?

如果達到設定的上限,Redis的寫命令會回傳錯誤資訊(但是讀命令還可以正常回傳,)或者你可以將Redis當快取來使用配置淘汰機制,當Redis達到記憶體上限時會沖刷掉舊的內容,

45、Redis是單執行緒的,如何提高多核CPU的利用率?

可以在同一個服務器部署多個Redis的實體,并把他們當作不同的服務器來使用,在某些時候,無論如何一個服務器是不夠的, 所以,如果你想使用多個CPU,你可以考慮一下分片(shard),

46、一個Redis實體最多能存放多少的keys?List、Set、Sorted Set他們最多能存放多少元素?

理論上Redis可以處理多達232的keys,并且在實際中進行了測驗,每個實體至少存放了2億5千萬的keys,我們正在測驗一些較大的值,

任何list、set、和sorted set都可以放232個元素,

換句話說,Redis的存盤極限是系統中的可用記憶體值,

47、Redis常見性能問題和解決方案?

(1) Master最好不要做任何持久化作業,如RDB記憶體快照和AOF日志檔案

(2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

(3) 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個局域網內

(4) 盡量避免在壓力很大的主庫上增加從庫

(5) 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3…

這樣的結構方便解決單點故障問題,實作Slave對Master的替換,如果Master掛了,可以立刻啟用Slave1做Master,其他不變,

48、Redis提供了哪幾種持久化方式?

RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照存盤.
AOF持久化方式記錄每次對服務器寫的操作,當服務器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加保存每次寫的操作到檔案末尾.Redis還能對AOF檔案進行后臺重寫,使得AOF檔案的體積不至于過大.
如果你只希望你的資料在服務器運行的時候存在,你也可以不使用任何持久化方式.
你也可以同時開啟兩種持久化方式, 在這種情況下, 當redis重啟的時候會優先載入AOF檔案來恢復原始的資料,因為在通常情況下AOF檔案保存的資料集要比RDB檔案保存的資料集要完整.
最重要的事情是了解RDB和AOF持久化方式的不同,讓我們以RDB持久化方式開始,
49、如何選擇合適的持久化方式?

一般來說, 如果想達到足以媲美PostgreSQL的資料安全性, 你應該同時使用兩種持久化功能,如果你非常關心你的資料, 但仍然可以承受數分鐘以內的資料丟失,那么你可以只使用RDB持久化,

有很多用戶都只使用AOF持久化,但并不推薦這種方式:因為定時生成RDB快照(snapshot)非常便于進行資料庫備份, 并且 RDB 恢復資料集的速度也要比AOF恢復的速度要快,除此之外, 使用RDB還可以避免之前提到的AOF程式的bug,

50、修改配置不重啟Redis會實時生效嗎?

針對運行實體,有許多配置選項可以通過 CONFIG SET 命令進行修改,而無需執行任何形式的重啟, 從 Redis 2.2 開始,可以從 AOF 切換到 RDB 的快照持久性或其他方式而不需要重啟 Redis,檢索 ‘CONFIG GET *’ 命令獲取更多資訊,

但偶爾重新啟動是必須的,如為升級 Redis 程式到新的版本,或者當你需要修改某些目前 CONFIG 命令還不支持的配置引數的時候,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241261.html

標籤:其他

上一篇:如果程式員在放假的時候來做元旦設計,會變成什么樣?

下一篇:開源容器引擎分析;替代docker的容器選擇;容器運行時架構

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more