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