`
flynewton
  • 浏览: 62479 次
  • 性别: 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的模式

分享到:
评论

相关推荐

    python-memcached

    Python-Memcached是一个Python接口,用于与Memcached内存缓存系统进行交互...以上就是Python-Memcached的基本介绍及其在Python应用中的使用方式。通过合理地利用这个库,可以显著提升Python应用程序的性能和响应速度。

    Python库 | tencentcloud-sdk-python-memcached-3.0.335.tar.gz

    使用tencentcloud-sdk-python-memcached,开发者可以执行以下操作: 1. 创建和管理Memcached实例:创建新的Memcached服务实例,调整实例配置,如内存大小、节点数量等。 2. 数据存取:通过SDK,可以便捷地将数据存储...

    Python库 | tencentcloud-sdk-python-memcached-3.0.556.tar.gz

    使用tencentcloud-sdk-python-memcached-3.0.556,开发者可以轻松实现以下场景: - **Web应用缓存**:将频繁访问的数据存储在内存中,减少对数据库的依赖,提升响应速度。 - **数据预加载**:在应用程序启动时,...

    PyPI 官网下载 | tencentcloud-sdk-python-memcached-3.0.315.tar.gz

    《PyPI上的腾讯云Python Memcached SDK:tencentcloud-sdk-python-memcached-3.0.315详解》 PyPI(Python Package Index)是Python开发者常用的软件包仓库,提供了一个广泛且丰富的Python库集合,供全球的开发人员...

    python3-memcached-master

    Memcached的基本工作原理是,它将数据存储在内存中,以键值对的形式提供快速访问。由于数据存储在内存中,因此读取速度非常快,但也有数据易失性的缺点,因为断电或重启后,所有数据都会丢失。 Python3-memcached-...

    Python-强大的memcached客户端拥有shdict缓存层和许多其他功能

    学习和使用这样的Python memcached客户端库,不仅需要掌握Python语言和memcached的基本概念,还需要理解缓存系统的设计原则,以及如何通过编程技巧来优化性能。对于大型Web应用而言,合理地使用缓存是提高响应速度、...

    Python-一个本地和可伸缩的键值keyvalue存储过程

    3. **Memcached**: Memcached是一个高性能的分布式内存对象缓存系统,Python有`pylibmc`和`python-memcached`等客户端库,可用于本地或分布式环境的数据缓存。 4. **LevelDB**: LevelDB是由Google开发的一个小型、...

    memcached客户端

    1. **Python** - `python-memcached` 和 `pylibmc`:Python社区提供了两个常用的Memcached客户端库。`python-memcached` 是一个轻量级的客户端,简单易用;而 `pylibmc` 增强了错误处理和更好的内存管理,支持多线程...

    Memcached使用--使用

    **Memcached 使用详解** Memcached 是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库负载,提高网站性能。它通过在内存中存储数据,为应用程序提供快速的数据访问,避免了频繁读取...

    Python-一个简单小巧可定制化轻量级的基于内存的Python缓存组件

    标题中的“Python-一个简单小巧可定制化轻量级的基于内存的Python缓存组件”指的是一种Python库,它设计用于实现简单的内存缓存功能。这类组件在处理大量数据或者需要频繁读取已计算结果时特别有用,因为它可以减少...

    Memcached基本使用

    **Memcached基本使用** Memcached是一款高性能、分布式内存对象缓存系统,用于减轻数据库负载,提升Web应用性能。它的工作原理是将数据存储在内存中,以便快速访问,避免频繁读取硬盘上的数据库。在本篇文章中,...

    缓存应用--Memcached分布式缓存简介(二)

    - **封装示例**:以Python为例,使用python-memcached库可以非常方便地与Memcached服务器交互,包括设置键值对、获取值等基本操作。 以上内容详细介绍了Memcached的状态查看方法、存储机制以及内存资源的有效利用...

    memcached缓存使用演示

    例如,对于Python,可以使用`python-memcached`库,Java有`spymemcached`,PHP有`php-memcached`等。以下是一些基本操作: - **添加缓存**:使用`set(key, value, timeout)`方法,将键值对存入缓存,`timeout`表示...

    Memcached-Java-Client-release_2.6.1.zip

    本文将围绕标题“Memcached-Java-Client-release_2.6.1.zip”展开,详细讲解如何在Java项目中整合并使用Memcached客户端库。 1. **Memcached简介** - Memcached是一种轻量级、基于内存的键值对存储系统,用于存储...

    memcached资源demo(已调试通过)

    Memcached基本概念 Memcached基于键值对存储,它将数据存储在内存中,以提供快速的数据访问。由于数据存于内存,读取速度极快,但同时也意味着数据的非持久化,如果服务器重启,所有数据将会丢失。 ### 2. 安装与...

    Python-了解如何设计大型系统为系统设计面试作准备

    Python有多种缓存库,如Memcached和Redis,可以用来存储会话信息、减轻数据库压力。 7. **消息队列**:用于异步处理任务和解耦系统组件。RabbitMQ、Kafka和Celery都是Python支持的消息队列解决方案。 8. **安全性...

    memcached连接demo

    使用`python-memcached`库,首先需要安装:`pip install python-memcached`。然后,你可以创建一个客户端实例并执行基本操作: ```python import memcache mc = memcache.Client(['127.0.0.1:11211'], debug=0) ...

    memcached-1.2.1 -win32以及安装使用方法

    在本文中,我们将深入探讨Memcached的基本概念、工作原理,以及如何在Windows环境下安装和使用。 ### Memcached的基本概念 Memcached的设计目标是提供一个轻量级、高性能的缓存服务,它通过在内存中存储数据,减少...

    memcached 缓存图片

    在Python中,你可以使用`python-memcached`库,而在PHP中,可以使用`php-memcached`扩展。配置完成后,编写代码来存取图片数据: 1. 存储图片: - 序列化图片数据(例如,使用base64编码) - 将图片URL或标识作为...

    Python-micawber一个小型网页内容提取库用来从URLs提取富内容

    ### 使用 micawber 的基本步骤 1. **安装**:首先,你需要通过 `pip` 安装 `micawber` 库,命令如下: ``` pip install micawber ``` 2. **初始化**:然后,创建一个 `ProviderRegistry` 实例,并选择要使用的...

Global site tag (gtag.js) - Google Analytics