首页 > 互联网技术 > 了解memcached 以及memcached文档

了解memcached 以及memcached文档

2009年9月11日 3,045 views 发表评论 阅读评论

什么是memcached?

memcached是一个高性能的,分布式的内存对象缓存系统,通常用来降低数据库负荷从而加速动态web应用.

memcached如何工作?

用命令行的方式启动1个或者多个memcached实例,可部署于尽可能多的server,分布式的访问.

# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211 -c 4096

-m是应用2048M的内存; 32bit的系统只能应用4G的虚拟内存(通常还要小得多,和具体的os有关).我们的同学验证,大概32bit的系统,开到3G的内存,就会不怎么稳定了.

应用如何访问memcached?

代码,

如果需要查询数据,首先查询memcached是否已经缓存了数据,如果缓存了,就从memcached获取值返回而不是查询数据库,

如果返回一个undifined object,那么就去查询数据库,得到结果,然后保存在memcached里(不要忘记了这一步骤).

如果更新了数据,那么就从cache里删除数据.

一段perl代码.

Perl Example (see APIs page)

sub get_foo_object {

my $foo_id = int(shift);

my $obj = $::MemCache->get(“foo:$foo_id”);

return $obj if $obj;

$obj = $::db->selectrow_hashref(“SELECT …. FROM foo f, bar b “.

“WHERE … AND f.fooid=$foo_id”);

$::MemCache->set(“foo:$foo_id”, $obj);

return $obj;

}

memcached实际上保存了一个key-value的字典,我们赋值给key,然后通过key来取值.

php,perl等语言 都有相应的API来访问memcached,当初始化API时,你定义了所有可用的server以及它们的权值.

API哈希你的key到唯一的server.

(server buckets的取模值, 每个server ip/port为一个bucket,但内存更多的可以定义更高的权值).如果其中一台主机宕了,API重新映射dead hosts’ request到其他可用的server.

为什么不是用数据库来做?

不管何种数据库,实现关系数据库事务的ACID特性是一笔不小的开销,尤其是需要访问磁盘等待io. 对于MYISAM,虽然不是ACID-兼容,没有这种开销,但是读操作在写时会被阻塞.

memcached从不阻塞.且非常快.

It uses libevent to scale to any number of open connections (using epoll on Linux, if available at runtime), uses non-blocking network I/O, refcounts internal objects (so objects can be in multiple states to multiple clients), and uses its own slab allocator and hash table so virtual memory never gets externally fragmented and allocations are guaranteed O

为什么不用共享内存?

人们经常缓存数据在web进程,但这意味着我们缓存了多份重复的数据,这样浪费内存,且命中率很低.如果是多线程语言或者有共享内存API,我们可以有一个全局的cache,但还是不能跨机器.不能扩展到多台机器.

且单台共享内存一般有限制. 而memcached server和客户端协同工作可以实现一个跨越多台server的全局cache. 建议部署memcached(cpu-lite,memory-hungry)和web服务器(cpu-hungry,memory lite)部署在一起,这样可节省网络节点.

为什么不用mysql的query cache?

mysql的query cache里缓存数据很容易失效,只要table被更改,这个表的cache就失效,哪怕只是更改了一行数据.在一个更新频繁的站点,每秒更新几次,这样的cache没价值.实际上,打开query cache经常有害,因为维护cache也是要有开销的. 同样的,32bit的系统,Mysql cache收内存限制,而memcached扩展性好,没有这方面的限制. mysql的query 只保存查询结果集,如果有一些需要额外的昂贵的需再加工的数据要缓存,mysql的query cache帮不上你.

so,如果你要缓存的数据不是很大,且更新不是频繁,mysql的query cache是一个选择,否则,请使用memcched.

为什么不用数据库副本?

你可以读写分离,把读请求分流到各个数据库副本,这很有用,但是你不能分离写操作.(写必须在每台机器上操作). 而大量的写最终将消耗你所有资源.

或者我们使用水平分区的技术,把数据分割到不同的master/slave集群,这样就可以分离写操作,让你的应用连接不同的集群进行读写.但这样无疑增加了更多的数据库(更多的磁盘),从统计上说会导致更频繁的硬件错误.对于不稳定的数据库(如tc),出错的概率也大大增加了.这是比较让人心烦的事.

而使用memcached你可以降低你的数据库读到很小的值,而让数据库专注于不频繁的更新,最终以较小代价获得更多回报,因为你的数据库将不会在做ACID操作时阻塞自己 或者 等待写操作完成.

memcached如何处理竞争条件?

memcached只有一种方法get data.

但有3种方法put data.

set — 无条件设置一个值

add — 如果值不存在,添加到cache

replace — 仅在key存在时set值.(很少用)

所有以上三种支持过期策略.

memcached安全吗?

访问memcached没有用户名和密码的保护,所以需要额外的安全措施.

阻止外部访问:防火墙限制;

加密要cache的数据

选择难懂的key: 没有什么办法获得一个key-value列表,要获取数据,首先知道相关的key.所以不要使用很简单明细清楚的key.

memcached适用场合?

存储 频繁访问的用户帐号,session数据

存储 消耗资源大的操作的结果    #最好使用debug日志判别那些是消耗最大代价的数据库操作,那么我们就可以缓存此部分结果.

——————————

推荐读:How to Dramatically Speed Up Your Web Application: An Introduction

有段话值得留意.

No doubt if you took Computer Science in school you were cautioned of the temptation to abuse caches because there is a law of diminishing returns in regards to the size of your cache: the larger your cache gets the more costly it is retrieve and store information within it. Memcache however is not heavily constrained in this way, because the cache at large is made up of lots of little caches. This allows memcached to be much more responsive even when the cache itself begins to reach sizes that might be really inefficient in other circumstances.
#memcached 快到容量限制了,效率就会大降,这点研发同学也有说过,这时ms写不进去了.实际上我认为这应该是remove旧数据带来的后遗症(未验证).memcached可以设置到达限制后,返回错误.或者移除旧数据.

Finally, memcached is fast. It utilizes highly efficient, non-blocking networking libraries to ensure that memcached is always fast even under heavy load. In other words, in circumstances where your database might be falling over, memcached won’t be. Which is precisely what memcache was designed to do: to take the load off of your database, which for the majority of popular web applications is the biggest performance bottleneck and risk to scalability.

参考 如何监控memcached的状态

一个有趣的故事.

memcached的文档,建议细细阅读.

 » 如果喜欢可以: 点此订阅本站
分类: 互联网技术 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.