1. 使用 Redis有哪些好處?
速度快胀滚,因為數(shù)據(jù)存在內(nèi)存中趟济,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時間復(fù)雜度都是O(1)
支持豐富數(shù)據(jù)類型咽笼,支持string顷编,list,set剑刑,sorted set媳纬,hash
支持事務(wù),操作都是原子性施掏,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行钮惠,要么全部不執(zhí)行
豐富的特性:可用于緩存,消息七芭,按key設(shè)置過期時間素挽,過期后將會自動刪除
2. redis相比memcached有哪些優(yōu)勢?
memcached所有的值均是簡單的字符串狸驳,redis作為其替代者预明,支持更為豐富的數(shù)據(jù)類型
redis的速度比memcached快很多
redis可以持久化其數(shù)據(jù)
3. redis常見性能問題和解決方案:
Master最好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件
如果數(shù)據(jù)比較重要锌历,某個Slave開啟AOF備份數(shù)據(jù)贮庞,策略設(shè)置為每秒同步一次
為了主從復(fù)制的速度和連接的穩(wěn)定性峦筒,Master和Slave最好在同一個局域網(wǎng)內(nèi)
盡量避免在壓力很大的主庫上增加從庫
主從復(fù)制不要用圖狀結(jié)構(gòu)究西,用單向鏈表結(jié)構(gòu)更為穩(wěn)定,即:Master <- Slave1 <- Slave2 <- Slave3...
這樣的結(jié)構(gòu)方便解決單點(diǎn)故障問題物喷,實現(xiàn)Slave對Master的替換卤材。如果Master掛了,可以立刻啟用Slave1做Master峦失,其他不變扇丛。
4. MySQL里有2000w數(shù)據(jù),redis中只存20w的數(shù)據(jù)尉辑,如何保證redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)
相關(guān)知識:redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候帆精,就會施行數(shù)據(jù)淘汰策略。redis 提供 6種數(shù)據(jù)淘汰策略:
- voltile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
- volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
- volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
- allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
- allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
- no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
5. Memcache與Redis的區(qū)別都有哪些?
- 存儲方式
Memecache把數(shù)據(jù)全部存在內(nèi)存之中卓练,斷電后會掛掉隘蝎,數(shù)據(jù)不能超過內(nèi)存大小。
Redis有部份存在硬盤上襟企,這樣能保證數(shù)據(jù)的持久性嘱么。
- 數(shù)據(jù)支持類型
Memcache對數(shù)據(jù)類型支持相對簡單。
Redis有復(fù)雜的數(shù)據(jù)類型顽悼。
- 使用底層模型不同
它們之間底層實現(xiàn)方式 以及與客戶端之間通信的應(yīng)用協(xié)議不一樣曼振。
Redis直接自己構(gòu)建了VM 機(jī)制 ,因為一般的系統(tǒng)調(diào)用系統(tǒng)函數(shù)的話蔚龙,會浪費(fèi)一定的時間去移動和請求冰评。
- value大小
redis最大可以達(dá)到1GB,而memcache只有1MB
6. Redis 常見的性能問題都有哪些木羹?如何解決集索?
Master寫內(nèi)存快照,save命令調(diào)度rdbSave函數(shù),會阻塞主線程的工作裹纳,當(dāng)快照比較大時對性能影響是非常大的暴区,會間斷性暫停服務(wù),所以Master最好不要寫內(nèi)存快照函匕。
Master AOF持久化,如果不重寫AOF文件蚪黑,這個持久化方式對性能的影響是最小的盅惜,但是AOF文件會不斷增大,AOF文件過大會影響Master重啟的恢復(fù)速度忌穿。Master最好不要做任何持久化工作抒寂,包括內(nèi)存快照和AOF日志文件,特別是不要啟用內(nèi)存快照做持久化,如果數(shù)據(jù)比較關(guān)鍵掠剑,某個Slave開啟AOF備份數(shù)據(jù)屈芜,策略為每秒同步一次。
Master調(diào)用BGREWRITEAOF重寫AOF文件朴译,AOF在重寫的時候會占大量的CPU和內(nèi)存資源井佑,導(dǎo)致服務(wù)load過高,出現(xiàn)短暫服務(wù)暫兔呤伲現(xiàn)象躬翁。
Redis主從復(fù)制的性能問題,為了主從復(fù)制的速度和連接的穩(wěn)定性盯拱,Slave和Master最好在同一個局域網(wǎng)內(nèi)
7, redis 最適合的場景
Redis最適合所有數(shù)據(jù)in-momory的場景盒发,雖然Redis也提供持久化功能例嘱,但實際更多的是一個disk-backed的功能,跟傳統(tǒng)意義上的持久化有比較大的差別宁舰,那么可能大家就會有疑問蝶防,似乎Redis更像一個加強(qiáng)版的Memcached,那么何時使用Memcached,何時使用Redis呢?
如果簡單地比較Redis與Memcached的區(qū)別明吩,大多數(shù)都會得到以下觀點(diǎn):
- Redis不僅僅支持簡單的k/v類型的數(shù)據(jù)间学,同時還提供list,set印荔,zset低葫,hash等 數(shù)據(jù)結(jié)構(gòu)的存儲。
- Redis支持?jǐn)?shù)據(jù)的備份仍律,即master-slave模式的數(shù)據(jù)備份嘿悬。
- Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中水泉,重啟的時候可以再次加載進(jìn)行使用善涨。
- 會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis提供持久化草则。當(dāng)維護(hù)一個不是嚴(yán)格要求一致性的緩存時钢拧,如果用戶的購物車信息全部丟失,大部分人都會不高興的炕横,現(xiàn)在源内,他們還會這樣嗎?
幸運(yùn)的是份殿,隨著 Redis 這些年的改進(jìn)膜钓,很容易找到怎么恰當(dāng)?shù)氖褂肦edis來緩存會話的文檔。甚至廣為人知的商業(yè)平臺Magento也提供Redis的插件卿嘲。 - 全頁緩存(FPC)
除基本的會話token之外颂斜,Redis還提供很簡便的FPC平臺∈霸妫回到一致性問題沃疮,即使重啟了Redis實例,因為有磁盤的持久化放前,用戶也不會看到頁面加載速度的下降忿磅,這是一個極大改進(jìn)糯彬,類似 PHP本地FPC凭语。
再次以Magento為例,Magento提供一個插件來使用Redis作為 全頁緩存后端撩扒。
此外似扔,對WordPress的用戶來說吨些,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面炒辉。 - 隊列
Reids在內(nèi)存存儲引擎領(lǐng)域的一大優(yōu)點(diǎn)是提供 list 和 set 操作豪墅,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作黔寇,就類似于本地程序語言(如 Python)對 list 的 push/pop 操作偶器。
如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項目缝裤,這些項目的目的就是利用Redis創(chuàng)建非常好的后端工具屏轰,以滿足各種隊列需求。例如憋飞,Celery有一個后臺就是使用Redis作為broker霎苗,你可以從 這里去查看。 - 排行榜/計數(shù)器
Redis在內(nèi)存中對數(shù)字進(jìn)行遞增或遞減的操作實現(xiàn)的非常好榛做。集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變的非常簡單唁盏,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)。所以检眯,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”厘擂,我們只需要像下面一樣執(zhí)行即可:
當(dāng)然,這是假定你是根據(jù)你用戶的分?jǐn)?shù)做遞增的排序锰瘸。如果你想返回用戶及用戶的分?jǐn)?shù)驴党,你需要這樣執(zhí)行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現(xiàn)的获茬,它的排行榜就是使用Redis來存儲數(shù)據(jù)的港庄,你可以在 這里看到。 - 發(fā)布/訂閱
最后(但肯定不是最不重要的)是Redis的發(fā)布/訂閱功能恕曲。發(fā)布/訂閱的使用場景確實非常多鹏氧。我已看見人們在社交網(wǎng)絡(luò)連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器佩谣,甚至用Redis的發(fā)布/訂閱功能來建立聊天系統(tǒng)0鸦埂(不,這是真的茸俭,你可以去核實)吊履。
Redis提供的所有特性中,我感覺這個是喜歡的人最少的一個调鬓,雖然它為用戶提供如果此多功能艇炎。