Redis,全稱 Remote Dictionary Server,是一個基於內存的高性能 Key-Value 數據庫。html
另外,Redis 已經成爲互聯網公司在緩存組件選擇的惟一,更多的關注點是,如何使用好 Redis 。java
一、速度快node
由於數據存在內存中,相似於 HashMap ,HashMap 的優點就是查找和操做的時間複雜度都是O (1) 。git
Redis 本質上是一個 Key-Value 類型的內存數據庫,很像Memcached ,整個數據庫通通加載在內存當中進行操做,按期經過異步操做把數據庫數據 flush 到硬盤上進行保存。github
由於是純內存操做,Redis 的性能很是出色,每秒能夠處理超過 10 萬次讀寫操做,是已知性能最快的 Key-Value 數據庫。面試
二、支持豐富數據類型redis
支持 String ,List,Set,Sorted Set,Hash 。算法
Redis 的出色之處不只僅是性能,Redis 最大的魅力是支持保存多種數據結構,此外單個 Value 的最大限制是1GB,不像 Memcached只能保存1MB的數據,所以Redis能夠用來實現不少有用的功能。比方說:數據庫
- 用他的 List 來作 FIFO 雙向鏈表,實現一個輕量級的高性能消息隊列服務。
- 用他的 Set 能夠作高性能的 tag 系統等等。
三、豐富的特性緩存
而且在 Redis 5.0 增長了 Stream 功能,一個新的強大的支持多播的可持久化的消息隊列,提供相似 Kafka 的功能。
四、持久化存儲
Redis 提供 RDB 和 AOF 兩種數據的持久化存儲方案,解決內存數據庫最擔憂的萬一 Redis 掛掉,數據會消失掉。
因爲 Redis 是內存數據庫,因此,單臺機器,存儲的數據量,跟機器自己的內存大小。雖然 Redis 自己有 Key 過時策略,可是仍是須要提早預估和節約內存。若是內存增加過快,須要按期刪除數據。
另外,可以使用 Redis Cluster、Codis 等方案,對 Redis 進行分區,從單機 Redis 變成集羣 Redis 。
若是進行完整重同步,因爲須要生成 RDB 文件,並進行傳輸,會佔用主機的 CPU ,並會消耗現網的帶寬。不過 Redis2.8 版本,已經有部分重同步的功能,可是仍是有可能有完整重同步的。好比,新上線的備機。
修改配置文件,進行重啓,將硬盤中的數據加載進內存,時間比較久。在這個過程當中,Redis 不能提供服務。
一、Redis 支持複雜的數據結構
也由於 Redis 支持複雜的數據結構,Redis 即便往於 Memcached 推出,卻得到更多開發者的青睞。
Redis 相比 Memcached 來講,擁有更多的數據結構,能支持更豐富的數據操做。若是須要緩存可以支持更復雜的結構和操做,Redis 會是不錯的選擇。
二、Redis 原生支持集羣模式
三、性能對比
更多關於性能的對比,能夠看看 《Memcached 與 Redis 的關鍵性能指標比較》 。
四、內存使用效率對比
若是 Redis 採用 hash 結構來作 key-value 存儲,因爲其組合式的壓縮, 其內存利用率會高於 Memcached 。
Redis 和 Memcached 的內存管理方法不一樣,Redis 採用的是包裝的 malloc/free , 相較於 Memcached 的內存管理方法 tcmalloc / jmalloc 來講,要簡單不少 。
五、網絡 IO 模型
TODO 有點看不懂,找亞普表弟確認中。
六、持久化存儲
也推薦閱讀下 《腳踏兩隻船的困惑 - Memcached 與 Redis》 。
艿艿:這個是我從網絡上找的資料,講的灰常不錯。
redis 內部使用文件事件處理器 file event handler
,這個文件事件處理器是單線程的,因此 redis 才叫作單線程的模型。它採用 IO 多路複用機制同時監聽多個 socket,根據 socket 上的事件來選擇對應的事件處理器進行處理。
文件事件處理器的結構包含 4 個部分:
多個 socket 可能會併發產生不一樣的操做,每一個操做對應不一樣的文件事件,可是 IO 多路複用程序會監聽多個 socket,會將 socket 產生的事件放入隊列中排隊,事件分派器每次從隊列中取出一個事件,把該事件交給對應的事件處理器進行處理。
來看客戶端與 redis 的一次通訊過程:
AE_READABLE
事件,IO 多路複用程序監聽到 server socket 產生的事件後,將該事件壓入隊列中。文件事件分派器從隊列中獲取該事件,交給鏈接應答處理器。鏈接應答處理器會建立一個能與客戶端通訊的 socket01,並將該 socket01 的 AE_READABLE
事件與命令請求處理器關聯。set key value
請求,此時 redis 中的 socket01 會產生 AE_READABLE
事件,IO 多路複用程序將事件壓入隊列,此時事件分派器從隊列中獲取到該事件,因爲前面 socket01 的 AE_READABLE
事件已經與命令請求處理器關聯,所以事件分派器將事件交給命令請求處理器來處理。命令請求處理器讀取 socket01 的 key value
並在本身內存中完成 key value
的設置。操做完成後,它會將 socket01 的 AE_WRITABLE
事件與令回覆處理器關聯。AE_WRITABLE
事件,一樣壓入隊列中,事件分派器找到相關聯的命令回覆處理器,由命令回覆處理器對 socket01 輸入本次操做的一個結果,好比 ok
,以後解除 socket01 的 AE_WRITABLE
事件與命令回覆處理器的關聯。這樣便完成了一次通訊。😈 耐心理解一下,灰常重要。若是仍是不能理解,能夠在網絡上搜一些資料,在理解理解。
一、純內存操做。
Redis 爲了達到最快的讀寫速度,將數據都讀到內存中,並經過異步的方式將數據寫入磁盤。因此 Redis 具備快速和數據持久化的特徵。
若是不將數據放在內存中,磁盤 I/O 速度爲嚴重影響 Redis 的性能。
二、核心是基於非阻塞的 IO 多路複用機制。
三、單線程反而避免了多線程的頻繁上下文切換問題。
Redis 利用隊列技術,將併發訪問變爲串行訪問,消除了傳統數據庫串行控制的開銷
四、Redis 全程使用 hash 結構,讀取速度快,還有一些特殊的數據結構,對數據存儲進行了優化,如壓縮表,對短數據進行壓縮存儲,再如,跳錶,使用有序的數據結構加快讀取的速度。
Redis 提供了兩種方式,實現數據的持久化到硬盤。
RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。
AOF持久化以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。
RDB存在哪些優點呢?
RDB又存在哪些劣勢呢?
AOF的優點有哪些呢?
AOF的劣勢有哪些呢?
兩者選擇的標準,就是看系統是願意犧牲一些性能,換取更高的緩存一致性(aof),仍是願意寫操做頻繁的時候,不啓用備份來換取更高的性能,待手動運行save的時候,再作備份(rdb)。rdb這個就更有些 eventually consistent 的意思了。
RDB持久化配置
Redis會將數據集的快照dump到dump.rdb文件中。此外,咱們也能夠經過配置文件來修改Redis服務器dump快照的頻率,在打開6379.conf文件以後,咱們搜索save,能夠看到下面的配置信息:
1 2 3 |
save 900 1 # 在900秒(15分鐘)以後,若是至少有1個key發生變化,則dump內存快照。 save 300 10 # 在300秒(5分鐘)以後,若是至少有10個key發生變化,則dump內存快照。 save 60 10000 # 在60秒(1分鐘)以後,若是至少有10000個key發生變化,則dump內存快照。 |
AOF持久化配置
在Redis的配置文件中存在三種同步方式,它們分別是:
1 2 3 |
appendfsync always # 每次有數據修改發生時都會寫入AOF文件。 appendfsync everysec # 每秒鐘同步一次,該策略爲AOF的缺省策略。 appendfsync no # 從不一樣步。高效可是數據不會被持久化。 |
不要僅僅使用 RDB,由於那樣會致使你丟失不少數據
也不要僅僅使用 AOF,由於那樣有兩個問題,第一,你經過 AOF 作冷備,沒有 RDB 作冷備,來的恢復速度更快; 第二,RDB 每次簡單粗暴生成數據快照,更加健壯,能夠避免 AOF 這種複雜的備份和恢復機制的 bug 。
Redis 支持同時開啓開啓兩種持久化方式,咱們能夠綜合使用 AOF 和 RDB 兩種持久化機制,用 AOF 來保證數據不丟失,做爲數據恢復的第一選擇; 用 RDB 來作不一樣程度的冷備,在 AOF 文件都丟失或損壞不可用的時候,還可使用 RDB 來進行快速的數據恢復。
若是同時使用 RDB 和 AOF 兩種持久化機制,那麼在 Redis 重啓的時候,會使用 AOF 來從新構建數據,由於 AOF 中的數據更加完整。
通常來講, 若是想達到足以媲美 PostgreSQL 的數據安全性, 你應該同時使用兩種持久化功能。若是你很是關心你的數據, 但仍然能夠承受數分鐘之內的數據丟失,那麼你能夠只使用 RDB 持久化。
有不少用戶都只使用 AOF 持久化,但並不推薦這種方式:由於定時生成 RDB 快照(snapshot)很是便於進行數據庫備份, 而且 RDB 恢復數據集的速度也要比AOF恢復的速度要快,除此以外,使用 RDB 還能夠避免以前提到的 AOF 程序的 bug。
在 Redis4.0 版本開始,容許你使用 RDB-AOF 混合持久化方式,詳細可見 《Redis4.0 之 RDB-AOF 混合持久化》 。也所以,RDB 和 AOF 同時使用,是但願達到安全的持久化的推薦方式。
BGSAVE 原理:
重要知識:
Redis 的過時策略,就是指當 Redis 中緩存的 key 過時了,Redis 如何處理。
Redis 提供了 3 種數據過時策略:
在 Redis 中,同時使用了上述 3 種策略,即它們非互斥的。
想要進一步瞭解,能夠看看 《關於 Redis 數據過時策略》 文章。
Redis 內存數據集大小上升到必定大小的時候,就會進行數據淘汰策略。
Redis 提供了 6 種數據淘汰策略:
具體的 每種數據淘汰策略的定義,和 如何選擇討論策略,可見 《Redis實戰(二) 內存淘汰機制》 。
Redis LRU 算法
另外,Redis 的 LRU 算法,並非一個嚴格的 LRU 實現。這意味着 Redis 不能選擇最佳候選鍵來回收,也就是最久未被訪問的那些鍵。相反,Redis 會嘗試執行一個近似的 LRU 算法,經過採樣一小部分鍵,而後在採樣鍵中回收最適合(擁有最久未被訪問時間)的那個。
具體的能夠看看 《使用 Redis 做爲一個 LRU 緩存》 文章。
MySQL 裏有 2000w 數據,Redis 中只存 20w 的數據,如何保證 Redis 中的數據都是熱點數據?
艿艿:這個是從網絡上找到的一個神奇的問題,而且看了答案以後,以爲有點莫名的對不上。
因此,感受這個問題的目的是,如何保證熱點數據不要被淘汰。
在 「Redis 有哪幾種數據「淘汰」策略?」 問題中,咱們已經看到,「Redis 內存數據集大小上升到必定大小的時候,就會進行數據淘汰策略。」 。
那麼,若是咱們此時要保證熱點數據不被淘汰,那麼須要選擇 volatile-lru 或 allkeys-lru 這兩個基於 LRU 算法的淘汰策略。
相比較來講,最終會選擇 allkeys-lru 淘汰策略。緣由是,若是咱們的應用對緩存的訪問符合冪律分佈,也就是存在相對熱點數據,或者咱們不太清楚咱們應用的緩存訪問分佈情況,咱們能夠選擇 allkeys-lru 策略。
Redis 回收進程如何工做的?
理解回收進程如何工做是很是重要的:
因此咱們不斷地穿越內存限制的邊界,經過不斷達到邊界而後不斷地回收回到邊界如下(跌宕起伏)。
若是大量的 key 過時時間設置的過於集中,到過時的那個時間點,Redis可能會出現短暫的卡頓現象。
通常須要在時間上加一個隨機值,使得過時時間分散一些。
若是你是 Redis 普通玩家,可能你的回答是以下五種數據結構:
若是你是 Redis 中級玩家,還須要加上下面幾種數據結構:
若是你是 Redis 高端玩家,你可能玩過 Redis Module ,能夠再加上下面幾種數據結構:
另外,在 Redis 5.0 增長了 Stream 功能,一個新的強大的支持多播的可持久化的消息隊列,提供相似 Kafka 的功能。😈 默默跟面試官在裝一波。
Redis 可用的場景很是之多:
詳細的介紹,能夠看看以下文章:
請用 Redis 和任意語言實現一段惡意登陸保護的代碼,限制 1 小時內每用戶 Id 最多隻能登陸 5 次。
用列表實現,列表中每一個元素表明登錄時間,只要最後的第 5 次登錄時間和如今時間差不超過 1 小時就禁止登錄。
具體的代碼實現,能夠看看 《一道 Redis 面試題》 。
使用比較普遍的有三個 Java 客戶端:
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)。
Jedis
Jedis 是 Redis 的 Java 實現的客戶端,其 API 提供了比較全面的 Redis 命令的支持。
Redisson 實現了分佈式和可擴展的 Java 數據結構,和 Jedis 相比,Jedis 功能較爲簡單,不支持字符串操做,不支持排序、事務、管道、分區等 Redis 特性。
Redisson 的宗旨是促進使用者對 Redis 的關注分離,從而讓使用者可以將精力更集中地放在處理業務邏輯上。
Lettuce
Lettuce 是一個可伸縮線程安全的 Redis 客戶端。多個線程能夠共享同一個 RedisConnection 。它利用優秀 Netty NIO 框架來高效地管理多個鏈接。
Redis 官方推薦使用 Redisson 或 Jedis 。
Spring Boot 2.x 內置使用 Lettuce 。
方案一:set 指令
先拿 setnx 來爭搶鎖,搶到以後,再用 expire 給鎖加一個過時時間防止鎖忘記了釋放。
因此,咱們可使用 set 指令,實現分佈式鎖。指令以下:
1 |
SET key value [EX seconds] [PX milliseconds] [NX|XX] |
SET key value EX seconds NX
命令,嘗試得到鎖。方案二:redlock
set 指令的方案,適合用於在單機 Redis 節點的場景下,在多 Redis 節點的場景下,會存在分佈式鎖丟失的問題。因此,Redis 做者 Antirez 基於分佈式環境下提出了一種更高級的分佈式鎖的實現方式:Redlock 。
具體的方案,胖友能夠看看老友飛哥的兩篇博客:
對比 Zookeeper 分佈式鎖
因此,沒有絕對的好壞,能夠根據本身的業務來具體選擇。
通常使用 list 結構做爲隊列,rpush 生產消息,lpop 消費消息。當 lpop 沒有消息的時候,要適當 sleep 一會再重試。
到這裏,面試官暗地裏已經對你豎起了大拇指。可是他不知道的是此刻你卻豎起了中指,在椅子背後。
固然,實際上 Redis 真的真的真的不推薦做爲消息隊列使用,它最多隻是消息隊列的存儲層,上層的邏輯,還須要作大量的封裝和支持。
另外,在 Redis 5.0 增長了 Stream 功能,一個新的強大的支持多播的可持久化的消息隊列,提供相似 Kafka 的功能。
一次請求/響應服務器能實現處理新的請求即便舊的請求還未被響應。這樣就能夠將多個命令發送到服務器,而不用等待回覆,最後在一個步驟中讀取該答覆。
這就是管道(pipelining),是一種幾十年來普遍使用的技術。例如許多 POP3 協議已經實現支持這個功能,大大加快了從服務器下載新郵件的過程。
Redis 很早就支持管道(pipelining)技術,所以不管你運行的是什麼版本,你均可以使用管道(pipelining)操做 Redis。
Redis 如何作大量數據插入?
Redis2.6 開始,Redis-cli 支持一種新的被稱之爲 pipe mode 的新模式用於執行大量數據插入工做。
具體可見 《Redis 大量數據插入》 文章。
和衆多其它數據庫同樣,Redis 做爲 NoSQL 數據庫也一樣提供了事務機制。在Redis中,MULTI / EXEC / DISCARD / WATCH 這四個命令是咱們實現事務的基石。相信對有關係型數據庫開發經驗的開發者而言這一律念並不陌生,即使如此,咱們仍是會簡要的列出 Redis 中事務的實現特徵:
一、在事務中的全部命令都將會被串行化的順序執行,事務執行期間,Redis 不會再爲其它客戶端的請求提供任何服務,從而保證了事物中的全部命令被原子的執行。
二、和關係型數據庫中的事務相比,在 Redis 事務中若是有某一條命令執行失敗,其後的命令仍然會被繼續執行。
三、咱們能夠經過 MULTI 命令開啓一個事務,有關係型數據庫開發經驗的人能夠將其理解爲 "BEGIN TRANSACTION"
語句。在該語句以後執行的命令都,將被視爲事務以內的操做,最後咱們能夠經過執行 EXEC / DISCARD 命令來提交 / 回滾該事務內的全部操做。這兩個 Redis 命令,可被視爲等同於關係型數據庫中的 COMMIT / ROLLBACK 語句。
四、在事務開啓以前,若是客戶端與服務器之間出現通信故障並致使網絡斷開,其後全部待執行的語句都將不會被服務器執行。然而若是網絡中斷事件是發生在客戶端執行 EXEC 命令以後,那麼該事務中的全部命令都會被服務器執行。
五、當使用 Append-Only 模式時,Redis 會經過調用系統函數 write 將該事務內的全部寫操做在本次調用中所有寫入磁盤。然而若是在寫入的過程當中出現系統崩潰,如電源故障致使的宕機,那麼此時也許只有部分數據被寫入到磁盤,而另一部分數據卻已經丟失。
Redis 服務器會在從新啓動時執行一系列必要的一致性檢測,一旦發現相似問題,就會當即退出並給出相應的錯誤提示。此時,咱們就要充分利用 Redis 工具包中提供的 redis-check-aof 工具,該工具能夠幫助咱們定位到數據不一致的錯誤,並將已經寫入的部分數據進行回滾。修復以後咱們就能夠再次從新啓動Redis服務器了。
如何實現 Redis CAS 操做?
在 Redis 的事務中,WATCH 命令可用於提供CAS(check-and-set)功能。
假設咱們經過 WATCH 命令在事務執行以前監控了多個 keys ,假若在 WATCH 以後有任何 Key 的值發生了變化,EXEC 命令執行的事務都將被放棄,同時返回 nil
應答以通知調用者事務執行失敗。
具體的示例,能夠看看 《Redis 事務鎖 CAS 實現以及深刻誤區》 。
Redis 集羣方案以下:
關於前四種,能夠看看 《Redis 實戰(四)集羣機制》 這篇文章。
關於最後一種,客戶端分片,在 Redis Cluster 出現以前使用較多,目前已經使用比較少了。實現方式以下:
在業務代碼層實現,起幾個毫無關聯的 Redis 實例,在代碼層,對 Key 進行 hash 計算,而後去對應的 Redis 實例操做數據。
這種方式對 hash 層代碼要求比較高,考慮部分包括,節點失效後的替代算法方案,數據震盪後的自動腳本恢復,實例的監控,等等。
選擇
目前通常在選型上來講:
體量較大時,選擇 Redis Cluster ,經過分片,使用更多內存。
Redis 集羣如何擴容?
這個問題,艿艿瞭解的也不是不少,建議在搜索有什麼方案。
Redis 主從同步
Redis 的主從同步(replication)機制,容許 Slave 從 Master 那裏,經過網絡傳輸拷貝到完整的數據備份,從而達到主從機制。
好處
經過 Redis 的複製功,能能夠很好的實現數據庫的讀寫分離,提升服務器的負載能力。主數據庫主要進行寫操做,而從數據庫負責讀操做。
Redis 主從同步,是不少 Redis 集羣方案的基礎,例如 Redis Sentinel、Redis Cluster 等等。
更多詳細,能夠看看 《Redis 主從架構》 。
能夠看看 《Redis 哨兵集羣實現高可用》 。
能夠看看
說說 Redis 哈希槽的概念?
Redis Cluster 沒有使用一致性 hash ,而是引入了哈希槽的概念。
Redis 集羣有 16384 個哈希槽,每一個 key 經過 CRC16 校驗後對 16384 取模來決定放置哪一個槽,集羣的每一個節點負責一部分 hash 槽。
由於最大是 16384 個哈希槽,因此考慮 Redis 集羣中的每一個節點都能分配到一個哈希槽,因此最多支持 16384 個 Redis 節點。
Redis Cluster 的主從複製模型是怎樣的?
爲了使在部分節點失敗或者大部分節點沒法通訊的狀況下集羣仍然可用,因此集羣使用了主從複製模型,每一個節點都會有 N-1 個複製節點。
因此,Redis Cluster 能夠說是 Redis Sentinel 帶分片的增強版。也能夠說:
Redis Cluster 方案什麼狀況下會致使整個集羣不可用?
有 A,B,C 三個節點的集羣,在沒有複製模型的狀況下,若是節點 B 宕機了,那麼整個集羣就會覺得缺乏 5501-11000 這個範圍的槽而不可用。
Redis Cluster 會有寫操做丟失嗎?爲何?
Redis 並不能保證數據的強一致性,而是【異步複製】,這意味這在實際中集羣在特定的條件下可能會丟失寫操做。
Redis 集羣如何選擇數據庫?
Redis 集羣目前沒法作數據庫選擇,默認在 0 數據庫。
請說說生產環境中的 Redis 是怎麼部署的?
重點問題,仔細理解。
這個問題,和 「Redis 集羣都有哪些方案?」 是同類問題。
關於以下四個問題,直接看 《Redis 分區》 文章。
可能有胖友會懵逼,又是 Redis 主從複製,又是 Redis 分區,又是 Redis 集羣。傻傻分不清啊!
你知道有哪些 Redis 分區實現方案?
Redis 分區方案,主要分紅兩種類型:
查詢路由(Query routing)的意思,是客戶端隨機地請求任意一個 Redis 實例,而後由 Redis 將請求轉發給正確的 Redis 節點。Redis Cluster 實現了一種混合形式的查詢路由,但並非直接將請求從一個Redis 節點轉發到另外一個 Redis 節點,而是在客戶端的幫助下直接 redirect 到正確的 Redis 節點。
分佈式 Redis 是前期作仍是後期規模上來了再作好?爲何??
以下是網絡上的一個大答案:
既然 Redis 是如此的輕量(單實例只使用1M內存),爲防止之後的擴容,最好的辦法就是一開始就啓動較多實例。即使你只有一臺服務器,你也能夠一開始就讓 Redis 以分佈式的方式運行,使用分區,在同一臺服務器上啓動多個實例。
一開始就多設置幾個 Redis 實例,例如 32 或者 64 個實例,對大多數用戶來講這操做起來可能比較麻煩,可是從長久來看作這點犧牲是值得的。
這樣的話,當你的數據不斷增加,須要更多的 Redis 服務器時,你須要作的就是僅僅將 Redis 實例從一臺服務遷移到另一臺服務器而已(而不用考慮從新分區的問題)。一旦你添加了另外一臺服務器,你須要將你一半的 Redis 實例從第一臺機器遷移到第二臺機器。
推薦閱讀 《Redis 幾個重要的健康指標》
如何提升 Redis 命中率?
推薦閱讀 《如何提升緩存命中率(Redis)》 。
推薦閱讀 《Redis 的內存優化》
控制 key 的數量
一個 Redis 實例最多能存放多少的 keys?List、Set、Sorted Set 他們最多能存放多少元素?
一個 Redis 實例,最多能存放多少的 keys ,List、Set、Sorted Set 他們最多能存放多少元素。
理論上,Redis 能夠處理多達 2^32 的 keys ,而且在實際中進行了測試,每一個實例至少存放了 2 億 5 千萬的 keys。
任何 list、set、和 sorted set 均可以放 2^32 個元素。
假如 Redis 裏面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,若是將它們所有找出來?
使用 keys 指令能夠掃出指定模式的 key 列表。
一、Master 最好不要作任何持久化工做,如 RDB 內存快照和 AOF 日誌文件。
二、Master 調用 BGREWRITEAOF 重寫 AOF 文件,AOF 在重寫的時候會佔大量的 CPU 和內存資源,致使服務 load 太高,出現短暫服務暫停現象。
三、儘可能避免在壓力很大的主庫上增長從庫。
四、主從複製不要用圖狀結構,用單向鏈表結構更爲穩定,即:Master <- Slave1 <- Slave2 <- Slave3...
。
五、Redis 主從複製的性能問題,爲了主從複製的速度和鏈接的穩定性,Slave 和 Master 最好在同一個局域網內。
和飛哥溝經過後,他們主節點開啓 AOF ,從節點開啓 AOF + RDB 。
和曉峯溝通後,他們主節點開啓 AOF ,從節點開啓 RDB 居多,也有開啓 AOF + RDB 的。
針對運行實例,有許多配置選項能夠經過 CONFIG SET
命令進行修改,而無需執行任何形式的重啓。
從 Redis 2.2 開始,能夠從 AOF 切換到 RDB 的快照持久性或其餘方式而不須要重啓 Redis。檢索 CONFIG GET *
命令獲取更多信息。
但偶爾從新啓動是必須的,如爲升級 Redis 程序到新的版本,或者當你須要修改某些目前 CONFIG 命令還不支持的配置參數的時候。
有些比較兇殘的面試官,可能會問咱們一些 Redis 數據結構的問題,例如:
Skiplist 插入和查詢原理?
壓縮列表的原理?
Redis 底層爲何使用跳躍表而不是紅黑樹?
跳躍表在範圍查找的時候性能比較高。