Redis常見問題彙總
摘要:
1、什麼是Redis?
Redis是一個開源、高效能、基於鍵值對的快取與儲存系統。
2、Redis相比memcached有哪些優勢?
劣勢:Redis是單執行緒,Memcached是多執行緒,在多核伺服器上後者的效能理論上會更高一些。
優勢:隨著Redis3.0的推出,標誌著mem...
1、什麼是Redis?
Redis是一個開源、高效能、基於鍵值對的快取與儲存系統。
2、Redis相比memcached有哪些優勢?
劣勢:Redis是單執行緒,Memcached是多執行緒,在多核伺服器上後者的效能理論上會更高一些。 優勢:隨著Redis3.0的推出,標誌著memcache的所有功能都已經成了Redis的子集。同時Redis對叢集的支援使得Memcache原有的第三方叢集工具不再成為優勢。因此,在新專案中使用Redis替代Memcache將會是非常好的選擇。
3、Redis支援哪幾種資料型別?適合儲存的資料型別?使用場景【5種 】
(1)字串型別(Key-Value 使用最多的型別 (2)雜湊型別(Hash)適合儲存物件 (3)列表型別(List) (4)集合型別(Set) (5)有序集合型別(Zset)
4、Redis主要消耗什麼物理資源?
記憶體
5、Redis的全稱是什麼?
Remote Dictionary Server(遠端資料服務)
6、Redis有哪幾種資料淘汰策略?
共六種資料淘汰策略。(分三類) 一、從已設定過期的資料集 1、volatile-lru:從已設定過期時間的資料集中,選擇最近最少使用的資料淘汰 2、volatile-ttl:從已設定過期時間的資料集中,選擇將要過期的資料淘汰 3、volatile-random:從已設定過期時間的資料集中,任意選擇資料淘汰 二、從整體資料集 4、allkeys-lru:從全資料集中,選擇最近最少使用的資料淘汰 5、allkeys-random:從全資料集中任意選擇資料淘汰 三、驅逐(預設策略-直接返回錯誤) 6、noenviction(驅逐):不刪除任意資料(但redis還會根據引用計數器進行釋放),這時如果記憶體不夠時,會直接返回錯誤
7、Redis官方為什麼不提供Windows版本?
目前Linux版本已經相當穩定,使用者量很大,無需開發windows版本,反而會帶來相容性等問題。
8、字串型別儲存的最大容量?
512M。
9、為什麼Redis需要把所有資料放到記憶體中?
記憶體存取遠比磁碟IO快得多。
10、Redis叢集方案應該怎麼做?都有哪些方案?
1、Twemproxy,推特的開源方案。它會以一個代理的身份接收請求並使用一致性hash演算法,將請求轉接到具體redis,將結果再返回twemproxy。 問題:redis節點數量改變時候,資料無法自動移動到新的節點。 2、Codis,豌豆莢的開源方案。目前使用最多的叢集方案,基本和twemproxy一致的效果,它支援在 節點數量改變情況下,舊節點資料可恢復到新hash節點。 3、Redis cluster3.0自帶的叢集,特點:他的分散式演算法不是一致性hash,而是hash槽,以及自身支援節點設定從節點。 4、業務程式碼層實現,在程式碼層,對key 進行hash計算,然後去對應的redis例項操作資料。 這種方式對hash層程式碼要求比較高,需要重點考慮的是,節點失效後的替代演算法方案,資料震盪後的自動指令碼恢復,例項的監控,等等。
11、Redis叢集方案什麼情況下會導致整個叢集不可用?
有A,B,C三個節點的叢集,在沒有複製模型的情況下,如果節點B失敗了,那麼整個叢集就會因為缺少5501-11000這個範圍的槽而不可用。資料丟失
12、有2000w資料,Redis只存20w,如何保證Redis中都是熱點資料?
先計算下這20W條資料佔用的記憶體,設定最大可用記憶體,當記憶體中的資料集達到上限時,redis就會啟動LRU(資料淘汰策略)。
13、Redis應用場景?
1、會話快取(Session Cache) 例如:分散式登入資訊,購物車資訊,能提供持久化。 2、全頁快取(FPC) 除基本的會話token之外,Redis還提供很簡便的FPC平臺。即使重啟了Redis例項,因為有磁碟的持久化,使用者也不會看到頁面載入速度的下降 3、佇列 由於支援 list 和 set 操作,這使得Redis能作為一個很好的訊息佇列平臺來使用 4、排行榜/計數器 incrrange 5、釋出/訂閱
14、Redis支援的Java客戶端都有哪些?官方推薦用哪個?
Redisson、Jedis等等,官方推薦使用Redisson。
15、Redis和Redisson有什麼關係?
Redisson是一個高階的、分散式協調Redis客戶端。
16、Jedis與Redisson對比有什麼優缺點?
1、Jedis是Redis的Java實現的客戶端,其API提供了比較全面的Redis命令的支援; 2、Redisson實現了分散式和可擴充套件的Java資料結構,和Jedis相比,功能較為簡單,不支援字串操作,不支援排序、事務、管道、分割槽等Redis特性。 3、Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
17、Redis如何設定密碼及驗證密碼?
設定密碼:兩種方式 需重啟redis:開啟redis.conf中的requirepass foobared 不重啟redis: config set requirepass 123456 驗證密碼:兩種方式 方式一、登入的時候驗證 例如:redis-cli-h 127.0.0.1 -p 6379 -a cfadata@2016 方式二、登入時不指定密碼,而在執行操作前進行認證。使用auth 命令認證。
18、Redis雜湊槽?
1、Redis 叢集中內建了 16384 個雜湊槽。 2、需要在 Redis 叢集中存一個 key-value時,Redis 先對 key 使用 crc16 演算法算出一個結果。 3、然後把結果對 16384 取模,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽。 4、Redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點。
19、Redis叢集的主從複製模型?
為了使在部分節點失敗或者大部分節點無法通訊的情況下叢集仍然可用,所以叢集使用了主從複製模型,每個節點都會有N-1個複製品
20、Redis叢集會有寫操作丟失嗎?
Redis並不能保證資料的強一致性,這意味這在實際中叢集在特定的條件下(使用的記憶體超過了最大可用記憶體(資料淘汰策略是noenviction(驅逐)的時候))可能會丟失寫操作。
21、Redis叢集之間是如何複製的?
非同步複製 初始化複製: 1、從資料庫啟動後,會向主資料庫傳送SYNC命令。 2、主資料庫收到SYNC後會在後臺儲存快照(RDB持久化過程),並將儲存快照期間接收到的命令快取起來。 3、快照完成後,Redis會將快照檔案和所有快取的命令傳送給從資料庫。 4、從資料庫收到快照後會載入快照檔案並執行快取命令。 執行中複製: 當主資料庫每當收到寫命令,就會將命令同步到從資料庫。 斷線重連機制: redis2.6之前,斷線重連後會進行全部複製(主資料庫的RDB檔案發給從資料庫) redis2.8之後,斷線重連後進行的是增量複製。
22、Redis叢集最大節點個數是多少?
16384個,但是建議最多有1000個節點。
23、Redis叢集如何選擇資料庫?
預設在0號資料庫。
24、怎麼測試Redis的連通性?
ping命令測試客戶端與redis服務連線是否正常,返回pong正常。
25、Redis中的管道有什麼用?
可以在服務端未響應時,客戶端可以繼續向服務端傳送請求,並最終一次性讀取所有服務端的響應。
26、Redis事務?
1、提供了命令打包,順序執行的機制。 2、命令入隊,先進先出。 3、帶 WATCH 命令的事務,當鍵對應的值被修改時,事務直接返回失敗,否則成功。 4、保證了一致性和隔離性,不保證原子性和永續性(Redis的事務不是一個完整的事務)。 參考: 深入理解Redis事務
27、Redis事務相關命令?
1、MULTI (開啟事務) 2、DISCARD (取消事務,如果正在使用 WATCH 命令監視某個(或某些) key,那麼取消所有監視,等同於執行命令 UNWATCH) 3、EXEC (執行事務) 4、WATCH (監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷)
28、Redis key的過期時間和永久有效分別怎麼設定?
1、過期時間:set key timeout value 2、永久有效:預設不設定過期時間(set key value)永久有效,但是如果實際使用記憶體超過你設定的最大記憶體,並且設定了資料淘汰策略,就會使用LRU刪除機制
29、Redis如何做記憶體優化?
應使用散列表(HashSst),適合儲存物件型別。儘可能的將資料模型抽象到一個散列表裡面。比如:使用者物件,不要為這個使用者的名稱,姓氏,郵箱,密碼設定單獨的key,而是應該把這個使用者的所有資訊儲存到一張散列表裡面。
30、Redis回收程序如何工作的?
1、客戶端接收到資料寫入請求後,Redis檢查記憶體使用情況,如果大於maxmemory的限制, 則根據設定好的策略進行回收。一個新的命令被執行。 2、所以我們不斷地穿越記憶體限制的邊界,通過不斷達到邊界然後不斷地回收回到邊界以下。
31、Redis回收使用的演算法?
LRU演算法。
32、Redis如何做大量資料插入?
Redis2.6開始redis-cli支援一種新的被稱之為pipe mode的新模式用於執行大量資料插入。
33、為什麼要做Redis分割槽?
分割槽使得我們本來受限於單臺計算機硬體資源的問題不再是問題,儲存不夠,計算資源不夠,頻寬不夠,我們都可以通過增加機器來解決這些問題。
34、Redis的分割槽實現方案?
1、客戶端分割槽:就是在客戶端就已經決定資料會被儲存到哪個redis節點或者從哪個redis節點讀取。大多數客戶端已經實現了客戶端分割槽。 2、代理分割槽 :意味著客戶端將請求傳送給代理,然後代理決定去哪個節點寫資料或者讀資料。代理根據分割槽規則決定請求哪些Redis例項,然後根據Redis的響應結果返回給客戶端。redis和memcached的一種代理實現就是Twemproxy 3、查詢路由(Query routing) :意思是客戶端隨機地請求任意一個redis例項,然後由Redis將請求轉發給正確的Redis節點。Redis Cluster實現了一種混合形式的查詢路由,但並不是直接將請求從一個redis節點轉發到另一個redis節點,而是在客戶端的幫助下直接redirected到正確的redis節點。
35、Redis分割槽有什麼缺點?
1、多鍵操作是不被支援的,比如我們將要批量操作的鍵被對映到了不同的Redis例項中。 2、多鍵的Redis事務是不被支援的。 3、分割槽的最小粒度是鍵,因此我們不能將關聯到一個鍵的很大的資料集對映到不同的例項。 4、當應用分割槽的時候,資料的處理是非常複雜的,比如我們需要處理多個rdb/aof檔案,將分佈在不同例項的檔案聚集到一起備份。 5、新增和刪除機器是很複雜的,例如Redis叢集支援幾乎執行時透明的因為增加或減少機器而需要做的rebalancing,然而像客戶端和代理分割槽這種方式是不支援這種功能的。
36、Redis持久化和快取怎麼做擴容?
1、如果Redis被當做快取使用,使用一致性雜湊實現動態擴容縮容。 2、如果Redis被當做一個持久化儲存使用,必須使用固定的keys-to-nodes對映關係,節點的數量一旦確定不能變化。否則的話(即Redis節點需要動態變化的情況),必須使用可以在執行時進行資料再平衡的一套系統,而當前只有Redis叢集可以做到這樣。
37、分散式Redis是前期做還是規模上來了再做好?為什麼?
1、一開始就做分割槽,遷移redis例項不用考慮分割槽 2、既然Redis是如此的輕量(單例項只使用1M記憶體),為防止以後的擴容,最好的辦法就是一開始就啟動較多例項。即便你只有一臺伺服器,你也可以一開始就讓Redis以分散式的方式執行,使用分割槽,在同一臺伺服器上啟動多個例項。 這樣的話,當你的資料不斷增長,需要更多的Redis伺服器時,你需要做的就是僅僅將Redis例項從一臺服務遷移到另外一臺伺服器而已(而不用考慮重新分割槽的問題)。一旦你添加了另一臺伺服器,你需要將你一半的Redis例項從第一臺機器遷移到第二臺機器。
38、Twemproxy是什麼?
Twemproxy 是一個Twitter開源的一個redis和memcache快速/輕量級代理伺服器;可以將其後端的多臺redis或memcached例項進行統一管理與分配,使應用程式只需要在Twemproxy 上進行操作,而不用關心後面具體有多少個真實的redis或memcached儲存。
39、支援一致性雜湊的客戶端有哪些?
Redis-rb、Predis等。
40、Redis與其他key-value儲存有什麼不同?
1、Redis有複雜的資料結構並且提供對他們的原子性操作。 2、Redis的資料型別都是基本資料結構的同時對程式設計師透明,無需進行額外的抽象。 3、Redis執行在記憶體中但是可以持久化到磁碟。 4、相同複雜的資料結構,在記憶體中操作比在磁碟操作更簡單。 5、磁碟格式方面是緊湊的以追加的方式產生的,並不需要進行隨機訪問。
41、如何降低Redis的記憶體使用情況?
利用Hash,List,Set,Sorted set(zset) 等集合型別資料,因為通常情況下很多小的Key-Value可以用更緊湊的方式存放到一起。
42、檢視Redis使用情況及狀態資訊用什麼命令?
INFO
43、Redis的記憶體用完了會發生什麼?
1、預設:如果達到設定的上限,寫命令會返回錯誤資訊(但是讀命令還可以正常返回) 2、配置淘汰機制:當Redis達到可用記憶體上限時會沖刷掉舊的資料。
44、Redis是單執行緒的,如何提高多核CPU利用率?
1、可以在同一個伺服器部署多個Redis的例項,並把他們當作不同的伺服器來使用。 2、如果你想使用多個CPU,你可以考慮一下分片(shard)。
45、一個Redis例項最多存多少key?集合最多能存多少元素?
理論上Redis可以處理2的32次方keys,任何list、set、和sorted set都可以放2的32次方個元素。
46、Redis常見效能問題和解決方案?
1、 Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案 2、如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次 3、為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內 4、避免在壓力很大的主庫上增加從庫 5、主從複製不要用網狀結構(類似n-1結構),用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。
47、Redis提供了哪幾種持久化方式?
提供了兩種持久化方式:AOF和RDB 區別是: AOF:append only file aof是將Redis執行的每一條命令追加到硬碟檔案中(儲存的執行命令) RDB:rdb是通過快照的方式將符合條件的資料持久化到硬碟(儲存的是命令執行後得到的資料) 持久化配置規則: save 900 20 (意思是900秒內 有超過20條資料寫入或修改,就會執行持久化操作)
48、如何選擇合適的持久化方式?
1、如果想達到足以媲美PostgreSQL的資料安全性, 你應該同時使用兩種持久化功能。 2、如果非常關心資料, 但仍然可以承受數分鐘以內的資料丟失,那麼可以只使用RDB持久化。 3、有很多使用者都只使用AOF持久化,但並不推薦這種方式:因為定時生成RDB快照(snapshot)非常便於進行資料庫備份, 並且 RDB 恢復資料集的速度也要比AOF恢復的速度要快。
49、修改配置不重啟Redis會實時生效嗎?
Config Set 命令可以動態地調整 Redis 伺服器的配置而無須重啟。
50、Redis在哪些情況下會對資料進行快照(RDB)?
1、根據配置規則進行自動快照。 2、使用者執行save或者bgsave命令。 3、執行flushall命令。 4、執行復制(replication)時。
51、關於快取擊穿的問題?
1、什麼是快取擊穿? 查詢一個在快取中必然不存在的資料,導致每次請求都要在資料庫中查詢。 2、沒快取和沒有快取的的系統吞吐量有多大的差別? 沒有用快取時,mysql的併發數在300(機械硬碟)-700(固態硬碟)之間(高效能伺服器)。一般的筆記本200個連線都撐不住。
52、快取失效、快取穿透、快取雪崩的產生原因和解決方案?
1、對空值也做快取,過期時間設定較短 2、對不符合規則的查詢值做過濾 3、用bitMap和布隆過濾器 4、設定KEY為不同的過期時間 快取失效: 產生原因:設定快取失效的時間過於集中,導致快取在同一時刻大面積失效。 解決辦法:可以為不同的key設定為不同的過期時間。 快取穿透: 產生原因:查詢一個在快取中必然不存在的資料,導致每次請求都要在資料庫中查詢。 解決辦法:1、對不符合規則的查詢值做過濾 2、用bitMap和布隆過濾器 3、空值也做快取 快取雪崩: 產生原因:快取雪崩就是指由於快取的原因,導致大量請求到達後端資料庫,從而導致資料庫崩潰,整個系統崩潰,發生災難。“快取併發”,“快取穿透”,“快取顛簸”等問題,其實都可能會導致快取雪崩現象發生。 解決辦法:從應用架構角度,我們可以通過限流、降級、熔斷等手段來降低影響,也可以通過多級快取來避免這種災難。
53、Redis伺服器高可用架構演變?
連線:如何搭建高可用的redis服務 (Redis高可用架構的演變)
54、為什麼單執行緒的Redis比多執行緒的memcache的效能高?
1、資料結構簡單 2、單執行緒無CPU切換效能損耗 3、沒有多執行緒加鎖問題
55、Redis是否是執行緒安全的?
執行緒安全的。(單執行緒沒有執行緒安全一說)
56、快取常見的問題?
快取一致性問題 快取併發 快取顛簸問題 快取失效 快取穿透 快取的雪崩現象 快取無底洞現象
57、快取失效時,併發訪問如何讓一個KEY只被載入一次,攔截其他的請求?
。。。
58、Redis的叢集模式是如何實現的?Redis的key是如何定址的?
四種實現方式: 1、推特的開源框架 twemproxy 代理 2、豌豆莢的 codis 代理 舊的資料可以對映到新的節點 3、Redis自帶的集權 Redis cluster3.0使用的是hash槽 4、程式碼層面實現注意資料震盪後的資料恢復 定址方式: