本文转载自微信公众号“心肝果”,作者AirPython。转载本文请联系新干果公众号.一、前言本文继续另一种常用的数据存储方式:MemcachedMemcached:一个高性能的分布式内存对象缓存系统,通过内存缓存,减少数据库读取,从而分担数据库压力,进而提高网站加载速度Memcached是实际上是一个简单的键值对存储系统,可以存储各种类型的数据,包括:字符串、对象、图片、文件、视频等。由于Memcached数据是存储在内存中的,因此在重启服务或系统后,所有数据将丢失;另外,当Memcached的容量达到指定值时,会根据LRU算法自动删除未使用的缓存。Memcached协议简单强大,开发方便快捷,兼容大部分开发语言;本文将讲述Python操作Memcached的正确姿势2.准备工作下面以在云服务器Centos上安装Memcached-Server为例7.8为例。directory#使用whereis命令查询memcached安装目录#/usr/bin/memcached[root@VM-16-11-centos~]#whereismemcachedmemcached:/usr/bin/memcached/usr/share/man/man1/memcached.1.gz然后,通过命令行和参数启动Memcached服务#Runmemcachedservice#-p:端口号#-m:分类内存#-d:守护进程,后台运行#-u:运行memcached的用户#-l:设置哪个ip可以连接服务,0.0.0.0:允许外网ip访问/usr/bin/memcached-p11211-m64m-d-uroot-l0.0.0.0常用启动参数包括:-d:通过daemon进程,在后台运行-m:分配的最大内存,默认大小为64M-u:运行Memcached的用户-l:设置可以访问Memecache服务的ip地址,默认只能是通过本地机器访问;如果要从外网访问,需要设置为:0.0.0.0-p:设置Memcached监听的端口号,默认为111211-c:最大并发运行连接数,默认1024接下来需要注意的是,在开启防火墙端口的时候,如果是云服务器,需要在安全组中开启对应的端口号#启用端口号firewall-cmd--add-port=11211/tcp--permanent#重启立即生效firewall-cmd--reload完成以上操作,我们有两种方式操作数据:1.通过连接到Memecached服务telnet,并使用命令行操作#连接telnetIP地址112112,通过编程语言,包括:Python、Java、Php,操作Memcached数据以Python为例,需要安装python-memcached依赖#安装依赖pip3installpython-memcached3。实战在操作Memcache中的数据之前,我们需要导入memcache,使用Client()方法指定要操作的Memecache服务,并构建一个数据连接对象def__init__(self):#连接到memcached服务,可以包含多个服务ipself.mc=memcache.Client(['ip:11211'],debug=True)connection下面我们以增、查询、更新、追加、删除为例,说说Python操作这些数据的方法1.添加操作添加操作对应的方法为:add(key,value,timeout)其中,参数timeout表示数据保留时间,超时会自动清除。需要注意的是,如果要插入键值对的键在原始数据集中不存在,则会向数据集中添加一条新记录;否则,添加将失败并发出警告。promptdef__add(self):"""添加一条记录:return:"""#添加一条数据,如果已经存在则添加失败并抛出异常#time:保存时间,超时会清零,单位是秒,默认是Saveforever#注意:如果添加的key已经存在,会提示:MemCached:whileexpecting'STORED',gotunexpectedresponse'NOT_STORED'self.mc.add("name","xag",时间=60*5)self.mc.添加("age",23)2.查询操作Memcached的查询操作分为:通过Key查询单条记录通过多个Key组成的列表查询多条记录其中,查询单条记录对应的方法是:get(key)def__query_one(self,key):"""查询单条记录:return:"""result=self.mc.get(key)print('单条记录查询,key:',key,",value:",result)对应的方法是:get_multi(keys)def__query_many(self,keys):"""查询多条记录:paramkeys:key-valuelist:return:"""values=self.mc.get_multi(keys)#dict,key-valuepairprint(type(values))print('Multiplerecordquery:',values)3.更新操作更新操作包括三种方法,分别是:更新一条记录,如果key不存在,则更新失败对应的方法是:replace(key,value)更新一条记录,如果key不存在,则添加一条新记录对应的方法是:set(key,value)更新多条记录,如果有key做不存在,则添加对应的键值对添加到数据集中对应的方法:set_multi({key1:value1...})具体示例代码如下:def__update_default(self):"""更新数据,包括:替换、设置、set_multi:返回:“”“#1。使用替换更新记录#self.mc.replace("name","xag1")#self.__query_one("name")#2。使用set更新一条记录,如果key不存在,则添加一条记录#set=replace+add#self.mc.set("name","xag2")#self.__query_one(“名字”)#3。使用set_multi更新多条记录。如果有不存在的键,则新建键值对self.mc.set_multi({"name":"xag3","age":28})self.__query_many(["name","age"])4.追加操作追加操作相当于修改某个key的值,在头部或尾部追加数据。其中:append(str):在末尾追加一段数据prepend(str):在头部追加一段数据实践代码如下:def__update_append(self):"""追加和更新,包括:append,prepend:return:"""#1,append#valueself.mc末尾追加的内容。append("name","我是新内容")self.__query_one("name")#2、prepend#head中的新内容self.mc.prepend("name","head中的新内容")self.__query_one("name")5.删除操作与查询操作类似。删除操作也支持删除单个键值对和删除多个键值对delete(key):删除一个键值对delete_multi(keys):删除所有Keys中对应的所有键值对列表。对应的操作代码如下:def__delete(self):"""删除数据,包括:delete,delete_multi:return:delete_multi"""#1,delete#delete单个键值对#self.mc.delete("age")#self.__query_one("age")#2,delete_multi#删除多条记录keys=["name","age"]self.mc.delete_multi(keys)self.__query_many(keys)4、本文最后通过Python实现了对Memcached数据的常规操作。更复杂的操作可以点击阅读原文查看
