1疗涉、什么是Redis?簡(jiǎn)述它的優(yōu)缺點(diǎn)吟秩?
Redis本質(zhì)上是一個(gè)Key-Value類(lèi)型的內(nèi)存數(shù)據(jù)庫(kù)咱扣,很像memcached,整個(gè)數(shù)據(jù)庫(kù)統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作涵防,定期通過(guò)異步操作把數(shù)據(jù)庫(kù)數(shù)據(jù)flush到硬盤(pán)上進(jìn)行保存闹伪。
因?yàn)槭羌儍?nèi)存操作,Redis的性能非常出色壮池,每秒可以處理超過(guò) 10萬(wàn)次讀寫(xiě)操作祭往,是已知性能最快的Key-Value DB。
Redis的出色之處不僅僅是性能火窒,Redis最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu),此外單個(gè)value的最大限制是1GB驮肉,不像 memcached只能保存1MB的數(shù)據(jù)熏矿,因此Redis可以用來(lái)實(shí)現(xiàn)很多有用的功能。
比方說(shuō)用他的List來(lái)做FIFO雙向鏈表离钝,實(shí)現(xiàn)一個(gè)輕量級(jí)的高性 能消息隊(duì)列服務(wù)票编,用他的Set可以做高性能的tag系統(tǒng)等等。
另外Redis也可以對(duì)存入的Key-Value設(shè)置expire時(shí)間卵渴,因此也可以被當(dāng)作一 個(gè)功能加強(qiáng)版的memcached來(lái)用慧域。 Redis的主要缺點(diǎn)是數(shù)據(jù)庫(kù)容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫(xiě)浪读,因此Redis適合的場(chǎng)景主要局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上昔榴。
2、Redis相比memcached有哪些優(yōu)勢(shì)碘橘?
(1) memcached所有的值均是簡(jiǎn)單的字符串互订,redis作為其替代者,支持更為豐富的數(shù)據(jù)類(lèi)型
(2) redis的速度比memcached快很多
(3) redis可以持久化其數(shù)據(jù)
3痘拆、Redis支持哪幾種數(shù)據(jù)類(lèi)型仰禽?
String、List、Set吐葵、Sorted Set规揪、hashes
4、Redis主要消耗什么物理資源温峭?
內(nèi)存猛铅。
5、Redis的全稱(chēng)是什么诚镰?
Remote Dictionary Server奕坟。
6、Redis有哪幾種數(shù)據(jù)淘汰策略清笨?
noeviction:返回錯(cuò)誤當(dāng)內(nèi)存限制達(dá)到并且客戶(hù)端嘗試執(zhí)行會(huì)讓更多內(nèi)存被使用的命令(大部分的寫(xiě)入指令月杉,但DEL和幾個(gè)例外)
allkeys-lru:?嘗試回收最少使用的鍵(LRU),使得新添加的數(shù)據(jù)有空間存放抠艾。
volatile-lru: 嘗試回收最少使用的鍵(LRU)苛萎,但僅限于在過(guò)期集合的鍵,使得新添加的數(shù)據(jù)有空間存放。
allkeys-random:?回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放检号。
volatile-random:?回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放腌歉,但僅限于在過(guò)期集合的鍵。
volatile-ttl: 回收在過(guò)期集合的鍵齐苛,并且優(yōu)先回收存活時(shí)間(TTL)較短的鍵,使得新添加的數(shù)據(jù)有空間存放翘盖。
7、Redis官方為什么不提供Windows版本凹蜂?
因?yàn)槟壳癓inux版本已經(jīng)相當(dāng)穩(wěn)定馍驯,而且用戶(hù)量很大,無(wú)需開(kāi)發(fā)windows版本玛痊,反而會(huì)帶來(lái)兼容性等問(wèn)題汰瘫。
8、一個(gè)字符串類(lèi)型的值能存儲(chǔ)最大容量是多少擂煞?
512M
9混弥、為什么Redis需要把所有數(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ù)插入新值。
10、Redis集群方案應(yīng)該怎么做俗或?都有哪些方案市怎?
1.codis。
目前用的最多的集群方案辛慰,基本和twemproxy一致的效果区匠,但它支持在 節(jié)點(diǎn)數(shù)量改變情況下,舊節(jié)點(diǎn)數(shù)據(jù)可恢復(fù)到新hash節(jié)點(diǎn)帅腌。
2.redis cluster3.0自帶的集群驰弄,特點(diǎn)在于他的分布式算法不是一致性hash,而是hash槽的概念速客,以及自身支持節(jié)點(diǎn)設(shè)置從節(jié)點(diǎn)戚篙。具體看官方文檔介紹。
4.在業(yè)務(wù)代碼層實(shí)現(xiàn)溺职,起幾個(gè)毫無(wú)關(guān)聯(lián)的redis實(shí)例岔擂,在代碼層,對(duì)key 進(jìn)行hash計(jì)算浪耘,然后去對(duì)應(yīng)的redis實(shí)例操作數(shù)據(jù)乱灵。 這種方式對(duì)hash層代碼要求比較高,考慮部分包括七冲,節(jié)點(diǎn)失效后的替代算法方案痛倚,數(shù)據(jù)震蕩后的自動(dòng)腳本恢復(fù),實(shí)例的監(jiān)控澜躺,等等蝉稳。
11、Redis集群方案什么情況下會(huì)導(dǎo)致整個(gè)集群不可用苗踪?
有A,B削锰,C三個(gè)節(jié)點(diǎn)的集群,在沒(méi)有復(fù)制模型的情況下,如果節(jié)點(diǎn)B失敗了通铲,那么整個(gè)集群就會(huì)以為缺少5501-11000這個(gè)范圍的槽而不可用。
12器贩、MySQL里有2000w數(shù)據(jù)颅夺,redis中只存20w的數(shù)據(jù),如何保證redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)蛹稍?
redis內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候吧黄,就會(huì)施行數(shù)據(jù)淘汰策略。
13唆姐、Redis有哪些適合的場(chǎng)景拗慨?
(1)會(huì)話(huà)緩存(Session Cache)
最常用的一種使用Redis的情景是會(huì)話(huà)緩存(session cache)。用Redis緩存會(huì)話(huà)比其他存儲(chǔ)(如Memcached)的優(yōu)勢(shì)在于:Redis提供持久化。當(dāng)維護(hù)一個(gè)不是嚴(yán)格要求一致性的緩存時(shí)赵抢,如果用戶(hù)的購(gòu)物車(chē)信息全部丟失剧蹂,大部分人都會(huì)不高興的,現(xiàn)在烦却,他們還會(huì)這樣嗎宠叼?
幸運(yùn)的是,隨著 Redis 這些年的改進(jìn)其爵,很容易找到怎么恰當(dāng)?shù)氖褂肦edis來(lái)緩存會(huì)話(huà)的文檔冒冬。甚至廣為人知的商業(yè)平臺(tái)Magento也提供Redis的插件。
(2)全頁(yè)緩存(FPC)
除基本的會(huì)話(huà)token之外摩渺,Redis還提供很簡(jiǎn)便的FPC平臺(tái)简烤。回到一致性問(wèn)題证逻,即使重啟了Redis實(shí)例乐埠,因?yàn)橛写疟P(pán)的持久化,用戶(hù)也不會(huì)看到頁(yè)面加載速度的下降囚企,這是一個(gè)極大改進(jìn)丈咐,類(lèi)似PHP本地FPC。
再次以Magento為例龙宏,Magento提供一個(gè)插件來(lái)使用Redis作為全頁(yè)緩存后端棵逊。
此外,對(duì)WordPress的用戶(hù)來(lái)說(shuō)银酗,Pantheon有一個(gè)非常好的插件 wp-redis辆影,這個(gè)插件能幫助你以最快速度加載你曾瀏覽過(guò)的頁(yè)面。
(3)隊(duì)列
Reids在內(nèi)存存儲(chǔ)引擎領(lǐng)域的一大優(yōu)點(diǎn)是提供 list 和 set 操作黍特,這使得Redis能作為一個(gè)很好的消息隊(duì)列平臺(tái)來(lái)使用蛙讥。Redis作為隊(duì)列使用的操作,就類(lèi)似于本地程序語(yǔ)言(如Python)對(duì) list 的 push/pop 操作灭衷。
如果你快速的在Google中搜索“Redis queues”次慢,你馬上就能找到大量的開(kāi)源項(xiàng)目,這些項(xiàng)目的目的就是利用Redis創(chuàng)建非常好的后端工具翔曲,以滿(mǎn)足各種隊(duì)列需求迫像。例如,Celery有一個(gè)后臺(tái)就是使用Redis作為broker瞳遍,你可以從這里去查看闻妓。
(4)排行榜/計(jì)數(shù)器
Redis在內(nèi)存中對(duì)數(shù)字進(jìn)行遞增或遞減的操作實(shí)現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們?cè)趫?zhí)行這些操作的時(shí)候變的非常簡(jiǎn)單掠械,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)由缆。
所以注祖,我們要從排序集合中獲取到排名最靠前的10個(gè)用戶(hù)–我們稱(chēng)之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:
當(dāng)然犁功,這是假定你是根據(jù)你用戶(hù)的分?jǐn)?shù)做遞增的排序氓轰。如果你想返回用戶(hù)及用戶(hù)的分?jǐn)?shù),你需要這樣執(zhí)行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個(gè)很好的例子浸卦,用Ruby實(shí)現(xiàn)的署鸡,它的排行榜就是使用Redis來(lái)存儲(chǔ)數(shù)據(jù)的,你可以在這里看到限嫌。
(5)發(fā)布/訂閱
最后(但肯定不是最不重要的)是Redis的發(fā)布/訂閱功能靴庆。發(fā)布/訂閱的使用場(chǎng)景確實(shí)非常多。我已看見(jiàn)人們?cè)谏缃痪W(wǎng)絡(luò)連接中使用怒医,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器炉抒,甚至用Redis的發(fā)布/訂閱功能來(lái)建立聊天系統(tǒng)!
14稚叹、Redis支持的Java客戶(hù)端都有哪些焰薄?官方推薦用哪個(gè)?
Redisson扒袖、Jedis塞茅、lettuce等等,官方推薦使用Redisson季率。
15野瘦、Redis和Redisson有什么關(guān)系?
Redisson是一個(gè)高級(jí)的分布式協(xié)調(diào)Redis客服端飒泻,能幫助用戶(hù)在分布式環(huán)境中輕松實(shí)現(xiàn)一些Java的對(duì)象 (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對(duì)比有什么優(yōu)缺點(diǎn)泞遗?
Jedis是Redis的Java實(shí)現(xiàn)的客戶(hù)端惰许,其API提供了比較全面的Redis命令的支持;
Redisson實(shí)現(xiàn)了分布式和可擴(kuò)展的Java數(shù)據(jù)結(jié)構(gòu)史辙,和Jedis相比汹买,功能較為簡(jiǎn)單,不支持字符串操作髓霞,不支持排序卦睹、事務(wù)畦戒、管道方库、分區(qū)等Redis特性。Redisson的宗旨是促進(jìn)使用者對(duì)Redis的關(guān)注分離障斋,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務(wù)邏輯上纵潦。
17徐鹤、Redis如何設(shè)置密碼及驗(yàn)證密碼?
設(shè)置密碼:config set requirepass 123456
授權(quán)密碼:auth 123456
18邀层、說(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槽。
19秸谢、Redis集群的主從復(fù)制模型是怎樣的凛澎?
為了使在部分節(jié)點(diǎn)失敗或者大部分節(jié)點(diǎn)無(wú)法通信的情況下集群仍然可用,所以集群使用了主從復(fù)制模型,每個(gè)節(jié)點(diǎn)都會(huì)有N-1個(gè)復(fù)制品.
20估蹄、Redis集群會(huì)有寫(xiě)操作丟失嗎塑煎?為什么?
Redis并不能保證數(shù)據(jù)的強(qiáng)一致性臭蚁,這意味這在實(shí)際中集群在特定的條件下可能會(huì)丟失寫(xiě)操作最铁。
21、Redis集群之間是如何復(fù)制的垮兑?
異步復(fù)制
22冷尉、Redis集群最大節(jié)點(diǎn)個(gè)數(shù)是多少?
16384個(gè)甥角。
23网严、Redis集群如何選擇數(shù)據(jù)庫(kù)?
Redis集群目前無(wú)法做數(shù)據(jù)庫(kù)選擇嗤无,默認(rèn)在0數(shù)據(jù)庫(kù)震束。
24、怎么測(cè)試Redis的連通性当犯?
ping
25垢村、Redis中的管道有什么用?
一次請(qǐng)求/響應(yīng)服務(wù)器能實(shí)現(xiàn)處理新的請(qǐng)求即使舊的請(qǐng)求還未被響應(yīng)嚎卫。這樣就可以將多個(gè)命令發(fā)送到服務(wù)器嘉栓,而不用等待回復(fù),最后在一個(gè)步驟中讀取該答復(fù)拓诸。
這就是管道(pipelining)侵佃,是一種幾十年來(lái)廣泛使用的技術(shù)。例如許多POP3協(xié)議已經(jīng)實(shí)現(xiàn)支持這個(gè)功能奠支,大大加快了從服務(wù)器下載新郵件的過(guò)程馋辈。
26、怎么理解Redis事務(wù)倍谜?
事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化迈螟、按順序地執(zhí)行叉抡。事務(wù)在執(zhí)行的過(guò)程中,不會(huì)被其他客戶(hù)端發(fā)送來(lái)的命令請(qǐng)求所打斷答毫。
事務(wù)是一個(gè)原子操作:事務(wù)中的命令要么全部被執(zhí)行褥民,要么全部都不執(zhí)行。
27洗搂、Redis事務(wù)相關(guān)的命令有哪幾個(gè)消返?
MULTI、EXEC耘拇、DISCARD侦副、WATCH
28、Redis key的過(guò)期時(shí)間和永久有效分別怎么設(shè)置驼鞭?
EXPIRE和PERSIST命令秦驯。
29、Redis如何做內(nèi)存優(yōu)化挣棕?
盡可能使用散列表(hashes)译隘,散列表(是說(shuō)散列表里面存儲(chǔ)的數(shù)少)使用的內(nèi)存非常小,所以你應(yīng)該盡可能的將你的數(shù)據(jù)模型抽象到一個(gè)散列表里面洛心。
比如你的web系統(tǒng)中有一個(gè)用戶(hù)對(duì)象固耘,不要為這個(gè)用戶(hù)的名稱(chēng),姓氏词身,郵箱厅目,密碼設(shè)置單獨(dú)的key,而是應(yīng)該把這個(gè)用戶(hù)的所有信息存儲(chǔ)到一張散列表里面。
30法严、Redis回收進(jìn)程如何工作的损敷?
一個(gè)客戶(hù)端運(yùn)行了新的命令,添加了新的數(shù)據(jù)深啤。
Redi檢查內(nèi)存使用情況拗馒,如果大于maxmemory的限制, 則根據(jù)設(shè)定好的策略進(jìn)行回收。
一個(gè)新的命令被執(zhí)行溯街,等等诱桂。
所以我們不斷地穿越內(nèi)存限制的邊界,通過(guò)不斷達(dá)到邊界然后不斷地回收回到邊界以下呈昔。
如果一個(gè)命令的結(jié)果導(dǎo)致大量?jī)?nèi)存被使用(例如很大的集合的交集保存到一個(gè)新的鍵)挥等,不用多久內(nèi)存限制就會(huì)被這個(gè)內(nèi)存使用量超越。