`
flynewton
  • 浏览: 60279 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Python-memcached的基本使用

阅读更多

关键字: 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拷贝到工作目录

  1. #!/usr/bin/env python  
  2.    
  3. import memcache  
  4.    
  5. mc = memcache.Client(['127.0.0.1:12000'],debug=0)  
  6. mc.set("foo","bar")  
  7. value = mc.get("foo")  
  8. 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方法,其源码如下:

  1. def _set(self, cmd, key, val, time, min_compress_len = 0):  
  2.        self.check_key(key)  
  3.        server, key = self._get_server(key)  
  4.        if not server:  
  5.            return 0  
  6.   
  7.        self._statlog(cmd)  
  8.   
  9.        store_info = self._val_to_store_info(val, min_compress_len)  
  10.        if not store_info: return(0)  
  11.   
  12.        if cmd == 'cas':  
  13.            if key not in self.cas_ids:  
  14.                return self._set('set', key, val, time, min_compress_len)  
  15.            fullcmd = "%s %s %d %d %d %d\r\n%s" % (  
  16.                    cmd, key, store_info[0], time, store_info[1],  
  17.                    self.cas_ids[key], store_info[2])  
  18.        else:  
  19.            fullcmd = "%s %s %d %d %d\r\n%s" % (  
  20.                    cmd, key, store_info[0], time, store_info[1], store_info[2])  
  21.   
  22.        try:  
  23.            server.send_cmd(fullcmd)  
  24.            return(server.expect("STORED") == "STORED")  
  25.        except socket.error, msg:  
  26.            if isinstance(msg, tuple): msg = msg[1]  
  27.            server.mark_dead(msg)  
  28.        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怎么实现线程安全的呢?查看源代码看到

 

  1. try:  
  2.     # Only exists in Python 2.4+  
  3.     from threading import local  
  4. except ImportError:  
  5.     # TODO:  add the pure-python local implementation  
  6.     class local(object):  
  7.         pass  
  8.    
  9. class Client(local):  

 

很取巧的让Client类继承threading.local,也就是Client里面的每一个属性都是跟当前线程绑定的。实现虽然不太优雅,但是很实在但是别以为这样就可以随便在线程里面用python-memcached了,因为这种thread local的做法,你的应用必须要使用thread pool的模式,而不能不停创建销毁thread,因为每一个新线程的创建,对于就会使用一个全新的Client,也就是一个全新的socket链接,如果不停打开创建销毁thread的话,就会导致不停的创建销毁socket链接,导致性能大量下降。幸好,无论是cherrypy还是twisted,都是使用了thread pool的模式

分享到:
评论

相关推荐

    ag模板:Mirounga使用的used模板

    {%,如果错误%}Django 1.11基本模板关于此模板供Mirounga的开发人员使用产品特点默认情况下,此项目模板包括: 鹡鸰: 1.13 迁移: Django内置迁移缓存: python-memcached 管理员: 包括用于开发和生产的django-...

    高洛峰 memcache for window 和linux版软件及教程

    memcached的基本设置:-p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d ...

    mctop:Python CLI Memcached 监视器

    用于监控 memcached 的顶级命令行应用程序。 这是一个非常粗略的第一个版本,它提供了基本的可用输出: Efficiency Requests Interval: 20.0% 5 Cumulative: 29.4 Total: 3.6S8,225 去做 尝试使用在运行时更改选项...

    ist的matlab代码-hash_ring:在Python中实现一致的哈希(使用md5作为哈希函数)

    ist的matlab代码hash_ring 实现一致的哈希,当...用法的基本示例(用于管理memcached实例): memcache_servers = ['192.168.0.246:11212', '192.168.0.247:11212', '192.168.0.249:11212'] ring = HashRing(memca

    python内存缓存

    适用于Memcached的Cloud Memorystore的Python客户端 :船载性能和高可用性键值存储,与OSS Memcached协议兼容。 快速开始 为了使用此库,您首先需要完成以下步骤: 安装 使用pip在安装此库。 是用于创建隔离的...

    3d3Paste:一个简单的 pastebin 和 shorturl 组合服务

    对于粘贴和 URL 的存储,我们使用带有 cmemcached python 插件的 memcachedb 和 memcached,但是我们正在努力使其更加模块化。 所有粘贴和 URL 都使用 MsgPack 进行序列化。 安装和配置 目前,您需要 Python 2.7 ...

    django-banish:django-banish 是一个 Django 中间件应用程序,用于通过 IP 地址或用户代理头来驱逐用户代理。 它还支持基本的滥用预防,如果用户每分钟超过一定数量的请求,则自动禁止用户,这可能是某种形式的攻击或尝试拒绝服务

    它还支持基本的滥用预防,如果用户每分钟超过一定数量的请求,则自动禁止用户,这可能是某种形式的攻击或尝试拒绝服务。 Django-banish 将所有“驱逐”存储在内存中,以避免每次请求时都进行数据库查找。 它需要 ...

    seafile-docker:Seafile服务器的Docker映像

    基本映像使用Seafile团队建议的最佳默认配置来配置Seafile。 如果您不熟悉docker命令,请参阅。对于seafile 7.xx 从7.0开始,我们将seafile-docker映像调整为使用多个容器。 旧映像在与Seafile服务器相同的容器中...

    sisu-cache-tools:django-cms 项目的缓存工具

    这对于包含大量静态内容并使用 memcached 的站点很有用。安装pip install sisu-cache-tools 然后,在设置中将cache_tools添加到项目的 INSTALLED_APPS 中。 Sisu Cache Tools 不使用数据库模型,因此不需要迁移,但...

    天涯社区开源的NoSQL数据库 Memlink.zip

    (大约是redis几倍),同时使用了redo-log技术保证数据的持久化。Memlink还支持主从复制、读写分离、List过滤操作等功能。 与Memcached不同的是,它的value是一个list/queue。并且提供了诸如持久化,分布式的功能。听...

    rdm-2020.1.rar

    兼容win、mac等操作系统,该工具可以说很大程度上弥补了memcached这类key/value存储的不足,为Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等开发语言提供了便利的客户端。 【软件特点...

    mdserver-web:简单Linux面板

    基本上可以使用,后续会继续优化!欢迎提供意见! 主要插件介绍 OpenResty - 轻量级,占有内存少,并发能力强。 PHP[52-80] - PHP是世界上最好的编程语言。 MySQL - MySQL是一种关系数据库管理系统。 phpMyAdmin - ...

    realms-wiki:受Gollum启发的基于Git的Wiki

    Memcached或Redis,默认为记忆。 MariaDB,MySQL,Postgresql或SQLAlchemy支持的其他数据库,默认为sqlite。 匿名或单用户不需要数据库。 安装 您将需要以下软件包才能开始: Ubuntu 16.04 sudo apt-get insta

    nosql 入门教程

    10.1.2 使用Python进行基本的GAE数据建模 165 10.1.3 查询与索引 168 10.1.4 过滤和结果排序 170 10.1.5 Java App Engine SDK 172 10.2 Amazon SimpleDB 175 10.2.1 SimpleDB入门 176 10.2.2 使用REST API ...

    Publ-templates-beesbuzz.biz:Publ的样本模板

    Publ模板 这些模板基于我在上使用的模板。 这是一些有关如何将它们组合在... 如果在调试中运行,则没有缓存,否则它将使用在localhost上运行的memcached。 索引每天进行一次重新扫描,这可能不是必需的,但也不会造

    实战ngix服务器

    第2部分为进阶篇,重点介绍了Nginx的配置优化方法、Nginx与PHP/Ruby/Python/JSP/Perl/Memcached的结合配置方法、Nginx HTTP反向代理与负载均衡的配置与优化、Nginx模块开发等,最后还分析了新浪的开源软件项目──...

    Nginx:取代apache的高性能服务器

    第2部分为进阶篇,重点介绍了Nginx的配置优化方法、Nginx与PHP/Ruby/Python/JSP/Perl/Memcached的结合配置方法、Nginx HTTP反向代理与负载均衡的配置与优化、Nginx模块开发等,最后还分析了新浪的开源软件项目──...

    thisvsthat:通过比较不同的技术来学习Web开发

    Javascript是一种主要在浏览器中使用的编程语言,但是如今,它正在服务器,物联网设备上的任何地方使用。 Java是Oracle拥有的基于类的,面向对象的编程语言。 HTML vs Markdown HTML(超文本标记语言)是Web的最...

    实战Nginx.取代Apache的高性能Web服务器.2010 pdf

    第2部分为进阶篇,重点介绍了Nginx的配置优化方法、Nginx与PHP/Ruby/Python/JSP/Perl/Memcached的结合配置方法、Nginx HTTP反向代理与负载均衡的配置与优化、Nginx模块开发等,最后还分析了新浪的开源软件项目──...

    实战Nginx:取代Apache的高性能Web服务器

    第2部分为进阶篇,重点介绍了Nginx的配置优化方法、Nginx与PHP/Ruby/Python/JSP/Perl/Memcached的结合配置方法、Nginx HTTP反向代理与负载均衡的配置与优化、Nginx模块开发等,最后还分析了新浪的开源软件项目──...

Global site tag (gtag.js) - Google Analytics