一、緩存時,具體是key、value分別是怎樣的數據
首先Memcache是一個基于內存的key/value分布式緩存系統,不過memcache還可用于緩存其他東西,例如圖片、視頻等等。Redis是一個開源的基于內存亦可持久化的日志型、Key-Value的數據庫。
Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
大部分緩存實現時都是基于key/value形式,主要是緩存的使用場景決定的。另外,Redis是一種NoSQL數據庫,使用場景也不僅僅限于緩存。
Memcached通過使用key-value形式存儲和訪問數據,在內存中維護一張巨大的HashTable,使得對數據查詢的時間復雜度降低到O(1),保證了對數據的高性能訪問。
memcached是多線程,非阻塞IO復用的網絡模型,分為監聽主線程和worker子線程,監聽線程監聽網絡連接,接受請求后,將連接描述字pipe傳遞給worker線程,進行讀寫IO,網絡層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如:memcached最常用的stats命令,實際memcached所有操作都要對這個全局變量加鎖,進行技術等工作,帶來了性能損耗。
延伸閱讀:
二、Memcached內存管理機制
Memcached默認使用Slab Allocation機制管理內存,其主要思想是按照預先規定的大小,將分配的內存分割成特定長度的塊以存儲相應長度的key-value數據記錄,以完全解決內存碎片問題。Slab Allocation機制只為存儲外部數據而設計,也就是說所有的key-value數據都存儲在Slab Allocation系統里,而Memcached的其它內存請求則通過普通的malloc/free來申請,因為這些請求的數量和頻率決定了它們不會對整個系統的性能造成影響Slab Allocation的原理相當簡單。 如圖所示,它首先從操作系統申請一大塊內存,并將其分割成各種尺寸的塊Chunk,并把尺寸相同的塊分成組Slab Class。其中,Chunk就是用來存儲key-value數據的最小單位。每個Slab Class的大小,可以在Memcached啟動的時候通過制定Growth Factor來控制。假定圖中Growth Factor的取值為1.25,如果名列前茅組Chunk的大小為88個字節,第二組Chunk的大小就為112個字節,依此類推。