1 Redis中key和value存儲大小的限制:key和value大小最大不超過512M
2 Redis優化,為何key-value要存byte數組:可以提高存取效率,並且在底層存儲中節省空間。(Redis優化,為何key-value要存byte數組)
3 redis是多線程還是單線程?(https://blog.csdn.net/bird73/article/details/79792548)
單線程指的是網絡請求模塊使用了一個線程(所以不需考慮並發安全性),即一個線程處理所有網絡請求,其他模塊仍用了多個線程。
4 redis 可以能夠快速執行的原因:
(1) 絕大部分請求是純粹的內存操作(非常快速)
(2) 采用單線程,避免了不必要的上下文切換和競爭條件
(3) 非阻塞IO - IO多路復用(IO 多路復用是什么意思?)
IO多路復用中有三種方式:select,poll,epoll。需要注意的是,select,poll是線程不安全的,epoll是線程安全的
redis內部實現采用epoll,采用了epoll+自己實現的簡單的事件框架。epoll中的讀、寫、關閉、連接都轉化成了事件,然后利用epoll的多路復用特性,絕不在io上浪費一點時間 這3個條件不是相互獨立的,特別是第一條,如果請求都是耗時的,采用單線程吞吐量及性能可想而知了。應該說redis為特殊的場景選擇了合適的技術方案。
5. Redis關於線程安全問題
redis實際上是采用了線程封閉的觀念,把任務封閉在一個線程,自然避免了線程安全問題,不過對於需要依賴多個redis操作的復合操作來說,依然需要鎖,而且有可能是分布式鎖。
6 使用Redis有哪些好處?
(1) 速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間復雜度都是O(1)
(2) 支持豐富數據類型,支持string,list,set,sorted set,hash
(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要么全部執行,要么全部不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期后將會自動刪除
7. Redis相比memcached有哪些優勢?
8 Redis常見性能問題和解決方案:
(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日志文件;(Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照;AOF文件過大會影響Master重啟的恢復速度)
(2) 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次
(3) 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個局域網內
(4) 盡量避免在壓力很大的主庫上增加從庫
(5) 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...;這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。
9. Redis的回收策略
volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據
注意這里的6種機制,volatile和allkeys規定了是對已設置過期時間的數據集淘汰數據還是從全部數據集淘汰數據,后面的lru、ttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不回收的策略。
使用策略規則:
1、如果數據呈現冪律分布,也就是一部分數據訪問頻率高,一部分數據訪問頻率低,則使用allkeys-lru
2、如果數據呈現平等分布,也就是所有的數據訪問頻率都相同,則使用allkeys-random
10. 五種I/O模型介紹
IO 多路復用是5種I/O模型中的第3種,對各種模型講個故事,描述下區別: 故事情節為:老李去買火車票,三天后買到一張退票。參演人員(老李,黃牛,售票員,快遞員),往返車站耗費1小時。 1.阻塞I/O模型 老李去火車站買票,排隊三天買到一張退票。 耗費:在車站吃喝拉撒睡 3天,其他事一件沒干。 2.非阻塞I/O模型 老李去火車站買票,隔12小時去火車站問有沒有退票,三天后買到一張票。 耗費:往返車站6次,路上6小時,其他時間做了好多事。 3.I/O復用模型 1.select/poll 老李去火車站買票,委托黃牛,然后每隔6小時電話黃牛詢問,黃牛三天內買到票,然后老李去火車站交錢領票。 耗費:往返車站2次,路上2小時,黃牛手續費100元,打電話17次 2.epoll 老李去火車站買票,委托黃牛,黃牛買到后即通知老李去領,然后老李去火車站交錢領票。 耗費:往返車站2次,路上2小時,黃牛手續費100元,無需打電話 4.信號驅動I/O模型 老李去火車站買票,給售票員留下電話,有票后,售票員電話通知老李,然后老李去火車站交錢領票。 耗費:往返車站2次,路上2小時,免黃牛費100元,無需打電話 5.異步I/O模型 老李去火車站買票,給售票員留下電話,有票后,售票員電話通知老李並快遞送票上門。 耗費:往返車站1次,路上1小時,免黃牛費100元,無需打電話 1同2的區別是:自己輪詢 2同3的區別是:委托黃牛 3同4的區別是:電話代替黃牛 4同5的區別是:電話通知是自取還是送票上門
11 redis的持久化開啟了RDB和AOF下重啟服務是如何加載的?
Redis 持久化之RDB和AOF ;
https://www.jianshu.com/p/9cdf6c6d4cb0
理解Redis的持久化機制:RDB和AOF
Redis 默認開啟RDB持久化方式,在指定的時間間隔內,執行指定次數的寫操作,則將內存中的數據寫入到磁盤中。
RDB 持久化適合大規模的數據恢復但它的數據一致性和完整性較差。
Redis 需要手動開啟AOF持久化方式,默認是每秒將寫操作日志追加到AOF文件中。
AOF 的數據完整性比RDB高,但記錄內容多了,會影響數據恢復的效率。
Redis 針對 AOF文件大的問題,提供重寫的瘦身機制。
若只打算用Redis 做緩存,可以關閉持久化。
若打算使用Redis 的持久化。建議RDB和AOF都開啟。其實RDB更適合做數據的備份,留一后手。AOF出問題了,還有RDB。
注意點:
SHUTDOWN 和 FLUSHALL 命令都會觸發RDB快照,
RDB和AOF可以同時存在,且優先加載AOF文件。
- FLUSHALL 清空整個 Redis 服務器的數據(幾乎不用)
- SHUTDOWN 關機走人(很少用)
12 redis如果做集群該如何規划?AKF/CAP如何實現和設計?
13 10萬用戶一年365天的登錄情況如何用redis存儲,並快速檢索任意時間窗內的活躍用戶?
14 redis的5種Value類型你用過幾種,能舉例嗎?
15 100萬並發4G數據,10萬並發400G數據,如何設計Redis存儲方式?
3、redis實現活躍用戶/用戶統計
4、redis實現秒殺/搶購
5、redis實現排行榜/評論列表
6、redis實現推薦系統/抽獎/商品詳情頁
1、linux系統的支持:fork、copy on write
2、redis的持久化:RDB、AOF、RDB&AOF混合使用
3、通過redis學AKF划分原則、CAP定理
4、redis vs zookeeper分布式鎖的探索
5、redis壓力測試、調優點
redis存儲對象與對象序列化詳解
