本文转载自微信公众号《AirPython》,作者邢安国。转载本文请联系AirPython公众号.一、前言本文继续说说另一种常用的数据存储方式:RedisRedis:RemoteDictionaryServer,即:远程字典服务,Redis的底层是用C语言编写的,是一个开源的,基于内存的NoSql数据库。性能远超其他数据库,支持集群、分布式、主从同步等优势,因此常用于缓存数据、高速读写等场景。本篇文章将讲讲Python操作Redis的正确姿势。服务器Centos7.8安装Redis-Server为例。首先在云服务器上安装Redis数据库#下载epel仓库yuminstallepel-release#安装redisyuminstallredis然后通过vim命令修改Redis配置文件,开启远程连接,设置连接密码配置文件目录:/etc/redis.confbind改为0.0.0.0,允许外网访问requirepass设置访问密码#vim/etc/redis.conf#1,bing由127.0.0.1改为:0.0.0.0,开启远程连接bind0.0.0.0#2.设置密码requirepass123456需要指出的是,为了保证云服务器的数据安全,Redis开启远程访问时,必须对密码进行强化。然后,启动Redis服务,打开防火墙和端口,默认配置云服务器安全组,Redis服务使用的端口号为6379。另外需要在云服务器安全组中配置,确保Redis数据库可以正常连接#启动Redis服务,默认redis端口号为6379systemctlstartredis#开启防火墙systemctlstartfirewalld.service#开启6379端口firewall-cmd--zone=public--add-port=6379/tcp--permanent#配置立即生效firewall-cmd--reload完成以上操作后,我们就可以通过Redis-CLI或者Redis客户端工具进行连接最后,我们需要使用Python来操作Redis,我们需要使用pip安装一个dependency#Installdependencies方便操作redispip3installredis3。Redis操作实战在数据之前,我们需要使用Host、端口号和密码来实例化一个Redis连接对象fromredisimportRedisclassRedisF(object):def__init__(self):#InstantiateRedisobject#decode_responses=True,如果没有添加,写入bytesType#host:远程连接地址#port:Redis端口号#password:Redis授权密码self.redis_obj=Redis(host='139.199.**.**',port=6379,password='123456',decode_responses=True,charset='UTF-8',encoding='UTF-8')下面我们以对字符串、列表、set集合、zset集合、哈希表、事务的操作为例,说说Python操作这些数据的方法1、字符串操作字符串操作有两种方式,操作方法有:set()和mset()其中:set()一次只能保存一个值,参数含义如下:name:key,代表键值:value,待保存的值ex:过期时间,以秒为单位,不设置则永不过期;否则,过期删除px:过期时间,单位毫秒nx/xx:是否进行set操作,与namekey是否存在有关获取和删除值的操作方法有:get(Key),delete(KeyorKeys)#set():单字符串操作#添加一个值并设置超时时间为120sself.redis_obj.set('name','airpython',ex=120)#get():获取这个值print(self.redis_obj.get('name'))#delete():删除一个或多个值self.redis_obj.delete('name')print(self.redis_obj.get('name'))为多值数据的设置,只需要调用mset()方法,将待插入数据的键值对组成字典作为参数。同样的道理。Redis提供了mget()方法一次性获取多个key的值#mset():设置多个值self.redis_obj.mset({"foo":"foo1","zoo":"zoo1"})#mget():获取多个值result=self.redis_obj.mget("foo","zoo")print(result)2.列表操作Redis提供了很多方法用于操作列表,比较常见的有以下几种:lpush/rpush:向列表的头部或尾部插入一个或多个值,其中lpush表示在头部插入;rpush表示在末尾插入数据lset:insertvaluesbyindex插入到列表对应的位置linsert:在列表元素之前或之后插入数据lindex:通过索引获取列表中的一个元素,其中0代表第一个元素;-1表示最后一个元素lrange:通过指定起始位置和结束位置,从列表中获取指定区域的值llen:获取列表的长度,如果Key对应的列表不存在,则返回0lpop:移除并返回列表中的第一个元素rpop:移除并返回列表最后一个元素的示例代码如下:defmanage_list(self):"""操作列表:return:"""#1,添加一个newlist,在左边插入一条数据#注意:可以一次添加多个元素,也可以一次添加元素self.redis_obj.lpush('company','Ali','Tencent','Baidu')#2,去掉第一个元素self.redis_obj.lpop("company")#3,在右边插入Dataself.redis_obj.rpush('company','ByteBeat','Xiaomi')#4。删除最后一个元素self.redis_obj.rpop("company")#5。获取列表self.redis_obj的长度。llen(“公司”)#6。通过索引获取列表中的一个元素(第二个元素)print('列表中的第二个元素是:',self.redis_obj.lindex("company",1))#7.根据范围,查看列表中所有的值print(self.redis_obj.lrange('company',0,-1))3.集合操作集合是元素的无序集合,集合中的元素不能重复。Redis也提供了很多方法来方便操作Set集合。其中,比较常用的方法有:sadd:向集合中添加元素,集合中已经存在的元素将被忽略,如果集合不存在,则新建一个集合scard:返回集合中元素的个数smembers:返回集合中的所有元素srem:移除集合元素中的一个或多个元素,如果该元素不存在,则忽略sinter:返回两个集合的交集,结果仍然是一个集合sunion:返回两个集合的并集setssdiff:以第一个set参数为标准,返回两个set的差集sunionstore:计算两个set的并集,保存在一个新的set中set中的元素并返回具体实例代码如下:defmanage_set(self):"""操作setcollection:return:"""self.redis_obj.delete("fruit")#1、sadd:添加新元素到collection#添加一个元素:bananaself.redis_obj.sadd('fruit','banana')#再添加两个elementsself.redis_obj.sadd('fruit','apple','orange')#2、集合元素个数print('集合元素个数:',self.redis_obj.scard('fruit'))#3.删除一个元素self.redis_obj.srem("fruit","orange")#定义另一个集合self.redis_obj.sadd("fruit_other","banana","grape","grapefruit")#4。获取两组的交集result=self.redis_obj.sinter("fruit","fruit_other")print(type(result))print('Theintersectionis:',result)#5.得到两组unionresult=self.redis_obj.sunion("fruit","fruit_other")print(type(result))print('unionis:',result)#6、差集,以第一个集为标准result=self.redis_obj。sdiff("fruit","fruit_other")print(type(result))print('区别是:',result)#7.合并并保存到新集合self.redis_obj.sunionstore("fruit_new","fruit","fruit_other")print('新集合是:',self.redis_obj.smembers('fruit_new'))#8。判断集合中是否存在元素result=self.redis_obj.sismember("fruit","Apple")print('集合中是否存在苹果',result)#9.从集合中随机删除一个元素,然后返回result=self.redis_obj.spop("fruit")print('删除的元素是:',result)#3.集合中所有元素result=self.redis_obj.smembers('fruit')print("fruit集合最后包含的元素是:",result)4.操作zset集合zset集合与普通set集合比较,是下令。zset集合中的元素包括:value和score,score是用来对它进行排序的。比较常用的方法如下:zadd:向集合中添加元素,如果集合不存在,则新建一个集合,然后插入数据zrange:通过起点返回集合中的元素值(不包括分数)和终点;如果设置withscores=True,返回的结果会带上分数zscore:获取某个元素对应的分数zcard:获取集合中的分数元素个数zrank:获取元素在集合中的索引zrem:删除该元素集合中的元素zcount:通过最小值和最大值,判断这个范围内的分数范围内元素个数的实用代码如下:defmanage_zset(self):"""操作zset集合:return:"""self.redis_obj.delete("fruit")#添加新元素到集合中:zadd()#三个元素分别是:"banana",1/"apple",2/"pear",3self.redis_obj.zadd("fruit","banana",1,"apple",2,"pear",3)#查看集合中所有元素(不计分数)result=self.redis_obj.zrange("fruit",0,-1)#['banana','apple','pear']print('Elementsinthecollection(withoutWithscores)have:',result)#查看集合中的所有元素(withscores)result=self.redis_obj.zrange("fruit",0,-1,withscores=True)#[('banana',1.0),('apple',2.0),('pear',3.0)]print('集合中的元素(有分数)为:',result)#获取集合中某个元素的分数result=self.redis_obj.zscore("fruit","apple")print("apple对应的分数为:",result)#通过最小值和最大值,判断分数在这个范围内的元素个数result=self.redis_obj.zcount("fruit",1,2)print("集合中分数大于1小于2的元素个数:",result)#获取集合中元素的个数count=self.redis_obj.zcard("fruit")print('collectionelementsFormat:',count)#获取元素的值获取索引号index=self.redis_obj.zrank("fruit","apple")print('apple元素的索引为:',index)#删除集合中的元素:zremself.redis_obj.zrem("fruit","apple")print('删除apple后element,剩下的元素是:',self.redis_obj.zrange("fruit",0,-1))4.操作hash哈希表包含很多键值对,每个key是一个唯一的Redis操作哈希表,如下这些方法比较常用:hset:向哈希表中添加一个键值对值hmset:向哈希表中添加多个键值对值hget:获取哈希表中单个键的值tablehmget:获取哈希表中的值多个键的值列表hgetall:获取哈希表中的所有键值对hkeys:获取哈希表中的所有键列表hvals:获取哈希表中的所有值列表tablehexists:判断哈希表中,某个key是否存在hdel:删除哈希表中的一个键值对hlen:返回哈希表中键值对的个数corre对应操作代码如下:defmanage_hash(self):"""操作哈希表hash:一个key对应一个value,key不允许重复:return:"""self.redis_obj.delete("网站”)#1。新建一个hash表,key为website#往里面添加数据:baidu(字段),www.baidu.com(value)self.redis_obj.hset('website','baidu','www.alibabaidu.com')self.redis_obj.hset('网站','google','www.google.com')#2。向哈希表添加多个键值对self.redis_obj.hmset("website",{"tencent":"www.qq.com","alibaba":"www.taobao.com"})#3。获取某个key的值result=self.redis_obj.hget("website",'baidu')print("key的值为baidu:",result)#4、获取多个key的值result=self.redis_obj.hmget("website","baidu","alibaba")print("多个key的值为:",result)#5.查看哈希表中的所有值result=self.redis_obj.hgetall('website')print("哈希表中所有键值对为:",result)#6、哈希表中所有键的列表table#['baidu','google','tencent','alibaba']result=self.redis_obj.hkeys("website")print("哈希表,所有键(列表)为:",result)#7,哈希表中的所有值列表#['www.alibababaidu.com','www.google.com','www.qq.com','www.taobao.com']result=self.redis_obj.hvals("网站")print("哈希表,所有值(列表)为:",result)#8.判断某个key是否存在result=self.redis_obj.hexists("website","alibaba")print('阿里巴巴是否存在这个key:',result)#9.删除某个键值对self.redis_obj.hdel("网站",'baidu')print('删除baidu键值对后,哈希表中的数据包含:',self.redis_obj.hgetall('website'))#10、哈希表中键值对的个数为count=self.redis_obj.hlen("website")print('哈希表中共有键值对:',count)5.操作事务管道Redis支持事务管道操作,可以统一提交几个操作。执行步骤是:首先定义一个事务管道,然后通过事务对象执行一系列操作来提交事务操作,结束事务操作。下面用一个简单的例子来说明:defmanage_steps(self):"""执行事务操作:return:"""#1。定义一个事务管道self.pip=self.redis_obj.pipeline()#定义一系列操作self.pip.set('age',18)#增加一岁self.pip.incr('age')#Reduce一岁self.pip.decr('age')#执行上面定义的3个步骤的事务操作self.pip.execute()#判断打印('通过上面的一些列操作,age变为:',self.redis_obj.get('age'))4、本文最后通过Python实现了对Redis中常用数据的操作。方法不能扩展
