Django 缓存框架 - memcache
0 0 原来....
memcached简介
翻译: | gashero |
---|
- 1 什么是memcached
- 2 它如何工作
- 3 移植应用
- 4 数据库不能做这些么
- 5 那共享内存呢
- 6 MySQL 4.x的查询缓存如何
- 7 数据库复制的对比
- 8 memcached够快么
- 9 竞争情况
- 10 memcached的Python客户端
主要取自 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 memcachemc=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中一样。