memcached简介

memcached简介

翻译: gashero

目录

主要取自 memcached 的主页。

memcached的Python客户端下载地址为 python-memcached

1   什么是memcached

memcached是一个高性能的、分布式内存对象缓存系统,尽管很通用,但是用来加速WEB应用、降低数据库负载时比较多。

Danga Interactive 开发了memcached用来提高 LiveJournal.com 的速度,这个站点每天处理2000万以上的动态页面请求,独立用户有100万左右。memcached把数据库的负载降到了几乎没什么事可干的地步,并为用户提供很快的页面响应速度,更好的资源利用率和更快的数据库存取操作。

2   它如何工作

首先启动一个memcached监护进程,监护进程不需要配置文件,只要在命令行里面加三四个参数就可以了:

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

这里指定使用2GB内存,监听10.0.0.40的11211端口来启动memcached。因为32位处理器最多只能有4GB的地址空间。如果你确实需要32位的服务器处理4-64GB的内存(使用PAE),则每个使用2-3GB内存。

3   移植应用

Warning

pass

4   数据库不能做这些么

数据库为了在关系数据库管理系统上实现ACID,使用了锁,导致很多读写阻塞。而memcached从不会阻塞。

5   那共享内存呢

首先使用缓存的很多用户都是用于WEB。这意味着要分配时间出来做多请求处理给不同的系统,如mod_perl、PHP等等,这是对全局缓存的一种浪费。如果你使用多线程语言和共享内存API,如IPC::Shareable,你的每个线程都拥有独立的缓存。这个也是共享内存的局限性。

memcached服务器和客户端实现了全局缓存。实际上,很推荐你在同一台机器上同时运行WEB结点和memcached结点。这会节省一点网络开销。

6   MySQL 4.x的查询缓存如何

Warning

pass

7   数据库复制的对比

Warning

pass

8   memcached够快么

非常快,它使用 libevent 来处理任意数量的连接。在Linux上,尽可能使用 epoll 来实现。使用非阻塞的网络IO和计算,所以对象在不同的客户端上可能有不同的状态。还使用内置的内存块分配和哈希表算法,确保虚拟内存不会过来捣乱。

9   竞争情况

你可能感兴趣用户是否会获取一个过期的值。

服务器API只有一种获取数据的方法,并有3种提交数据的方法:

  • set 无条件的设置指定的键为给定的值。
  • add 添加到缓存,如果不存在。
  • replace 当存在已有值时,替换一下。

另外,这3个函数都可以设置过期时间。

10   memcached的Python客户端

10.1   基本使用

import memcache
mc=memcache.Client(['127.0.0.1:11211'],debug=0)
mc.set("some_key","Some value")
value=mc.get("some_key")
mc.set("another_key",3)
mc.delete("another_key)
mc.set("key","1") #用于自动增量/减量的必须是字符串
mc.incr("key")
mc.decr("key")

标准的使用memcache作为数据库缓存的方法如下:

key=derive_key(obj)
obj=mc.get(key)
if not obj:
    obj=backend_api.get(...)
    mc.set(obj)
#现在可以操作obj了

10.2   Client类

__init__(servers,debug=0,pickleProtocol=0,pickler=pickle.Pickler,unpickler=pickle.Unpickler)

构造函数

delete(key,time=0)

删除某个键。time的单位是秒,确保特定时间内的set/update操作会失败。返回1成功,0失败。

incr(key,delta=1)

给自增量变量加上delta,默认为1。

decr(key,delta=1)

给自减量变量减去delta,默认为1。

add(key,val,time=0,min_compress_len=0)

添加一个键值对,内部调用_set()方法。

replace(key,val,time=0,min_compress_len=0)

替换值,内部调用_set()方法。

set(key,val,time=0,min_compress_len=0)

无条件的设置键值对。time设置超时,单位是秒。min_compress_len用于设置zlib压缩。内部调用_set()方法。

set_multi(mapping,time=0,key_prefix=”,min_compress_len=0)

设置多个键值对。

get(key)

获取值。出错则返回None。

get_multi(keys,key_prefix=”)

获取多个键的值,返回字典。keys为健明列表。key_prefix是键名前缀,可以最终构成key_prefix+key的完整键名。与set_multi中一样。

Leave a Reply