這 40 道Redis面試題讓你不再慌(附答案)
- Redis 支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
- Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。
- Redis 支持數據的備份,即 master-slave 模式的數據備份。
- 性能極高:Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s。
- 豐富的數據類型:Redis 支持二進制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 數據類型操作。
- 原子:Redis 的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過 MULTI 和 EXEC 指令包起來。
- 豐富的特性:Redis 還支持 publish/subscribe,通知,key 過期等等特性。
- 速度快,因為數據存在內存中,類似于 HashMap,HashMap 的優勢就是查找和操作的時間復雜度都是 O1)
- 支持豐富數據類型,支持 string,list,set,Zset,hash 等
- 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要么全部執行,要么全部不執行
- 豐富的特性,可用于緩存,消息,按 key 設置過期時間,過期后將會自動刪除
- Memcached 所有的值均是簡單的字符串,Redis 作為其替代者,支持更為豐富的數據類
- Redis 的速度比 Memcached 快很多
- Redis 可以持久化其數據
- 存儲方式 Memecache 把數據全部存在內存之中,斷電后會掛掉,數據不能超過內存大小。Redis 有部分存在硬盤上,這樣能保證數據的持久性。
- 數據支持類型 Memcache 對數據類型支持相對簡單。Redis 有復雜的數據類型。
- 使用底層模型不同 它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。Redis 直接自己構建了 VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
- 只有一個文件 dump.rdb,方便持久化。
- 容災性好,一個文件可以保存到安全的磁盤。
- 性能最大化,fork 子進程來完成寫操作,讓主進程繼續處理命令,所以是 IO 最大化。使用單獨子進程來進行持久化,主進程不會進行任何 IO 操作,保證了 Redis的高性能。
- 相對于數據集大時,比 AOF 的啟動效率更高。
- 數據安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次命令操作就記錄到 aof 文件中一次。
- 通過 append 模式寫文件,即使中途服務器宕機,可以通過 redis-check-aof 工具解決數據一致性問題。
- AOF 機制的 rewrite 模式。AOF 文件沒被 rewrite 之前(文件過大時會對命令進行合并重寫),可以刪除其中的某些命令(比如誤操作的 flushall)
- AOF 文件比 RDB 文件大,且恢復速度慢。
- 數據集大的時候,比 RDB 啟動效率低。
- Master 最好不要寫內存快照,如果 Master 寫內存快照,save 命令調度 rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務。
- 如果數據比較重要,某個 Slave 開啟 AOF 備份數據,策略設置為每秒同步一。
- 為了主從復制的速度和連接的穩定性,Master 和 Slave 最好在同一個局域網。
- 盡量避免在壓力很大的主庫上增加從。
- 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1<- Slave2 <- Slave3……這樣的結構方便解決單點故障問題,實現 Slave 對 Master 的替換。如果 Master 掛了,可以立刻啟用 Slave1 做 Master,其他不變。
- 定時刪除:在設置鍵的過期時間的同時,創建一個定時器 timer。讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。
- 惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。
- 定期刪除:每隔一段時間程序就對數據庫進行一次檢查,刪除里面的過期鍵。至于要刪除多少過期鍵,以及要檢查多少個數據庫,則由算法決定。
- volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
- volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
- volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
- allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
- allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
- no-enviction(驅逐):禁止驅逐數據
- 如果數據呈現冪律分布,也就是一部分數據訪問頻率高,一部分數據訪問頻率低,則使用 allkeys-lru
- 如果數據呈現平等分布,也就是所有的數據訪問頻率都相同,則使用 allkeys-random
- volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
- volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
- volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
- allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
- allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
- no-enviction(驅逐):禁止驅逐數據
原文鏈接:https://blog.csdn.net/Design407/article/details/103242874
文章轉載:分布式實驗室
(版權歸原作者所有,侵刪)