Python-memcached的基本使用 - Flynewton成长点滴 - 开源中国社区

Python-memcached的基本使用 发表于3年前(2010-12-04 00:02)   阅读(9601) | 评论(3) 12人收藏此文章, 我要收藏 赞1 python memcached 想学Python,又想研究下memcached的客户端,于是拿Python-memcached研究研究~~~ 1.memcached的安装 请参考本博另一文章《Linux下安装memcached》 启动一个memcached实例:memcached -m 10 -p 12000 2.Python-memcached安装 到ftp://ftp.tummy.com/pub/python-memcached/下载最新版本的API,并解压tar包 输入python setup.py install命令进行安装 3.小例子演示 将memcached.pyc拷贝到工作目录 #!/usr/bin/env python import memcache mc = memcache.Client(['127.0.0.1:12000'],debug=0) mc.set("foo","bar") value = mc.get("foo") print value 输出得到bar 4.Python-memcached API总结 整个memcache.py只有1241行,相当精简 主要方法如下: @set(key,val,time=0,min_compress_len=0) 无条件键值对的设置,其中的time用于设置超时,单位是秒,而min_compress_len则用于设置zlib压缩(注:zlib是提供数据压缩用的函式库) @set_multi(mapping,time=0,key_prefix='',min_compress_len=0) 设置多个键值对,key_prefix是key的前缀,完整的键名是key_prefix+key, 使用方法如下   >>> mc.set_multi({'k1' : 1, 'k2' : 2}, key_prefix='pfx_') == []   >>> mc.get_multi(['k1', 'k2', 'nonexist'], key_prefix='pfx_') == {'k1' : 1, 'k2' : 2} @add(key,val,time=0,min_compress_len=0) 添加一个键值对,内部调用_set()方法 @replace(key,val,time=0,min_compress_len=0) 替换value,内部调用_set()方法 @get(key) 根据key去获取value,出错返回None @get_multi(keys,key_prefix='') 获取多个key的值,返回的是字典。keys为key的列表 @delete(key,time=0) 删除某个key。time的单位为秒,用于确保在特定时间内的set和update操作会失败。如果返回非0则代表成功 @incr(key,delta=1) 自增变量加上delta,默认加1,使用如下 >>> mc.set("counter", "20")   >>> mc.incr("counter") 21 @decr(key,delta=1) 自减变量减去delta,默认减1 5._set方法 很多方法内部都调用了_set方法,其源码如下: def _set(self, cmd, key, val, time, min_compress_len = 0): self.check_key(key) server, key = self._get_server(key) if not server: return 0 self._statlog(cmd) store_info = self._val_to_store_info(val, min_compress_len) if not store_info: return(0) if cmd == 'cas': if key not in self.cas_ids: return self._set('set', key, val, time, min_compress_len) fullcmd = "%s %s %d %d %d %d\r\n%s" % ( cmd, key, store_info[0], time, store_info[1], self.cas_ids[key], store_info[2]) else: fullcmd = "%s %s %d %d %d\r\n%s" % ( cmd, key, store_info[0], time, store_info[1], store_info[2]) try: server.send_cmd(fullcmd) return(server.expect("STORED") == "STORED") except socket.error, msg: if isinstance(msg, tuple): msg = msg[1] server.mark_dead(msg) return 0 注: memcached 的客户端使用TCP链接与服务器通讯, 一个运行中的memcached服务器监视一些端口, 客户端连接这些端口,发送命令到服务器,读取回应,最后关闭连接。(具体命令请参考《Memcached 协议中文版》)   6.python-memcached线程安全 本部分转自http://weavesky.com/2009/01/22/is-python-memcached-threadsafe/ python-memcached是不是线程安全的 答案是肯定的,前提你在使用Python 2.4+和python-memcached 1.36+ 为什么我们需要线程安全的memcached client,因为我们的实际应用一般是多线程的模型,例如cherrypy、twisted,如果python-memcached不是线程安全的话,引起的问题不仅仅是并发修改共享变量这么简单,是外部socket链接的数据流的混乱 python-memcached怎么实现线程安全的呢?查看源代码看到 try: # Only exists in Python 2.4+ from threading import local except ImportError: # TODO: add the pure-python local implementation class local(object): pass class Client(local):   很取巧的让Client类继承threading.local,也就是Client里面的每一个属性都是跟当前线程绑定的。实现虽然不太优雅,但是很实在。但是别以为这样就可以随便在线程里面用python-memcached了,因为这种thread local的做法,你的应用必须要使用thread pool的模式,而不能不停创建销毁thread,因为每一个新线程的创建,对于就会使用一个全新的Client,也就是一个全新的socket链接,如果不停打开创建销毁thread的话,就会导致不停的创建销毁socket链接,导致性能大量下降。幸好,无论是cherrypy还是twisted,都是使用了thread pool的模式

