memcached的故事

缓存的故事

编者注:这是基本的memcached用例的概述,以及memcached客户端的工作方式

两位冒险者,程序员和系统管理员,他们出发了。他们一起制作网站。具有Web服务器和数据库的网站。来自Internet各地的用户与Web服务器进行对话,并要求他们为它们创建页面。网络服务器向数据库索要创建页面所需的垃圾----程序员代码/数据,因此Sysadmin构建了Web服务器和数据库服务器。

有一天,系统管理员意识到他们的数据库生病了!到处都是胆汁和红色的东西!Sysadmin宣布服务器发烧,平均负载为20!程序员问Sysadmin: “那我们能做什么?” Sysadmin说:“我听说有一个超棒的缓存模块叫memcached。 “好吧,让我们试试吧!” 程序员说。

我们笨拙的Sysadmin监视着他的六个Web服务器,他决定使用其中三个来做“内存缓存”服务器。Sysadmin向每台Web服务器添加1 GB的ram,然后启动内存缓存,每个内存限制为1 GB。因此,他有三个内存缓存实例,每个实例最多可容纳1 GB数据。因此,程序员和Sysadmin退后一步,看到他们光荣的内存缓存!

“那么现在怎么办?” 他们说:“什么都没做!” Memcached并没有说话,它们当然也没有任何数据。现在他们的数据库负载上升为30!

我们喜欢冒险的程序员可以获取pecl / memcache客户端库手册,该手册已由笨拙的Sysadmin帮助安装在所有SIX Web服务器上。“从不畏惧!” 他说。“我有一个主意!” 他获取三个内存缓存的IP地址和端口号,并将它们添加到php中的数组中。

$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1
    "10.1.1.2", //web2
    "10.1.1.3", //web3
);

然后,他创建了一个对象,他巧妙地将其称为“ $ memcache”。

$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer ( $server );
}

现在, 程序员 思考,思考,思考。“我知道!” 他说。“正在运行的首页上有这个东西SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000;,得到运行结果需要五秒钟!” 他说:“让我们将其放入内存缓存中。” 因此,他为SELECT包装了代码,并使用了$ memcache对象。他的代码要求:

此选择的结果是否在memcache中?如果不是,请运行查询,获取结果,然后将其放入内存缓存中!像这样:

$huge_data_for_front_page = $memcache->get("huge_data_for_front_page");
if($huge_data_for_front_page === false){
    $huge_data_for_front_page = array();
    $sql = "SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000";
    $res = mysql_query($sql, $mysql_connection);
    while($rec = mysql_fetch_assoc($res)){
        $huge_data_for_front_page[] = $rec;
    }
    // cache for 10 minutes
    $memcache->set("huge_data_for_front_page", $huge_data_for_front_page, 0, 600);
}

// use $huge_data_for_front_page how you please

程序员推送代码。Sysadmin出汗。AM!数据库负载降至10!该网站现在非常快。系统管理员感到困惑:“底发生了什么!?” Sysadmin迅速学习了ascii协议和telnet到每个缓存服务器的11211端口。 memcached并询问:

嘿,“获取huge_data_for_front_page”在吗?

第一个memcached无法回答…

第二个memcached无法回答…

但是,第三个内存缓存却在他的telnet会话中吐出了一大堆垃圾!有数据!只有memcached具有程序员缓存的密钥!

他不解,他在邮件列表上询问。他们都一致地回答:“这是一个分布式缓存!就是这样!” 但是,这是什么意思?Sysadmin仍然很困惑,对他的生活有些恐惧,他要求程序员再缓存一些东西。Sysadmin说:“让我们看看会发生什么。我们很好奇。我们可以弄清楚这一点。”

程序员说:“嗯,还有另一个查询并不是很慢,而是每秒运行100次。也许会有所帮助。” 因此,他像以前一样将其包裹起来。果然,服务器负载下降到8个!

因此,程序员编码越来越多的东西被缓存。他使用新技术。他说:“我在清单和常见问题上都找到了它们!真是个好家伙。” 数据库负载下降;7、5、3、2、1!

“好吧,”系统管理员说,“让我们再试一次。” 现在,他查看图表。所有的memcacheds都在运行!他们都收到请求!这很棒!他们都用完了!

因此,他再次获取程序员使用的密钥,并在其内存缓存服务器中寻找它们。‘get this_key’'get that_key’但是每次他这样做时,他只会在一个内存缓存中找到每个密钥!他想,为什么现在要这样做呢?他整夜困惑。真傻!您不希望这些密钥位于所有memcached上吗?

他认为,“但是等等”,他认为“我给每个内存缓存1 GB的内存,这意味着我总共可以缓存3 GB的数据库,而不是一个!”噢,这太好了,”他认为。“这将为我节省大量现金。布拉德·菲茨帕特里克,我爱你!”

“但是,下一个问题,这是一个令人困惑的问题,这是这里的网络服务器,这个正在运行的内存缓存已经过时了,很生病,需要升级。但是要做到这一点,我必须将其脱机!这将会发生什么!到我们贫穷的内存缓存集群中去?嗯,让我们找出答案。” 现在他看他的图。“哦,是的,数据库负载大步上升!负载不是一个,现在是两个。嗯,但是还是可以容忍的。所有其他内存缓存仍在获取流量。这还不是很糟糕。只是一个几乎没有缓存丢失,我的工作几乎完成了,所以他重新启动了机器,并让memcached恢复工作。几分钟后,数据库负载又降回了原来的1。

“缓存已经恢复了!我现在就明白了。如果它不可用,那只是意味着我的一些请求被错过了。但这不足以杀死我。这真是太好了。”

因此,程序员和Sysadmin继续构建网站。他们继续缓存。如有疑问,他们会询问邮件列表或再次阅读常见问题解答。他们看他们的图表。所有人从此过上幸福的生活。

作者:通过IRC的Dormando。由Brian Moon编辑,很有趣。Emufarmers进一步有趣的编辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值