您好,登錄后才能下訂單哦!
一、什么是 Redis?
Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高性能非關系型(NoSQL)的鍵值對數據庫,可以存儲鍵和五種不同類型的值之間的映射。鍵的類型只能為字符串,值支持五種數據類型:字符串、列表、集合、散列表、有序集合。
與傳統數據庫不同的是 Redis 的數據是存在內存中的,所以讀寫速度非常快,因此 redis 被廣泛應用于緩存方向,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。另外,Redis 也經常用來做分布式鎖。除此之外,Redis 支持事務 、持久化、LUA腳本、LRU驅動事件、多種集群方案。
Redis 是完全開源免費的,遵守 BSD 協議,是一個高性能的 key-value 數據庫。
二、Redis 與其他 key - value 緩存產品有以下三個特點:
(1)Redis 支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
(2)Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。
(3)Redis 支持數據的備份,即 master-slave 模式的數據備份。
三、Redis有哪些優缺點
優點
(1)性能極高 – Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s 。
(2)豐富的數據類型 – Redis 支持二進制案例的 Strings, Lists, Hashes, Sets 及Ordered Sets 數據類型操作。
(3)原子 – Redis 的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過 MULTI 和 EXEC指令包起來。
(4)豐富的特性 – Redis 還支持 publish/subscribe, 通知, key 過期等等特性。
讀寫性能優異, 支持數據持久化,支持AOF和RDB兩種持久化方式。支持事務,Redis的所有操作都是原子性的,同時Redis還支持對幾個操作合并后的原子性執行。數據結構豐富,除了支持string類型的value外還支持hash、set、zset、list等數據結構。支持主從復制,主機會自動將數據同步到從機,可以進行讀寫分離。
缺點
數據庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫,因此Redis適合的場景主要局限在較小數據量的高性能操作和運算上。
Redis 不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復。
主機宕機,宕機前有部分數據未能及時同步到從機,切換IP后還會引入數據不一致的問題,降低了系統的可用性。
Redis 較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。為避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。
四、Redis 與其他 key-value 存儲有什么不同?
(1)Redis 有著更為復雜的數據結構并且提供對他們的原子性操作,這是一個不同于其他數據庫的進化路徑。Redis 的數據類型都是基于基本數據結構的同時對程序員透明,無需進行額外的抽象。
(2)Redis 運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大于硬件內存。在內存數據庫方面的另一個優點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣 Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們并不需要進行隨機訪問。
五、Redis 的數據類型?
Redis 支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及 zsetsorted set:有序集合)。
我們實際項目中比較常用的是 string,hash 如果你是 Redis 中高級用戶,還需要加上下面幾種數據結構 HyperLogLog、Geo、Pub/Sub。
如果你說還玩過 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發亮了。
六、使用 Redis 有哪些好處?
(1)速度快,因為數據存在內存中,類似于 HashMap,HashMap 的優勢
(2)支持豐富數據類型,支持 string,list,set,Zset,hash 等
(3)支持事務,操作都是原子性,所謂的原子性就是對數據的更改要么全部執行,要么全部不執行
(4)豐富的特性:可用于緩存,消息,按 key 設置過期時間,過期后將會自動刪除
七、Redis 相比 Memcached 有哪些優勢?
(1)Memcached 所有的值均是簡單的字符串,redis 作為其替代者,支持更為豐富的數據類
(2)Redis 的速度比 Memcached 快很
(3)Redis 可以持久化其數據
八、Memcache 與 Redis 的區別都有哪些?
(1)存儲方式 Memecache 把數據全部存在內存之中,斷電后會掛掉,數據不能超過內存大小。 Redis 有部份存在硬盤上,這樣能保證數據的持久性。
(2)數據支持類型 Memcache 對數據類型支持相對簡單。 Redis 有復雜的數據類型。
(3)使用底層模型不同 它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。 Redis 直接自己構建了 VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
九、一個字符串類型的值能存儲最大容量是多少?
512M
十、Redis 的持久化機制是什么?各自的優缺點?
Redis提供兩種持久化機制 RDB 和 AOF 機制:
RDBRedis DataBase)持久化方式:
是指用數據集快照的方式半持久化模式)記錄 redis 數據庫的所有鍵值對,在某個時間點將數據寫入一個臨時文件,持久化結束后,用這個臨時文件替換上次持久化的文件,達到數據恢復。
優點:
(1)只有一個文件 dump.rdb,方便持久化。
(2)容災性好,一個文件可以保存到安全的磁盤。
(3)性能最大化,fork 子進程來完成寫操作,讓主進程繼續處理命令,所以是 IO最大化。使用單獨子進程來進行持久化,主進程不會進行任何 IO 操作,保證了 redis的高性能)
(4)相對于數據集大時,比 AOF 的啟動效率更高。
缺點:
數據安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生數據丟失。所以這種方式更適合數據要求不嚴謹的時候
AOFAppend-only file)持久化方式:
是指所有的命令行記錄以 redis 命令請求協議的格式完全持久化存儲)保存為 aof 文件。
優點:
(1)數據安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次命令操作就記錄到 aof 文件中一次。
(2)通過 append 模式寫文件,即使中途服務器宕機,可以通過 redis-check-aof工具解決數據一致性問題。
(3)AOF 機制的 rewrite 模式。AOF 文件沒被 rewrite 之前(文件過大時會對命令進行合并重寫),可以刪除其中的某些命令(比如誤操作的 flushall))
缺點:
(1)AOF 文件比 RDB 文件大,且恢復速度慢。
(2)數據集大的時候,比 rdb 啟動效率低。
十一、Redis 常見性能問題和解決方案:
(1)Master 最好不要寫內存快照,如果 Master 寫內存快照,save 命令調度 rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務
(2)如果數據比較重要,某個 Slave 開啟 AOF 備份數據,策略設置為每秒同步一
(3)為了主從復制的速度和連接的穩定性,Master 和 Slave 最好在同一個局域網
(4)盡量避免在壓力很大的主庫上增加從
(5)主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1<- Slave2 <- Slave3…這樣的結構方便解決單點故障問題,實現 Slave 對 Master的替換。如果 Master 掛了,可以立刻啟用 Slave1 做 Master,其他不變。
十二、redis 過期鍵的刪除策略?
(1)定時刪除:在設置鍵的過期時間的同時,創建一個定時器 timer). 讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作。
(2)惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。
(3)定期刪除:每隔一段時間程序就對數據庫進行一次檢查,刪除里面的過期鍵。至于要刪除多少過期鍵,以及要檢查多少個數據庫,則由算法決定。
十三、為什么 edis 需要把所有數據放到內存中?
Redis 為了達到最快的讀寫速度將數據都讀到內存中,并通過異步的方式將數據寫入磁盤。所以 redis 具有快速和數據持久化的特征。如果不將數據放在內存中,磁盤 I/O 速度為嚴重影響 redis 的性能。在內存越來越便宜的今天,redis 將會越來越受歡迎。如果設置了最大使用的內存,則數據已有記錄數達到內存限值后不能繼續插入新值。
十四、Redis 的同步機制了解么?
Redis 可以使用主從同步,從從同步。第一次同步時,主節點做一次 bgsave,并同時將后續修改操作記錄到內存 buffer,待完成后將 rdb 文件全量同步到復制節點,復制節點接受完成后將 rdb 鏡像加載到內存。加載完成后,再通知主節點將期間修改的操作記錄同步到復制節點進行重放就完成了同步過程。
十五、Pipeline 有什么好處,為什么要用 pipeline?
可以將多次 IO 往返的時間縮減為一次,前提是 pipeline 執行的指令之間沒有因果相關性。使用 redis-benchmark 進行壓測的時候可以發現影響 redis 的 QPS峰值的一個重要因素是 pipeline 批次指令的數目。
十六、是否使用過 Redis 集群,集群的原理是什么?
(1)Redis Sentinal 著眼于高可用,在 master 宕機時會自動將 slave 提升為master,繼續提供服務。
(2)Redis Cluster 著眼于擴展性,在單個 redis 內存不足時,使用 Cluster 進行分片存儲。
十七、Redis 集群方案什么情況下會導致整個集群不可用?
有 A,B,C 三個節點的集群,在沒有復制模型的情況下,如果節點 B 失敗了,那么整個集群就會以為缺少 5501-11000 這個范圍的槽而不可用。
十八、Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?
Redisson、Jedis、lettuce 等等,官方推薦使用 Redisson。
十九、Jedis 與 Redisson 對比有什么優缺點?
Jedis 是 Redis 的 Java 實現的客戶端,其 API 提供了比較全面的 Redis 命令的支持;Redisson 實現了分布式和可擴展的 Java 數據結構,和 Jedis 相比,功能較為簡單,不支持字符串操作,不支持排序、事務、管道、分區等 Redis 特性。Redsson 的宗旨是促進使用者對 Redis 的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
二十、Redis 如何設置密碼及驗證密碼?
設置密碼:config set requirepass 123456
授權密碼:auth 123456
二十一、說說 Redis 哈希槽的概念?
Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 個哈希槽,每個 key 通過 CRC16 校驗后對 16384 取模來決定放置哪個槽,集群的每個節點負責一部分 hash 槽。
二十二、Redis 集群的主從復制模型是怎樣的?
為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節點都會有 N-1 個復制品.
二十三、Redis 集群會有寫操作丟失嗎?為什么?
Redis 并不能保證數據的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作。
二十四、Redis 集群之間是如何復制的?
異步復制
二十五、Redis 集群最大節點個數是多少?
16384 個。
二十六、Redis 集群如何選擇數據庫?
Redis 集群目前無法做數據庫選擇,默認在 0 數據庫。
二十七、怎么測試 Redis 的連通性?
使用 ping 命令。
二十八、怎么理解 Redis 事務?
(1)事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
(2)事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。
二十九、Redis 事務相關的命令有哪幾個?
MULTI、EXEC、DISCARD、WATCH
三十、Redis key 的過期時間和永久有效分別怎么設置?
EXPIRE 和 PERSIST 命令。
篇幅有限,更多面試資料需要請獲取:
QQ獲取
點擊鏈接加入群聊【java架構學習交流群】:https://jq.qq.com/?_wv=1027&k=5Gxc9ic
不常用QQ的小伙伴可以微信獲取(記得備注一下加群渠道哦~)
賬號:13272413561
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。