redis深度理論

2021-10-11 19:03:59 字數 3078 閱讀 5008

建表:必須給出schema

型別:位元組寬度

存:傾向於行級儲存如果表有索引:

增刪改查變慢;

查詢速度

1.1個或者少量的查詢依然很快

2.併發大的時候會受到硬碟頻寬影響速度

相同:都是key---value的形式

不同:memcached沒有型別的概念,redis有型別的區分

首先,redis 是跑在單執行緒中的,所有的操作都是按照順序線性執行的,但是由於讀寫操作等待使用者輸入或輸出都是阻塞的,所以 i/o 操作在一般情況下往往不能直接返回,這會導致某一檔案的 i/o 阻塞導致整個程序無法對其它客戶提供服務,而 i/o 多路復用就是為了解決這個問題而出現的

1.epoll(預設主要)

2.select/poll

3.kqueue

epoll 沒有最大併發連線的限制,上限是最大可以開啟檔案的數目,這個數字一般遠大於 2048,

一般來說這個數目和系統記憶體關係很大

,具體數目可以 cat /proc/sys/fs/file-max 察看。

效率提公升, epoll 最大的優點就在於它

只管你「活躍」的連線

,而跟連線總數無關,因此在實際的網路環境中, epoll 的效率就會遠遠高於 select 和 poll 。

記憶體拷貝, epoll 在這點上使用了「

共享記憶體

」,這個記憶體拷貝也省略了。

select:能開啟的檔案描述符個數有限(最多1024個),如果有1k請求,使用者程序每次要把1k個檔案描述符傳送給核心,核心在內部輪詢後將可讀描述符返回,使用者程序再依次讀取。因為檔案描述符(fd)相關資料需要在使用者態和核心態之間拷來拷去,所以效能還是比較低;

poll:可開啟的檔案描述符數量提高,因為用鍊錶儲存,但效能仍然不夠,和select一樣資料需要在使用者態和核心態拷來拷去;

3. epoll(linux下多為技術):使用者態和核心態之間不用檔案描述符(fd)的拷貝,而是通過mmap技術實現開闢共享空間,所有fd用紅黑樹儲存,有返回結果的fd放在鏈結中,使用者程序通過鍊錶讀取返回結果,偽非同步i/o,效能較高。epoll分為水平觸發和邊緣觸發這兩種模式,et是邊緣觸發,lt是水平觸發,乙個表示只有在變化的邊際觸發,乙個表示在某個階段都會觸發;

1: int epoll_create(int size);

2: int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event );

控制某個 epoll 檔案描述符上的事件:註冊、修改、刪除。引數說明:

epfd 是 epoll_create() 建立 epoll 專用的檔案描述符。相對於 select 模型中的 fd_set 和 fd_clr 巨集;

op就是你要把當前這個套介面fd如何設定到epfd上邊去,一般由epoll提供的三個巨集指定:epoll_ctl_add,epoll_ctl_del,epoll_ctl_mod。

fd: 當事件發生時操作的目標套介面。

event指標就是你要給這個套介面fd繫結什麼事件。

3: int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout);

等待 i/o 事件的發生;引數說明:

epfd: 由 epoll_create() 生成的 epoll 專用的檔案描述符;

epoll_event: 用於回傳代處理事件的陣列;

maxevents: 返回的最大事件數;

timeout: 等待 i/o 事件發生的超時值(毫秒);

epoll_wait返回觸發的事件數。

9.epoll的lt和et模式的區別

lt模式:epoll就是乙個快速版poll,可讀可寫就緒條件和傳統poll一致

et模式:為了避免starvation,建議

1)檔案描述符設定為非阻塞

2)只在read或write返回eagain後,才能呼叫下一次epoll_wait

3)應用層維護乙個就緒鍊錶,進行輪詢,可以防止大量io時在乙個描述符上長期read或write(因為只有等到read

或 write返回eagain後才表示該描述符處理完畢)而令其它描述符starve

理解et的含義後,上面那些操作其實都是顯然的。以wirte為例說明,lt時只要有一定範圍的空閒寫快取區,每次epoll_wait都是可寫條件就 緒,但是et時從第一次可寫就緒後,epoll_wait不再得到該描述符可寫就緒通知直到程式使描述符變為非可寫就緒(比如write收到 eagain)後,epoll_wait才可能繼續收到可寫就緒通知(比如有空閒可寫快取)

其實et相對於lt來說,把檔案描述符狀態跟蹤的部分責任由核心空間推到使用者空間,核心只關心狀態切換即從未就緒到就緒切換時才通知使用者,至於保持就緒 狀態的,核心不再通知使用者,這樣在實現非阻塞模型時更方便,不需要每次操作都先檢視檔案描述符狀態。上述多數內容取自man epoll

rdb使用的是:fork(系統呼叫)和copy on write(核心機制)

rdb會要是用fork()建立乙個子程序,子程序記錄的是建立時間節點的資料。

copy on write: 寫時複製

在fork子程序的時候,只拷貝指標,並不發生記憶體的複製。

只有當其中的某乙個程序試圖對該區域進行寫操作時,核心就會在物理儲存器中為子程序開闢乙個新的物理頁面,將需要寫的區域將父程序的內容複製乙份給子程序,然後對新的物理頁面進行寫操作。

這時就是實現了對不同程序的操作而不會產生影響其他的程序,同時也節省了很多的物理儲存器。

並且根據經驗來看,不可能父子程序將所有資料都改一遍。下圖redis也用了這個機制,而且redis的子程序不會去修改資料:

redis呼叫fork,現在有了子程序和父程序。

父程序繼續處理client請求,子程序負責將記憶體內容寫入到臨時檔案。由於os的寫時複製機制(copy on write)父子程序會共享相同的物理頁面,當父程序處理寫請求時os會為父程序要修改的頁面建立副本,而不是寫共享的頁面。所以子程序的位址空間內的資料是fork時刻整個資料庫的乙個快照。

當子程序將快照寫入臨時檔案完畢後,用臨時檔案替換原來的快照檔案,然後子程序退出(fork乙個程序入內在也被複製了,即記憶體會是原來的兩倍)。

redis 的簡單理論

1.redis 的應用場景 會話快取 訊息佇列 排行榜,計數 發布訂閱,訊息通知 redis資料型別string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 redis的持久化方式1.rdb 快照 每隔一段時間對資料進行快照儲存。會丟失最後一次的快照 2.aof 持久化的...

深度學習基礎理論

1.卷積後特徵圖大小計算 方形的特徵輸入 i 方形的卷積核尺寸 k 每個維度相同的步長 s 每個維度相同的padding p 輸出特徵圖尺寸 o i 2p k s 1 2.反卷積 對於乙個 步長為s 的卷積而言,它的反卷積可以看作是在輸入特徵單元之間插入 s 1個0,將得到的特徵圖作為輸入特徵圖,然...

Caffe進行深度訓練(理論篇)

使用caffe框架進行深度學習訓練的流程如下 1 資料預處理 建立資料庫 2 網路結構與模型訓練的配置 3 訓練與再訓練 4 訓練日誌分析 5 檢驗與分析 6 效能測試 下面分別來分析各個流程的處理過程 1 資料預處理 建立資料庫 2 網路結構與模型訓練的配置 caffe採用讀入配置檔案的方式進行訓...