Redis

1、Redis爲什麼這麼快
答:
1. Redis是純內存數據庫,一般都是簡單的存取操作,線程佔用的時間很多,時間的花費主要集中在IO上,所以讀取速度快。
2. 再說一下IO,Redis使用的是非阻塞IO,IO多路複用,使用了單線程來輪詢描述符,將數據庫的開、關、讀、寫都轉換成了事件,減少了線程切換時上下文的切換和競爭。
3. Redis採用了單線程的模型,保證了每個操作的原子性,也減少了線程的上下文切換和競爭。
4. 另外,數據結構也幫了不少忙,Redis全程使用hash結構,讀取速度快,還有一些特殊的數據結構,對數據存儲進行了優化,如壓縮表,對短數據進行壓縮存儲,再如,跳錶,使用有序的數據結構加快讀取的速度。
5. 還有一點,Redis採用自己實現的事件分離器,效率比較高,內部採用非阻塞的執行方式,吞吐能力比較大
總結:純內存、瓶頸在IO、採用NIO、單線程、數據存儲結構

2、Redis爲什麼是單線程的?
答:
單線程指的是網絡請求模塊使用了一個線程(所以不需考慮併發安全性),其他模塊仍用了多個線程。
因爲CPU不是Redis的瓶頸。Redis的瓶頸最有可能是機器內存或者網絡帶寬。(以上主要來自官方FAQ)既然單線程容易實現,而且CPU不會成爲瓶頸,那就順理成章地採用單線程的方案了。關於redis的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求,

3、如果萬一CPU成爲你的Redis瓶頸了,或者,你就是不想讓服務器其他核閒置,那怎麼辦?
答:
那也很簡單,你多起幾個Redis進程就好了。Redis是keyvalue數據庫,又不是關係數據庫,數據之間沒有約束。只要客戶端分清哪些key放在哪個Redis進程上就可以了。redis-cluster可以幫你做的更好。

4、單線程可以處理高併發請求嗎?
答:
當然可以了,Redis都實現了。
有一點概念需要澄清,併發並不是並行。
(相關概念:併發性I/O流,意味着能夠讓一個計算單元來處理來自多個客戶端的流請求。並行性,意味着服務器能夠同時執行幾個事情,具有多個計算單元)



1. 使用Redis有哪些好處?
(1) 速度快,因爲數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)
(2) 支持豐富數據類型,支持string,list,set,sorted set,hash
(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

2. Redis相比memcached有哪些優勢?
(1) memcached所有的值均是簡單的字符串,redis作爲其替代者,支持更爲豐富的數據類型
(2) redis的速度比memcached快很多
(3) redis可以持久化其數據
(4)Redis支持數據的備份,即master-slave模式的數據備份。

(5)、使用底層模型不同

它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。

Redis直接自己構建了VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

(6)value大小:redis最大可以達到1GB,而memcache只有1MB

3. 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,其他不變。

redis的一些其他特點:
(1)Redis是單進程單線程的
redis利用隊列技術將併發訪問變爲串行訪問,消除了傳統數據庫串行控制的開銷
(2)讀寫分離模型
通過增加Slave DB的數量,讀的性能可以線性增長。爲了避免Master DB的單點故障,集羣一般都會採用兩臺Master DB做雙機熱備,所以整個集羣的讀和寫的可用性都非常高。
讀寫分離架構的缺陷在於,不管是Master還是Slave,每個節點都必須保存完整的數據,如果在數據量很大的情況下,集羣的擴展能力還是受限於單個節點的存儲能力,而且對於Write-intensive類型的應用,讀寫分離架構並不適合。
(3)數據分片模型
爲了解決讀寫分離模型的缺陷,可以將數據分片模型應用進來。
可以將每個節點看成都是獨立的master,然後通過業務實現數據分片。
結合上面兩種模型,可以將每個master設計成由一個master和多個slave組成的模型。
(4)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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章