Memcached之服務(wù)器端

Cache

緩存是架構(gòu)之利器,在高并發(fā)的互聯(lián)網(wǎng)中,是殺手锏的武器。我們會(huì)通過一些列的文章來介紹緩存相關(guān)的工具(包括memcached, redis), 緩存的架構(gòu)設(shè)計(jì)以及緩存的相關(guān)實(shí)踐。本文作為第一篇,和大家一起討論Memcached之服務(wù)器端。

簡介

Memcached是一款開源、高性能的分布式且基于key/value的內(nèi)存緩存系統(tǒng)。它看起來非常簡單,快速的部署、簡單易用,但是卻在互聯(lián)網(wǎng)的大廠充頻繁使用,比如:twitter, facebook, 微博,大眾點(diǎn)評(píng)等。

組成

  • 服務(wù)端 保存數(shù)據(jù)在內(nèi)部的hash table里面
  • LRU 決定清楚舊的數(shù)據(jù)或者重用merory
  • 客戶端 保存有效的服務(wù)器列表,實(shí)現(xiàn)路由算法來選擇服務(wù)器

設(shè)計(jì)理念

  • 簡單K/V存儲(chǔ) 存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)是預(yù)先序列化好的,服務(wù)器端不需要知道你的數(shù)據(jù)結(jié)構(gòu)。它組成為:key, value, 失效時(shí)間,optional flags.
  • 邏輯一半在服務(wù)器端,一半在客戶端。服務(wù)器端保存和獲取數(shù)據(jù),刪除數(shù)據(jù)或者重用內(nèi)存??蛻舳司S護(hù)可用的服務(wù)列表,覺得路由選擇。
  • 服務(wù)器之間互相不通信。每個(gè)服務(wù)器之間都是孤島,不通信,不廣播。
  • 客戶端 保存有效的服務(wù)器列表,實(shí)現(xiàn)路由算法來選擇服務(wù)器
  • O(1) 快速的操作速度,每秒近百萬的吞吐量。
  • LRU失效,失效的空間將被重新使用。

內(nèi)存存儲(chǔ)

使用Slab allocation機(jī)制分配和管理內(nèi)存。它的原理是:預(yù)先按照規(guī)定的大小,將內(nèi)存劃分為不同的塊 (chunk), 并把大小相同的塊分成組(Slab, collection of chunks)。失效的塊不會(huì)釋放到內(nèi)存中,而是重復(fù)利用。

  • Page: 分配給Slab的空間,默認(rèn)為1M
  • Chunk: 用于存放緩存的空間
  • Slab: 特定大小的Chunk集合
    所以它內(nèi)部可以成Slab集合 Slab1 [chunk1, chunk2, chunk3 ...], Slab2 [chunkx1, chunkx2, chunkx3...]。Memcached根據(jù)收到的數(shù)據(jù)大小,選擇合適的Slab,讓后將數(shù)據(jù)放到chunk中。
    注意:Memcached中的chunk大小是預(yù)先設(shè)定了的,比如Chunk設(shè)置為88K, 但是存放的數(shù)據(jù)為66K,則存在22K的剩余,這部分就浪費(fèi)掉了。但是相對(duì)傳統(tǒng)內(nèi)存的malloc和free, 則煎炒了系統(tǒng)的內(nèi)存碎片,降低了操作系統(tǒng)管理內(nèi)存的負(fù)擔(dān)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容