Python-memcached的基本使用 - Flynewton成长点滴 - 开源中国社区相关推荐

  1. python语言依赖平台_poetry首页、文档和下载 - Python 依赖管理和打包工具 - OSCHINA - 中文开源技术交流社区...

    poetry 是一个包管理和打包的工具. 在 Python 中,对于初学者来说,打包系统和依赖管理是非常复杂和难懂的.即使对于经验丰富的开发者,一个项目总是要同时创建多个文件: `setup.py` ...

  2. 平面设计python教程_什么是平面设计? - Python学习教程的个人空间 - OSCHINA - 中文开源技术交流社区...

    平面设计是什么?  任何一个做平面设计的人,或多或少的会想到这一个问题,在此我不想用过多的语言去解释这个问题,.有一个同行的前辈曾经用一个比较形象的话打了个比方,所谓设计,就是纸本来是包不住火的,但是 ...

  3. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    去年今日,开源中国创始人 @红薯 宣布将使用 Swift 重写整个开源中国网站(原文链接).一整年过去了,我们是只听见放屁,没看见拉S.据内部人士透露,此重构自立项以来已耗资数千万,而这些钱主要都被用 ...

  4. 【成长点滴】对SMART原则的一些粗浅理解

    [成长点滴]对SMART原则的一些粗浅理解 以下解释来自百度百科 "所谓SMART原则,即是: S:(Specific) 目标要清晰.明确,让考核者与被考核者能够准确的理解目标: M:(Me ...

  5. 记录成长点滴,留住美满幸福

    相信每一名父母从孩子出生开始,都会关注孩子的每个微笑和每个动作,都想把孩子成长的每一刻都记录下来.这种对成长的点滴,从最早的手画.到后来的黑白照片.到彩色胶片照片.到数码相机.到摄像机......这些 ...

  6. python加快绘图速度_python 三维画图为Python加速 - python+memcached

    本来我一直不知道怎么来更好地优化网页的性能,然后最近做python和php同类网页渲染速度比较时,意外地发现一个很简单很白痴但是 我一直没发现的好方法(不得不BS我自己):直接像某些php应用比如Di ...

  7. python语言解释器的全部代码都是开源的_Python IDE和解释器的区别是什么?

    经常会有刚刚入门Python的初学者把Python IDE与Python解释器弄混,其实它们是有本质区别的,有些人还会误认为配置Python环境就是配置IDE工具.那么,Python IDE和解释器的 ...

  8. python中国社区-Python中文社区名称的统一

    Github 好象没有投票功能哪,,, 不过,既然提起了, 俺也就抄发送一下, PyCon2013China 之后相关组委的深入讨论: 背景 俺就几个基本问题尝试厘清一下: CPyUG 的发展历史,俺 ...

  9. Python抓取开源中国资讯(使用BeautifulSoup库)

    Python抓取开源中国资讯(使用BeautifulSoup库) 效果 代码 #coding=utf8 import requests import re import xlrd import xlw ...

最新文章

  1. CentOS 6.6 x86_64升级内核到最新版2.6.32-642.3.1.el6.x86_64
  2. java中怎样克隆,如何在Java中克隆列表?
  3. java sharepoint 2010,安装SharePoint2010出现“Could not find stored procedure ‘sp_dboption’.”的解决方法...
  4. java 登录踢出_spring security 4 如何踢出用户?
  5. Matlab矩阵函数
  6. POJ2777 Count Color 线段树区间更新
  7. Scala在挖财的应用实践
  8. CodeForces - 1303E Erase Subsequences(dp)
  9. Focus 焦点定位
  10. 对mysql的各种sql语句如何对表加锁的实验
  11. 数据竞赛利器 —— xgboost 学习清单
  12. PWN-PRACTICE-BUUCTF-4
  13. redis安装190923课堂版
  14. KCdoes NetUSB 严重漏洞影响多家厂商的数百万台路由器
  15. Linux操作系统的权限代码分析【转】
  16. java高级进阶面试题
  17. PHP强大自适应OA协同办公系统源码 含CRM客户管理系统+内部聊天工具
  18. 2017年NBA球员数据分析
  19. 【ntp时间校准配置】
  20. java拼图_java实现拼图游戏

热门文章

  1. 对于数据库表排他更新的理解
  2. js把日期字符串转换成时间戳
  3. ELK日志分析系统(转)
  4. ERROR:Tried to register widget id ==basemapGalleryDiv but that id is already registered解决办法
  5. 初学java之常用组件
  6. 【NOIP2011 Day 2】观光公交
  7. JavaScript函数 this调用规则
  8. Remote desktop manager共享账号
  9. Spring Boot 统一结果封装
  10. RHEL7 USB installation problem and solving