標籤:http io ar 使用 sp strong on 資料 問題
1、redis中的快取資料並不是都在記憶體中,redis在maxmemory或vm開啟並且vm-max-memory到達上限時出發置換操作用swap機制將部分value對象(冷資料)轉移至磁碟,同時將redisobj替換成VM pointer對象,標識value值在磁碟的儲存位置,分有阻塞跟非阻塞機制,所以redis可以儲存遠超容量本身的資料
2、網路io模型:Memcached是多線程,非阻塞IO複用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將串連描述字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多執行緒模式可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全域變數加鎖,進行計數等工作,帶來了效能損耗。
Redis使用單線程的IO複用模型,自己封裝了一個簡單的AeEvent事件處理架構,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、彙總等,對於這些操作,單執行緒模式實際會嚴重影響整體輸送量,CPU計算過程中,整個IO調度都是被阻塞住的。
3、記憶體管理方面
Memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,Item根據大小選擇合適的chunk儲存,記憶體池的方式可以省去申請/釋放記憶體的開銷,並且能減小記憶體片段產生,但這種方式也會帶來一定程度上的空間浪費,並且在記憶體仍然有很大空間時,新的資料也可能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
Redis跟據儲存命令參數,會把帶到期時間的資料單獨存放在一起,並把它們稱為臨時資料,非臨時資料是永遠不會被剔除的,即便實體記憶體不夠,導致swap也不會剔除任何非臨時資料(但會嘗試剔除部分臨時資料),這點上Redis更適合作為儲存而不是cache。
4、資料一致性問題
Memcached提供了cas命令,可以保證多個並發訪問操作同一份資料的一致性問題。Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。
5、儲存方式及其它方面
Memcached基本只支援簡單的key-value儲存,不支援枚舉,不支援持久化和複製等功能
Redis除key/value之外,還支援list,set,sorted set,hash等眾多資料結構,提供了KEYS進行枚舉操作,但不能線上上使用,如果需要枚舉線上資料,Redis還同時提供了持久化和複製等功能
memcached與redis的區別