作者:兴安国来源:AirPython前两篇文章讲了python处理Mysql和Sqlite数据库的常用方式。本文继续说说另一种常用的数据存储方式:RedisRedis:RemoteDictionaryServer,即:远程字典服务,Redis底层是用C语言编写的。它是一个开源的、基于内存的NoSql数据库。由于Redis性能远超其他数据库,支持集群、分布式、主从同步,常用于缓存数据、高速读写等场景本文将讲讲Python操作的正确姿势Redis——准备。下面以在云服务器Centos7.8上安装Redis-Server为例。首先,在云服务器上安装Redis数据库。下载epel仓库。yuminstallepel-release安装redisyuminstallredis然后通过vim命令修改Redis配置文件,开启远程连接,设置连接密码。将bing从127.0.0.1改为:0.0.0.0,开启远程连接bind0.0.0.02,设置密码requirepass123456需要指出的是,为了保证云服务器数据的安全,Redis开启远程访问时,密码必须得到加强。然后,启动Redis服务,打开防火墙和端口,配置云服务器安全组。默认情况下,Redis服务使用的端口号为6379,另外需要在云服务器安全组中配置,保证Redis数据库可以正常连接。启动Redis服务。默认的redis端口号是6379systemctlstartredis开启防火墙systemctlstartfirewalld.service开启6379端口firewall-cmd--zone=public--add-port=6379/tcp--永久配置立即生效firewall-cmd--reload完成以上操作,我们可以通过Redis-CLI或者Redis客户端工具连接最后,要使用python操作Redis,我们需要使用pip安装一个一个依赖安装依赖,操作简单redispip3installredis——实战在操作Redis中的数据之前,我们需要使用Host、端口号、密码实例化一个Redis连接对象fromredisimportRedisclassRedisF(object):def__init__(self):实例化Redis对象decode_responses=True,如果不加则写入byte类型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')接下来我们将操作字符串,列表,集合集合,zset集合,哈希表,以事务为例,说说Python操作这些数据的方法1.字符串操作操作字符串有两种方式。操作方法有:set()和mset()。其中:set()一次只能保存一个值,参数含义以下名称:key,表示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表示尾部插入datalset:通过index,将值插入到列表的相应位置linsert:在列表元素之前或之后插入数据lindex:通过index获取列表中的一个元素,其中0代表第一个元素;-1代表最后一个elementlrange:通过指定起始位置和结束位置,从列表中获取指定区域的值llen:获取列表的长度,如果Key对应的列表不存在则返回0lpop:移除并返回第一个元素inthelistrpop:removeandreturn列表中最后一个元素的示例代码如下:defmanage_list(self):"""操作list:return:"""1.新增一个list,在左侧插入一条数据注意:可以一次添加多个元素,也可以自己一个一个添加元素.redis_obj.lpush('company','阿里','腾讯','百度')2.去掉第一个元素self.redis_obj.lpop("company")3.在右边插入数据self.redis_obj.rpush('company','字节跳动','小米')4.删除最后一个元素self.redis_obj.rpop("company")5.获取列表的长度self.redis_obj.llen("company")6.通过索引获取列表中的一个元素(第二个元素)print('列表中的第二个元素是:',self.redis_obj.lindex("company",1))7.根据Range,查看list中的所有值print(self.redis_obj.lrange('company',0,-1))3.操作SetSet是一个无序的元素集合,集合中的元素不能再说一遍,Redis也提供了很多方法来方便操作Set集合。其中比较常用的方法有:sadd:向集合中添加元素,集合中已经存在的元素会被忽略。如果集合不存在,创建一个新的setscard:返回集合元素的个数smembers:返回集合中的所有元素srem:移除集合中的一个或多个元素,如果元素不存在则忽略sinter:返回两个集合的交集,结果仍然是asetsunion:返回两个集合的并集sdiff:根据第一个set参数,返回两个集合的差集元素spop:随机删除集合中的一个元素,返回具体示例代码如下:defmanage_set(self):"""操作set集合:return:"""self.redis_obj.delete("fruit")1,sadd:添加一个元素到集合添加一个元素:Bananaself.redis_obj.sadd('fruit','banana')再添加两个元素self.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('交集是:',result)5.得到两个集合的并集result=self.redis_obj.sunion("fruit","fruit_other")print(type(result))print('Theunionis:',result)6.差集,取第一个集合为thestandardresult=self.redis_obj.sdiff("fruit","fruit_other")print(type(result))print('Thedifferencesetis:',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、从集合中随机删除一个元素,然后returnresult=self.redis_obj.spop("fruit")print('删除的元素是:',result)3.集合中的所有元素result=self.redis_obj.smembers('fruit')print("最后一个fruitcollectioncontains:",result)4.操作zset集合zset集合与普通集合集合相比是有序的。zset集合中的元素包括:value和score,score用于其中,比较常用的方法有:zadd:向集合中添加元素,如果集合不存在,则新建一个集合,以及然后插入数据zrange:通过起点和终点返回集合中的元素值(不包括Score);如果设置withscores=True,返回的结果会带上分数zscore:获取某个元素对应的分数zcard:获取集合中元素的个数zrank:获取元素在集合中的索引zrem:删除元素zcountintheset:通过最小值和最大值,判断得分在这个范围内的元素个数。实用代码如下: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)查看所有元素collection(不计分)result=self.redis_obj.zrange("fruit",0,-1)['banana','apple','pear']print('collection(不计分)中的元素是:',result)查看集合中所有元素(带分数)result=self.redis_obj.zrange("fruit",0,-1,withscores=True)[('banana',1.0),('apple',2.0),('pear',3.0)]print('Theelementsinthecollection(withscores)are:',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('Collectionelementformat:',count)获取元素的值获取索引号index=self.redis_obj.zrank("fruit","apple")print('Theapple元素的索引为:',index)删除集合中的元素:zremself.redis_obj.zrem("fruit","apple")print('删除apple元素后,剩余元素为:',self.redis_obj.zrange("fruit",0,-1))4.操作hash哈希表包含许多键值对,每个键是一个唯一的Redis操作哈希表。比较常用的方法有以下几种:hset:向哈希表中添加一个键值对hmset:向哈希表中添加多个键值对hget:获取哈希表中单个键的值hmget:获取哈希表中多个键的值列表hgetall:获取哈希表中的所有键值对hkeys:获取哈希表中所有键的哈希表hvals:获取哈希表中所有键的值列表hexists:确定哈希表中是否存在keyhdel:删除哈希表中的一个键值对hlen:返回哈希表中的key值number对应的操作代码如下:defmanage_hash(self):"""操作哈希表hash:一个key对应一个value,key不允许重复:return:"""self.redis_obj.delete("website")1.新建一个key为website的哈希表,将数据加入it:baidu(field),www.baidu.com(value)self.redis_obj.hset('website','baidu','www.alibabaidu.com')self.redis_obj.hset('website','google','www.google.com')2.向哈希表添加多个键值forself.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("All哈希表中的键值对为:",result)6.哈希表中所有键的列表['baidu','google','tencent','alibaba']result=self.redis_obj.hkeys("website")print("hashtable,allkeys(lists)are:",result)7、hashtable中的所有值列表['www.alibabaidu.com','www.google.com','www.qq.com','www.taobao.com']result=self.redis_obj.hvals("网站")print("哈希表,所有值(list)都是:",result)8.判断某个key是否存在result=self.redis_obj.hexists("website","alibaba")print('keyalibaba是否存在:',result)9.删除一个键值对self.redis_obj.hdel("website",'baidu')print('deletebaidu键值对后,哈希表中的数据包含:',self.redis_obj.hgetall('网站'))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')减少一年self.pip.decr('age')执行上面定义的3步交易操作self.pip.execute()判断打印('通过以上一系列操作,年龄变为:',self.redis_obj.get('age'))本文通过python实现对普通Redis数据的操作。如有任何问题,欢迎留言咨询!
