一、memcached 简介
许多Web应用都将数据保存到MySQL这样的关系型数据库管理系统中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现数据库的负担加重、数据库响应恶化、 网站显示延迟等不良影响。分布式缓存是优化网站性能的重要手段,大量站点都通过可伸缩的服务器集群提供大规模热点数据缓存服务。通过缓存数据库查询结果,减少数据库访问次数,可以显著提高动态Web应用的速度和可扩展性。
memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。
二、memcached 常用操作
2.1 准备环境
首先我们在本地或者远程服务器上安装memcached服务,这里我们安装了docker环境,pull了memcached 镜像,然后将服务启在了远程服务器的容器里面。
docker run -d --name test -p $(ifconfig eth1|grep inet |awk '{print $2}'):22222:11211 docker.io/memcached
接着我们在本地Windows上面进行操作的话,就需要安装 python-memcached 或者 python3-memcached 模块,比如在 PyCharm 中 settings 的操作,如下所示 ( 也可在cmd操作pip install python3-memcached )
2.2 建立连接
#!/usr/bin/env python# -*- coding:utf-8 -*-# @Time : 2018/5/17 22:21# @Author : zhouyuyao# @File : demon2.py#!/usr/bin/env pythonimport memcachemc = memcache.Client(['xxx.xxx.xxx.xxx:22222'],debug=1) # 获取一个memcached对象,来操作memcached# debug=1 开启调试,表示运行出现错误时,可以显示错误信息mc.set("some_key", "Some value") value = mc.get("some_key")print(value)# 结果 Some value
python-memcached模块原生支持集群操作,其原理是在内存中维护一个主机列表,且集群中主机的权重值和主机在列表中重复出现的次数成正比。
mc.set('name','zyy') # 设置keymc.set('name','zhouyuyao') # 设置key,key存在则更新print(mc.get('name')) # 获取key,获取不存在的key,返回None# 结果 zhouyuyao
2.3 常用方法
1)set方法
set(self, key, val, time=0, min_compress_len=0)''' 参数解释: key表示key的名称 val表示value time表示超时时间,代表永远不过期'''
2)set_multi方法
set_multi(self, mapping, time=0, key_prefix='', min_compress_len=0)''' 参数解释: mapping:键值对的字典 time:过期时间 key_prefix:key的前缀 min_compress_len:是否压缩'''# 如 mc.set_multi({'k1':'zhouyuyao3','k2':'v2'})
3)add方法
add(self, key, val, time=0, min_compress_len=0, noreply=False):''' Add new key with value. Like L{set}, but only stores in memcache if the key doesn't already exist. @return: Nonzero on success. @rtype: int add只负责添加元素,如果该key存在了,则会抛出异常'''
4)replace方法
replace(self, key, val, time=0, min_compress_len=0, noreply=False)''' replace只负责替换元素,如果该key存在了,则会抛出异常'''
5)get 和 get_multi 方法
get(key):根据key值获取valueget_multi方法:get_multi(self, keys, key_prefix='')''' 获取多个key的值,返回的是字典,keys是key的数组'''# 如下示例能得到相同的结果print(mc.get_multi(('k1','k2'),key_prefix=''))print(mc.get_multi(['k1','k2'])) # 结果 {'k1': 'zhouyuyao3', 'k2': 'v2'}
6)delete 和 delete_multi 方法
delete(key) 删除某个keydelete_multi(keys) 给定一个keys的数组,把keys里面对应的key和value都删除
7)incr 和 decr 方法
incr方法:incr(self, key, delta=1) # 递增mc.set('age','22')print(mc.incr("age" ,delta=2))>>> mc.set("counter", "20") # returns 1, indicating success 1 >>> mc.incr("counter") 21 >>> mc.incr("counter") 22decr方法:decr(self, key, delta=1) # 递减print(mc.decr("age" ,delta=2))
注意:memcached是存储在内存中,一旦服务器发生一场或者重启,里面的数据将丢失,因此使用memecached的时候,建议将一些不重要的但经常使用的数据放在里面。
参考资料
1. Python项目使用memcached缓存
2. Python3之Memcache使用
3.
4.