python-memcached 安装

汝繁
2023-12-01

转自:http://hi.baidu.com/vdiskwangfeng/blog/item/4badc4404d46af0d73f05d03.html

Memcached
是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。
    网上有很多讲到Memcached For Linux的安装教程,但是Memcached For Win32 and Python的就甚少,偶尔google找到一篇
比较相近的英文教程,觉得很不错就打算翻译下来,并且写一个Hello World的memcached实例。
安装部分来自原文
1.下载memcached 1.2.1 for Win32
.
2.把memcached-1.2.1-win32.zip解包到你想要的路径下
(如:C:\memcached-1.2.1-win32)
3.打开命令行(在开始菜单中的"运行",输入"cmd"),使用以下的命令安装:
 C:\memcached-1.2.1-win32\memcached.exe -d install
安装完成之后,再执行以下命令来启动memcached:
C:\memcached-1.2.1-win32\memcached.exe -d start
这样memcached会使用默认的端口(11211)来启动,启动成功的话,你可以在任务管理器中看到memcached.exe
4.为了和memcached通信,你需要安装一个memcached客户端
,来对memcached做“增删改”操作。memcached有很多个客户
端程序可以使用,对应于各种语言,有各种语言的客户端。基于C语言的有libmemcache、 APR_Memcache;基于Perl的有Cache::Memcached;另外还有Php、Python、Ruby、Java、C#等语言的支持。其中PHP的客户端是最多的,你可以在网上搜
索到大部分,这里我只介绍python的客户端。
5.获取最新版的memcached python客户端:python-memcached-latest.tar.gz下载地址:http://www.tummy.com/Community/software/python-memcached/

6.把python-memcached-latest.tar.gz解压到任意路径
(如c:\python-memcached-1.45)
7.在命令行中cd到c:\python-memcached-1.45目录下:
 
cd c:\python-memcached-1.45
8.然后运行以下命令安装python-memcached:
python setup.py build
python setup.py install
这样python-memcached就成功安装到python库中。如果提示ImportError: No module named setuptools
,请先安装

setuptools for win32
下载地址:http://pypi.python.org/pypi/setuptools 选择:setuptools-0.6c11.win32-py2.7.exe版的下载


9.运行以下代码来测试python-memcached是否成功安装
import memcache
#创建连接
mc_client = memcache.Client(['127.0.0.1:11211'], debug=0)
#写、读
mc_client.set("key_a", "value_a")
value = mc_client.get("key_a")
print "key_a 's value in memcached is: %s" %(value)
#删
mc_client.delete("key_a")

 

添加数据有两种方式:一种是用add,一种是用set

用add,如果已存在,则返回false

用set,如果已存在,则覆写之前的值

 

 

 

 

 下面部分转自:http://oursimplehouse.blog.sohu.com/63588732.html

网上对memcached的讨论好火呀!总结一下

安装 memcached:
1、下载memcached-1.2.2.tar.gz
2、tar xvzf memcached-1.2.2.tar.gz
3、./configure;make;make install

安装python API组件:
1、下载python-memcached-1.39.tar.gz
2、tar xvzf python-memcached-1.39.tar.gz
3、python setup.py install

启动memcached
memcached -d -m 64 -l 10.1.41.113 -p 11211
启动的这个memcached为一个后台守护进程模式(-d), 然后缓存的空间为64M(-m), 监听(-l)服务器10.1.41.113的11212号端口(-p)
root下要加-u 指定user参数
memcached -u bj1822 -d -m 64 -l 10.1.41.113 -p 11211

memcached -h
memcached 1.2.2
-p <num>      TCP port number to listen on (default: 11211)
-U <num>      UDP port number to listen on (default: 0, off)
-s <file>     unix socket path to listen on (disables network support)
-l <ip_addr>  interface to listen on, default is INDRR_ANY
-d            run as a daemon
-r            maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num>      max memory to use for items in megabytes, default is 64 MB
-M            return error on memory exhausted (rather than removing items)
-c <num>      max simultaneous connections, default is 1024
-k            lock down all paged memory
-v            verbose (print errors/warnings while in event loop)
-vv           very verbose (also print client commands/reponses)
-h            print this help and exit
-i            print memcached and libevent license
-b            run a managed instanced (mnemonic: buckets)
-P <file>     save PID in <file>, only used with -d option
-f <factor>   chunk size growth factor, default 1.25
-n <bytes>    minimum space allocated for key+value+flags, default 48

编写python程序:
import memcache, time
mc = memcache.Client(['10.1.41.113:11211'], debug=0)
连接到10.1.41.113的11211端口,也就是memcachd启动的端口。

mc.set("some_key", "Some value")
设置key和value,第三个参数默认为0,也就是数据永不超时。
如果这样设置:
mc.set("some_key", "Some value",1)
表示一秒后超时
过两秒打印value的话
time.sleep ( 2)
value = mc.get("some_key")
print value
结果就是None了。

删除
mc.set("another_key", 3)                                                                         

mc.delete("another_key")                                                                                                          
自增和自减
mc.set("key", "1")                                                                               

mc.incr("key")                                                                                    

mc.decr("key")          

关于LRU
LRU是缓冲超过存储上限时删掉队尾也就是最长时间没人访问的元素,参数是-M。但设置了-M和过期时效会存在将未失效的元素删去的风险。所以网上有人改了下代码,增加对过期时效的判断:

返回超时时间的代码:
if (exptime > REALTIME_MAXDELTA) 
     return (rel_time_t) (exptime - stats.started);  
else { 
     return (rel_time_t) (exptime + current_time); 
}
memcached的失效时间格式有两种,当大于60*60*24*30也就是30天的秒数时就是过期距1970年1月1日零时的秒数,否则是有效的秒数。

删除cache的代码:
for (search = tails[id]; tries>0 && search; tries--, search=search->prev) { 
 if (search->refcount==0) { 
  item_unlink(search); 
   break; 
  } 
}
增加条件:
search->exptime && search->exptime <= current_time 
这样就可以保证删除的都是过期了的元素了。 

 

 

 

 

 类似资料: