python memcached

14 views
Skip to first unread message

张红亮

unread,
Nov 18, 2009, 10:33:18 PM11/18/09
to pyth...@googlegroups.com
在webpy中使用 python_memcached-1.44-py2.6时
代码大体如下:
mc = memcache.Client(['ip:11211'], debug=0)

class a:
   def GET(self):
         retval = []
         if mc.get(key)
               retval = mc.get(key)
         else:
              retval = get data from db
              mc.set(key, retval)

现在的疑问是mc该何时销毁,如果不销毁会导致,cache server 上的连接不断增加
在使用数据库的时候如:
在代码开始的时候
db = web.database(dbn='oracle', user='username', pw='pwd', db='TNS')
在每个class中使用此db,也有此疑问。
后来想是不是每次使用时初始化一下, 但感觉这样会不会有资源的浪费,可能不太懂webpy的机制,所以没弄明白。
懂的xd帮忙指点之指点,谢谢了!
              
             
             




smallfish

unread,
Nov 18, 2009, 10:38:07 PM11/18/09
to pyth...@googlegroups.com
db可以放在外层,如果你装了DBUtils的话,会使用到连接池功能。
--
BLOG: http://chenxiaoyu.org/blog 俺名字拼音,囧把!~
PYCN: http://pythonchina.org

张红亮

unread,
Nov 19, 2009, 12:07:34 AM11/19/09
to pyth...@googlegroups.com
没有使用DBUtils

smallfish

unread,
Nov 19, 2009, 12:12:08 AM11/19/09
to pyth...@googlegroups.com
如果没装这个模块的话,每次都是会单连接。建议装一下这个模块,只不过几十k大小。
mc set方法有个time参数,可以设置过期时间。不设置,或者为0的意思就是永远不过期。

--
BLOG: http://chenxiaoyu.org/blog 俺名字拼音,囧把!~
PYCN: http://pythonchina.org


2009/11/19 张红亮 <hongliang.bj@gmail.com>
没有使用DBUtils




张红亮

unread,
Nov 19, 2009, 12:21:48 AM11/19/09
to pyth...@googlegroups.com
关于mc 我的意思是断开到mc server的连接, 不是指缓存的那个key销毁。

smallfish

unread,
Nov 19, 2009, 12:26:19 AM11/19/09
to pyth...@googlegroups.com
这个你手动关闭或者置为None把。

--
BLOG: http://chenxiaoyu.org/blog 俺名字拼音,囧把!~
PYCN: http://pythonchina.org


2009/11/19 张红亮 <hongliang.bj@gmail.com>
关于mc 我的意思是断开到mc server的连接, 不是指缓存的那个key销毁。




张红亮

unread,
Nov 19, 2009, 2:59:45 AM11/19/09
to pyth...@googlegroups.com
怎么手动关闭,xd能否指教一下, 我刚刚学,不太明白

smallfish

unread,
Nov 19, 2009, 3:02:32 AM11/19/09
to pyth...@googlegroups.com
看了下Client那个类,有个disconnect_all方法,当然你可以手动置为None应该也可以的。

--
BLOG: http://chenxiaoyu.org/blog 俺名字拼音,囧把!~
PYCN: http://pythonchina.org


2009/11/19 张红亮 <hongliang.bj@gmail.com>
怎么手动关闭,xd能否指教一下, 我刚刚学,不太明白




张红亮

unread,
Nov 19, 2009, 3:32:00 AM11/19/09
to pyth...@googlegroups.com
使用disconnect_all 可以的,谢谢,以后得仔细看源代码了。

Jiahua Huang

unread,
Nov 19, 2009, 3:45:02 AM11/19/09
to pyth...@googlegroups.com
看你的 webpy 运行方式,

cgi 方式自然是每个请求完成后销毁,
fcgi 方式看你 web 服务器的 fcgi 设置

23号

unread,
Nov 19, 2009, 3:56:38 AM11/19/09
to pyth...@googlegroups.com
如果是oracle的话,装上DBUtils也没用,web.py的OracleDB还不支持:
class OracleDB(DB):
def __init__(self, **keywords):
import cx_Oracle as db
if 'pw' in keywords:
keywords['password'] = keywords.pop('pw')

#@@ TODO: use db.makedsn if host, port is specified
keywords['dsn'] = keywords.pop('db')
self.dbname = 'oracle'
db.paramstyle = 'numeric'
self.paramstyle = db.paramstyle

# oracle doesn't support pooling
keywords.pop('pooling', None)
DB.__init__(self, db, keywords)


2009/11/19 smallfish <smallf...@gmail.com>:


> 如果没装这个模块的话,每次都是会单连接。建议装一下这个模块,只不过几十k大小。
> mc set方法有个time参数,可以设置过期时间。不设置,或者为0的意思就是永远不过期。
> --
> BLOG: http://chenxiaoyu.org/blog 俺名字拼音,囧把!~
> PYCN: http://pythonchina.org
>
>

> 2009/11/19 张红亮 <hongli...@gmail.com>
>>
>> 没有使用DBUtils
>>
>>
>
>
> >
>

--
--
Best Regards
----
My Chaos: http://n23.appspot.com

张红亮

unread,
Nov 19, 2009, 4:02:46 AM11/19/09
to pyth...@googlegroups.com
我的运行方式是直接  python index.py 9000 这样启动的

smallfish

unread,
Nov 19, 2009, 4:03:30 AM11/19/09
to pyth...@googlegroups.com
看到了“keywords.pop('pooling', None)”,因为没用过oracle,囧啊~~~

--
BLOG: http://chenxiaoyu.org/blog 俺名字拼音,囧把!~
PYCN: http://pythonchina.org


2009/11/19 23号 <no....@gmail.com>

Jiahua Huang

unread,
Nov 19, 2009, 4:06:14 AM11/19/09
to pyth...@googlegroups.com
开发服务器不用考虑这些。

张红亮

unread,
Nov 19, 2009, 4:18:34 AM11/19/09
to pyth...@googlegroups.com
我是怕连接数太多, 把服务器搞死

Jiahua Huang

unread,
Nov 19, 2009, 4:20:17 AM11/19/09
to pyth...@googlegroups.com
开发服务器默认是开了调试,单线程运行

2009/11/19 张红亮 <hongliang.bj@gmail.com>
我是怕连接数太多, 把服务器搞死

xrfang

unread,
Nov 19, 2009, 6:52:17 PM11/19/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
en,我也在学习webpy。你这个主题将来可以写入PyWDWW里面。:)

我同意Jiahua的意见,你如果用开发服务器好像没有必要考虑这些问题。我个人特别重视Deployment的事情,所以我一开始用webpy就是
fcgi方式链接nginx的。我nginx也是初学,甚至memcache问题都没有涉及。目前我只是建议看看web服务器(apache/
nginx/lighttpd等)对memcached的支持。是不是可以配置web服务器来链接memcached,而不用webpy里面操作了?

当然,我还没有看memcached的东西,我上边这说法可能是很错误的,请见谅,并指正。另外,使用disconnect_all的方法能否post
一点你写的基于webpy的源代码让大家学习一下。以及你怎么知道disconnect_all了就"有用"了(连接数就下来了?memcached是
不是有管理界面?还是有api可以查当前服务器的连接数?)请介绍一下?

谢谢!

张红亮

unread,
Nov 19, 2009, 9:06:57 PM11/19/09
to pyth...@googlegroups.com
至于你说的在web服务器上初始化memcached,我没考虑过,但是在webpy启动时初始化倒是可行性挺高的,但没具体研究过,只是个想法。

另外关于我说disconnect_all管用的:
先说一下我的部署情况,我的cache服务器在服务器A上,webpy在服务器B上,oracle在服务器C(数据库在那里似乎关系不大), memcached是有一个php的管理页面,在这个管理页面里面可以查看缓存的数据,可以查看使用的空间,命中数等等。

我在服务器B上的webpy的代码如下
#memcached 初始化
mc = memcache.Client(['服务器A IP:11211'], debug=0)

class test:
    def GET(self):
         sql = "select * from table"
         m = hashlib.md5(sql)
         key = m.hexdigest()

         retval = []
         if mc.get(key):
             retval = mc.get(key)
         else:
              retval = db.query(sql).list()
              mc.set(key, retval )
        
         #断开连接
         mc.disconnect_all()

现在服务器A上看一下,现在memcached服务所在端口的连接数
debian:~# netstat -an |grep 11211|wc -l
2

执行服务器B上webpy的代码,多刷新几次页面,调用几次上面的test里面的那个函数,再看一下服务器A上的连接数
debian:~# netstat -an |grep 11211|wc -l
2
两次的数量是一样

这时候在服务器A上的memcached管理界面看一下,现在服务器上缓存的数据,能看到数据已经缓存上了

在没有加mc.disconnect_all()之前,我看到连接数能到100多,但加了以后不在增加了。
基于以上原因,我说这个断开连接的方法是没问题的。

另外从上面的这些代码我想到的:
1.webpy的每个application 在每次执行的时候都会初始化里面的变量,比如上面的mc,但是不是每次这个application执行完以后里面的变量就会销毁了, 我就不知道了, 比如在我前面的邮件里面提到的数据库的连接。
2.如果手动销毁的,那么在每次用完之后都可以直接销毁,就像mc.disconnect_all,因为在下次调用时还会初始化
疑问???
3.如果每次都创建销毁的话,势必造成效率的地下,前面兄弟提到的 DButils,有人说在oralce中没有池化的概念,那么在oracle中有什么好的解决方法吗?

ps:不知道我想的这些对不对,请高人指点。



2009/11/20 xrfang <xrf...@gmail.com>

xrfang

unread,
Nov 20, 2009, 8:25:21 AM11/20/09
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
这要请memcached的行家来回答了。我有一个疑惑,mc是全局创建的。mc.disconnect_all是在GET的末尾,那么有没
有"connect"的方法呢?还是执行mc.get的时候它就connect了?

smallfish

unread,
Nov 20, 2009, 9:17:20 PM11/20/09
to pyth...@googlegroups.com
在memcache.Client初始化,get时候会连一次,但是是不是每次都连没仔细查源码。其实就是一次socket链接,然后发送下请求而已。
如果你打开debug选项,如果连上不上mem server的话,get时候会就有异常了。

--
BLOG: http://chenxiaoyu.org/blog 俺名字拼音,囧把!~
PYCN: http://pythonchina.org


2009/11/20 xrfang <xrf...@gmail.com>

lv yi

unread,
Nov 20, 2009, 10:30:49 PM11/20/09
to pyth...@googlegroups.com
我使用cmemcache 时遇到过进程持续占用高cpu的怪象,后来换pylibmc 就好了, 效率比PyRex
wrapper的python-libmemcached好些。

2009/11/21 smallfish <smallf...@gmail.com>:

--
--
我想和你分享
-----------------------------------------------------------

Gtalk: lvs...@gmail.com | MSN: lvs...@msn.com

Reply all
Reply to author
Forward
0 new messages