python操作redis实例分析

python操作redis实例分析

这篇“python操作redis实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python操作redis实例分析”文章吧。

redis 是一个 Key-Value 数据库,Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希类型)等类型。

一、安装

pipinstallredis

二、连接redis两种方式

1、方式1常规连接redis

importredisr=redis(host='localhost',port=6379,db=0)r.set('foo','bar')print(r.get('foo'))

输出结果为:

b'bar'

2、方式2使用连接池

默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池。

importredispool=redis.ConnectionPool(host='localhost',port=6379,db=0)r=redis.Redis(connection_pool=pool)r.set('foo','bar')print(r.get('foo'))r.close()#记得关闭连接池

输出结果为:

b'bar'

三、输出结果修改

redis 取出的结果默认是字节,我们可以设定decode_responses=True改成字符串

importredisr=redis(host='localhost',port=6379,db=0,decode_responses=True)r.set('foo','bar')print(r.get('foo'))

输出结果为:

'bar'

四、redis六种数据类型

1、redis不同数据类型使用场景

1)String

  计数器应用

2)List

  取最新N个数据的操作

  消息队列

  删除与过滤

  实时分析正在发生的情况,用于数据统计与防止垃圾邮件(结合Set)

3)Set

  Uniqe操作,获取某段时间所有数据排重值

  实时系统,反垃圾系统

  共同好友、二度好友

  利用唯一性,可以统计访问网站的所有独立IP

  好友推荐的时候,根据tag求交集,大于某个threshold就可以推荐

4)Hashes

  存储、读取、修改用户属性

5)Sorted Set

  排行榜应用,取TOP N操作

  需要精准设定过期时间的应用(时间戳作为Score)

  带有权重的元素,比如一个游戏的用户得分排行榜

  过期项目处理,按照时间排序

2、redis六种不同数据类型实例

1)字符串类型String

  • redis中的String在在内存中按照一个name对应一个value来存储。如图:

1.1 set 添加字符串

set(name,value,ex=None,px=None,nx=False,xx=False)

在 Redis 中设置值,默认,不存在则创建,存在则修改。

参数:

  • ex - 过期时间(秒)

  • px - 过期时间(毫秒)

  • nx - 如果设置为True,则只有name不存在时,当前set操作才执行(新建)

    #前提redis数据库db当中没有key='foo'importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set('foo','bar',nx=True)print(r.get('foo'))


    输出:

    'bar'



  • xx - 如果设置为True,则只有name存在时,当前set操作才执行(修改)

#前提redis数据库db=3当中没有key='foo'importredisr=redis.Redis(host='199.28.10.122',port=6389,db=3,password='test1234',decode_responses=True)r.set('foo','bar',xx=True)print(r.get('foo'))

输出:

None

1.2 setnx KEY值不存在时,添加

setnx(name,value)

设置值,只有name不存在时,执行设置操作(添加)

#前提redis数据库db当中没有key='too'importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.setnx('too','tar')print(r.get('too'))r.setnx('too','looktar')print(r.get('too'))

输出:

‘tar’‘tar’#因为第一个setnx已经添加了对应数据,所以执行setnx添加('too','looktar')是不执行的

1.3 setex 设置过期时间秒

setex(name,time,value)

设置值

参数:

time - 过期时间(数字秒 或 timedelta对象)

importredisimporttimer=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.setex('foo',5,'bar')print(r.get('foo'))print('等待5秒')time.sleep(5)print(r.get('foo'))

运行结果:

bar等待5秒None#5秒之后数据过期了

1.4 psetex 设置过期时间毫秒

psetex(name,time_ms,value)

设置值

参数:

time_ms - 过期时间(数字毫秒 或 timedelta对象)

importredisimporttimer=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.psetex('foo',5000,'bar')print(r.get('foo'))print('等待5秒')time.sleep(5)print(r.get('foo'))

运行结果:

bar等待5秒None#5秒之后数据过期了

1.5 mset 批量设置

mset(*args,**kwargs)

批量设置值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.mset({'k1':'v1','k2':'v2'})print(r.mget("k1","k2"))#一次取出多个键对应的值print(r.mget("k1"))

运行结果:

['v1','v2']['v1']

1.6 mget 批量获取

mget(keys,*args)

批量设置值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.mset({'k1':'v1','k2':'v2'})print(r.mget("k1","k2"))#一次取出多个键对应的值#或print(r.mget(["k1","k2"]))#一次取出多个键对应的值print(r.mget("k1"))

运行结果:

['v1','v2']['v1','v2']['v1']

1.7 getset设置新值并获取原来的值

getset(name,value)

设置并获取原来的值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set('food','beef')print(r.get('food'))print(r.getset("food","barbecue"))#设置的新值是barbecue设置前的值是beefprint(r.get('food'))

运行结果:

beef#原来的值beef#return的是原来的值barbecue#重新获取“food”的值

1.8 getrange获取子序列(根据字节获取,非字符)

getrange(key,start,end)

获取子序列(根据字节获取,非字符)

参数:

  • name - Redis 的 name

  • start - 起始位置(字节)

  • end - 结束位置(字节)

如: "祖国万岁" ,0-3表示 "祖"(Python字符汉字在utf-8编码下占三个字节,在gbk编码下占两个字节)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set("cn_name","祖国万岁")#汉字print(r.getrange("cn_name",0,2))#取索引号是0-2前3位的字节祖切片操作(一个汉字3个字节1个字母一个字节每个字节8bit)print(r.getrange("cn_name",0,-1))#取所有的字节祖国万岁切片操作r.set("en_name","zuguowansui")#字母print(r.getrange("en_name",0,2))#取索引号是0-2前3位的字节zug切片操作(一个汉字3个字节1个字母一个字节每个字节8bit)print(r.getrange("en_name",0,-1))#取所有的字节uguowansui切片操作

运行结果:

祖祖国万岁zugzuguowansui

1.9 setrange修改字符串内容

setrange(name,offset,value)

修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)

参数:

  • offset - 字符串的索引,字节(一个汉字三个字节)

  • value - 要设置的值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.setrange("en_name",1,"ccc")print(r.get("en_name"))#zcccowansui原始值是zuguowansui从索引号是1开始替换成ccc

运行结果:

zcccowansui

1.10 setbit对 name 对应值的二进制表示的位进行操作

setbit(name,offset,value)

  • 对 name 对应值的二进制表示的位进行操作

    参数:

    注:如果在Redis中有一个对应: n1 = "foo",

    那么字符串foo的二进制表示为:01100110 01101111 01101111

    所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,

    那么最终二进制则变成 01100111 01101111 01101111,即:"goo"


    • name - redis的name

    • offset - 位的索引(将值变换成二进制后再进行索引)

    • value - 值只能是 1 或 0

1.11 getbit 获取name对应的值的二进制表示中的某位的值 (0或1)

getbit(name,offset)

获取name对应的值的二进制表示中的某位的值 (0或1)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.getbit("foo1",0))#0foo1对应的二进制4个字节32位第0位是0还是1

1.12 bitcount获取name对应的值的二进制表示中 1 的个数

bitcount(key,start=None,end=None)

获取name对应的值的二进制表示中 1 的个数

参数:

  • key - Redis的name

  • start - 字节起始位置

  • end - 字节结束位置

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set('foo','baksks')print(r.get("foo"))#goo101100111print(r.bitcount("foo",0,1))#11

运行结果:

baksks6

1.13 bittop获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值

bitop(operation,dest,*keys)

获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值

参数:

  • operation - AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)

  • dest - 新的Redis的name

  • *keys - 要查找的Redis的name

如:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set("n1",'goo1')r.set("n2",'baaanew')r.set("n3",'appaanew')r.bitop("AND",'new_name','n1','n2','n3')print(r.get('new_name'))

运行结果:

```!

1.14 strlen返回name对应值的字节长度(一个汉字3个字节)

strlen(name)

返回name对应值的字节长度(一个汉字3个字节)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set('foo1s','flash')print(r.strlen("foo1s"))

运行结果:

5

1.15 incr自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增

incr(self,name,amount=1)

自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。

参数:

  • name - Redis的name

  • amount - 自增数(必须是整数)

注:同 incrby

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set('foo1','flash')r.set('foo2','fla2sh')r.set("foo",123)print(r.mget("foo","foo1","foo2","k1","k2"))r.incr("foo",amount=1)print(r.mget("foo","foo1","foo2","k1","k2"))r.incr("foono",amount=1)#不存在‘foono’print(r.mget("foono","foo1","foo2","k1","k2"))

运行结果:

['123','flash','fla2sh','v1','v2']['124','flash','fla2sh','v1','v2']['1','flash','fla2sh','v1','v2']#当name不存在时,则创建name=amount

应用场景:

假定我们对一系列页面需要记录点击次数。例如论坛的每个帖子都要记录点击次数,而点击次数比回帖的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了。

当redis服务器启动时,可以从关系数据库读入点击数的初始值(12306这个页面被访问了34634次)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set("visit:12306:totals",34634)print(r.get("visit:12306:totals"))r.incr("visit:12306:totals")print(r.get("visit:12306:totals"))

运行结果:

3463434635

1.16 incrbyfloat自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

incrbyfloat(self,name,amount=1.0)

自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

参数:

  • name - Redis的name

  • amount - 自增数(浮点型)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set("foo1","123.0")r.set("foo2","221.0")print(r.mget("foo1","foo2"))r.incrbyfloat("foo1",amount=2.0)r.incrbyfloat("foo2",amount=3.0)print(r.mget("foo1","foo2"))

运行结果:

['123.0','221.0']['125','224']

1.17 decr自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。

decr(self,name,amount=1)

自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。

参数:

  • name - Redis的name

  • amount - 自减数(整数)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set("foo1","123")r.set("foo4","221")r.decr("foo4",amount=3)#递减3r.decr("foo1",amount=1)#递减1print(r.mget("foo1","foo4"))

运行结果:

['122','218']

1.18 appen在 name对应的值后面追加内容

append(key,value)

在redis name对应的值后面追加内容

参数:

  • key - redis的name

  • value - 要追加的字符串

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.set("foo1","123")r.append("foo1","haha")#在name对应的值junxi后面追加字符串hahaprint(r.mget("foo1"))

运行结果:

['123haha']

2)hash

2.1 hset单个增加--修改(单个取出)--没有就新增,有的话就修改

hset(name,key,value)

name对应的hash中设置一个键值对(不存在,则创建;否则,修改)

参数:

  • name - redis的name

  • key - name对应的hash中的key

  • value - name对应的hash中的value

注:hsetnx(name, key, value) 当name对应的hash中不存在当前key时则创建(相当于添加

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hset("hash1","k1","v1")r.hset("hash1","k2","v2")print(r.hkeys("hash1"))#取hash中所有的keyprint(r.hget("hash1","k1"))#单个取hash的key对应的值print(r.hmget("hash1","k1","k2"))#多个取hash的key对应的值r.hsetnx("hash1","k2","v3")#只能新建print(r.hget("hash1","k2"))

运行结果:

['k1','k2']v1['v1','v2']v2#这里因为存在所以原值没有被修改,没有新增

2.2 hmset在name对应的hash中批量设置键值对

hmset(name,mapping)

在name对应的hash中批量设置键值对

参数:

  • name - redis的name

  • mapping - 字典,如:{'k1':'v1', 'k2': 'v2'}

如:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hmset("hash2",{"k2":"v2","k3":"v3"})print(r.hget("hash2",'k2'))

运行结果:

v2

2.3 hmget在name对应的hash中获取多个key的值

hmget(name,keys,*args)

在name对应的hash中获取多个key的值

参数:

  • name - reids对应的name

  • keys - 要获取key集合,如:['k1', 'k2', 'k3']

  • *args - 要获取的key,如:k1,k2,k3

如:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hmset("hash2",{"k2":"v2","k3":"v3"})print(r.hget("hash2","k2"))#单个取出"hash2"的key-k2对应的valueprint(r.hmget("hash2","k2","k3"))#批量取出"hash2"的key-k2k3对应的value--方式1print(r.hmget("hash2",["k2","k3"]))#批量取出"hash2"的key-k2k3对应的value--方式2

运行结果:

v2['v2','v3']['v2','v3']

2.4 hgetall取出所有键值对

hgetall(name)

获取name对应hash的所有键值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hmset("hash2",{"k2":"v2","k3":"v3"})print(r.hgetall("hash2"))

运行结果:

{'k2':'v2','k3':'v3'}

2.5 hlen得到所有键值对的格式 hash长度

hlen(name)

获取name对应的hash中键值对的个数

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hmset("hash2",{"k2":"v2","k3":"v3"})print(r.hlen("hash2"))

运行结果:

2

2.6 hkeys得到所有的keys(类似字典的取所有keys)

hkeys(name)

获取name对应的hash中所有的key的值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hmset("hash2",{"k2":"v2","k3":"v3"})print(r.hkeys("hash2"))

运行结果:

['k2','k3']

2.7 hvals得到所有的value(类似字典的取所有value)

hvals(name)

获取name对应的hash中所有的key的值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hmset("hash2",{"k2":"v2","k3":"v3"})print(r.hvals("hash2"))

运行结果:

['v2','v3']

2.8 hvals判断成员是否存在(类似字典的in)

hexists(name,key)

检查 name 对应的 hash 是否存在当前传入的 key

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hmset("hash2",{"k2":"v2","k3":"v3"})print(r.hexists("hash2","k4"))#False不存在print(r.hexists("hash2","k2"))#True存在

运行结果:

FalseTrue

2.9 hdel删除键值对

hdel(name,*keys)

将name对应的hash中指定key的键值对删除

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.hgetall("hash1"))r.hset("hash1","k2","v222")#修改已有的keyk2r.hset("hash1","k11","v1")#新增键值对k11r.hdel("hash1","k1")#删除一个键值对print(r.hgetall("hash1"))

运行结果:

{'k2':'v222','k11':'v1','k3':'v22332','k1':'v1'}{'k2':'v222','k11':'v1','k3':'v22332'}#k1被删除了

2.10 hincrby自增自减整数(将key对应的value--整数 自增1或者2,或者别的整数 负数就是自减)

hincrby(name,key,amount=1)

自增name对应的hash中的指定key的值,不存在则创建key=amount

参数:

  • name - redis中的name

  • key - hash对应的key

  • amount - 自增数(整数)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.hset("hash1","k3",123)r.hincrby("hash1","k3",amount=-1)print(r.hgetall("hash1"))r.hincrby("hash1","k4",amount=1)#不存在的话,value默认就是1print(r.hgetall("hash1"))

运行结果:

{'k2':'v222','k11':'v1','k3':'122'}{'k2':'v222','k11':'v1','k3':'122','k4':'1'}

2.11 hscan取值查看--分片读取

hscan(name,cursor=0,match=None,count=None)

增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆

参数:

  • name - redis的name

  • cursor - 游标(基于游标分批取获取数据)

  • match - 匹配指定key,默认None 表示所有的key

  • count - 每次分片最少获取个数,默认None表示采用Redis的默认分片个数

如:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.hgetall("hash1"))print(r.hscan("hash1"))

运行结果:

{'k2':'v222','k11':'v1','k3':'122','k4':'1'}(0,{'k2':'v222','k11':'v1','k3':'122','k4':'1'})

2.12 hscan_iter利用yield封装hscan创建生成器,实现分批去redis中获取数据

hscan_iter(name,match=None,count=None))

利用yield封装hscan创建生成器,实现分批去redis中获取数据

参数:

  • match - 匹配指定key,默认None 表示所有的key

  • count - 每次分片最少获取个数,默认None表示采用Redis的默认分片个数

如:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.hgetall("hash1"))foriteminr.hscan_iter('hash1'):print(item)print(r.hscan_iter("hash1"))#生成器内存地址

运行结果:

{'k2':'v222','k11':'v1','k3':'122','k4':'1'}('k2','v222')('k11','v1')('k3','122')('k4','1')

3)list

3.1 lpush增加(类似于list的append,只是这里是从左边新增加)--没有就新建

lpush(name,values)

在name对应的list中添加元素,每个新的元素都添加到列表的最左边

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.lpush("list1",11,22,33)print(r.lrange('list1',0,-1))

运行结果:

['33','22','11']

3.2 rpush增加(类似于list的append,只是这里是从右边新增加)--没有就新建

rpush(name,values)

在name对应的list中添加元素,每个新的元素都添加到列表的最右边

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.rpush("list2",11,22,33)print(r.lrange('list2',0,-1))

运行结果:

['11','22','33']

3.3 llen查询列表长度

llen(name)

在name对应的list中添加元素,每个新的元素都添加到列表的最右边

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.rpush("list2",11,22,33)print(r.llen("list2"))#列表长度print(r.lrange('list2',0,-1))

运行结果:

6['11','22','33','11','22','33']

3.4 lpushx往已经有的name的列表的左边添加元素,没有的话无法创建

lpushx(name,value)

在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边

更多:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.lpushx("list10",10)#这里list10不存在print(r.llen("list10"))#0print(r.lrange("list10",0,-1))#[]r.lpushx("list2",77)#这里"list2"之前已经存在,往列表最左边添加一个元素,一次只能添加一个print(r.llen("list2"))#列表长度print(r.lrange("list2",0,-1))#切片取出值,范围是索引号0到-1(最后一个元素

运行结果:

0[]7['77','11','22','33','11','22','33']

3.5 rpushx往已经有的name的列表的右边添加元素,没有的话无法创建

rpushx(name,value)

在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边

更多:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.rpushx("list2",99)#这里"foo_list1"之前已经存在,往列表最右边添加一个元素,一次只能添加一个print(r.llen("list2"))#列表长度print(r.lrange("list2",0,-1))#切片取出值,范围是索引号0到-1(最后一个元素)

运行结果:

8['77','11','22','33','11','22','33','99']

3.6 linsert新增(固定索引号位置插入元素)

linsert(name,where,refvalue,value)

在name对应的列表的某一个值前或后插入一个新值

参数:

  • name - redis的name

  • where - BEFORE或AFTER

  • refvalue - 标杆值,即:在它前后插入数据

  • value - 要插入的数据

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.linsert("list2","before","11","00")#往列表中左边第一个出现的元素"11"前插入元素"00"print(r.lrange("list2",0,-1))#切片取出值,范围是索引号0-最后一个元素

运行结果:

['77','00','11','22','33','11','22','33','99']

3.7 lset修改(指定索引号进行修改)

r.lset(name,index,value)

对name对应的list中的某一个索引位置重新赋值

参数:

  • name - redis的name

  • index - list的索引位置

  • value - 要设置的值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.lset("list2",0,-11)#把索引号是0的元素修改成-11print(r.lrange("list2",0,-1))

运行结果:

['-11','00','11','22','33','11','22','33','99']

3.8 lset修改(指定索引号进行修改)

r.lset(name,index,value)

对name对应的list中的某一个索引位置重新赋值

参数:

  • name - redis的name

  • index - list的索引位置

  • value - 要设置的值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.lset("list2",0,-11)#把索引号是0的元素修改成-11print(r.lrange("list2",0,-1))

运行结果(发现没成功,没找到原因):

['-11','11','-11','00','11','22','33','11','22','33','99']

3.9 lrem删除(指定值进行删除)

r.lrem(name,value,num)

在name对应的list中删除指定的值

参数:

  • name - redis的name

  • value - 要删除的值

  • num - num=0,删除列表中所有的指定值;

  • num=2 - 从前到后,删除2个, num=1,从前到后,删除左边第1个

  • num=-2 - 从后向前,删除2个

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.lrem("list2","11",1)#将列表中左边第一次出现的"11"删除print(r.lrange("list2",0,-1))r.lrem("list2","99",-1)#将列表中右边第一次出现的"99"删除print(r.lrange("list2",0,-1))r.lrem("list2","22",0)#将列表中所有的"22"删除print(r.lrange("list2",0,-1))

运行结果(发现没成功,没找到原因):

['-11','11','-11','00','11','22','33','11','22','33','99']['-11','11','-11','00','11','22','33','11','22','33','99']['-11','11','-11','00','11','22','33','11','22','33','99']

3.10 lpop删除并返回

r.lpop(name)

在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素

更多:

rpop(name) 表示从右向左操作

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.lrem("list2","11",1)#将列表中左边第一次出现的"11"删除print(r.lrange("list2",0,-1))r.lrem("list2","99",-1)#将列表中右边第一次出现的"99"删除print(r.lrange("list2",0,-1))r.lrem("list2","22",0)#将列表中所有的"22"删除print(r.lrange("list2",0,-1))

运行结果:

['11','-11','00','11','22','33','11','22','33','99']['11','-11','00','11','22','33','11','22','33']

3.11 ltrim删除索引之外的值

ltrim(name,start,end)

在name对应的列表中移除没有在start-end索引之间的值

参数:

  • name - redis的name

  • start - 索引的起始位置

  • end - 索引结束位置

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.lrange("list2",0,-1))r.ltrim("list2",0,2)#删除索引号是0-2之外的元素,值保留索引号是0-2的元素print(r.lrange("list2",0,-1))

运行结果:

['11','-11','00','11','22','33','11','22','33']['11','-11','00']

3.12 lindex取值(根据索引号取值)

lindex(name,index)

在name对应的列表中根据索引获取列表元素

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.lrange("list2",0,-1))print(r.lindex("list2",0))#取出索引号是0的值

运行结果:

['11','-11','00']11

3.13 rpoplpush移动 元素从一个列表移动到另外一个列表

rpoplpush(src,dst)

从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边

参数:

  • src - 要取数据的列表的 name

  • dst - 要添加数据的列表的 name

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.lrange("list1",0,-1))print(r.lrange("list2",0,-1))r.rpoplpush("list1","list2")print(r.lrange("list2",0,-1))

运行结果:

['33','22','11']['11','-11','00']['11','11','-11','00']

3.14 brpoplpush移动 元素从一个列表移动到另外一个列表 可以设置超时

brpoplpush(src,dst,timeout=0)

从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧

参数:

  • src - 取出并要移除元素的列表对应的name

  • dst - 要插入元素的列表对应的name

  • timeout - 当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.lrange("list1",0,-1))print(r.lrange("list2",0,-1))r.brpoplpush("list1","list2",timeout=2)print(r.lrange("list2",0,-1))

运行结果:

['33','22']['11','11','-11','00']['22','11','11','-11','00']

3.15 blpop一次移除多个列表

blpop(keys,timeout)

将多个列表排列,按照从左到右去pop对应列表的元素

参数:

  • keys - redis的name的集合

  • timeout - 超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞

更多:

r.brpop(keys, timeout)同 blpop,将多个列表排列,按照从右像左去移除各个列表内的元素

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.lpush("list10",3,4,5)r.lpush("list11",3,4,5)whileTrue:r.blpop(["list10","list11"],timeout=2)print(r.lrange("list10",0,-1),r.lrange("list11",0,-1))

运行结果:

['4','3']['5','4','3']['3']['5','4','3'][]['5','4','3'][]['4','3'][]['3'][][][][][][][][][][][][][][][][][][]

3.16 自定义增量迭代:

由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要获取name对应的所有列表。

循环列表

但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.lrange("list2",0,-1))deflist_iter(name):"""自定义redis列表增量迭代:paramname:redis中的name,即:迭代name对应的列表:return:yield返回列表元素"""list_count=r.llen(name)forindexinrange(list_count):yieldr.lindex(name,index)#使用foriteminlist_iter('list2'):#遍历这个列表print(item)

运行结果:

['22','11','11','-11','00']221111-1100

4)set

4.1 sadd新增

sadd(name,values)

name - 对应的集合中添加元素

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.sadd("set1",33,44,55,66)#往集合中添加元素print(r.scard("set1"))#集合的长度是4print(r.smembers("set1"))#获取集合中所有的成员

运行结果:

4{'66','55','44','33'}

4.2 scard.获取元素个数 类似于len

scard(name)

获取name对应的集合中元素个数

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.smembers("set1"))#获取集合中所有的成员print(r.scard("set1"))#集合的长度是4

运行结果:

{'55','66','33','44'}4

4.3 smembets获取集合中所有的成员

smembers(name)

获取name对应的集合的所有成员

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.smembers("set1"))#获取集合中所有的成员sscan(name,cursor=0,match=None,count=None)

运行结果:

{'55','66','33','44'}

4.4 sscan获取集合中所有的成员--元组形式

sscan(name,cursor=0,match=None,count=None)

获取集合中所有的成员--元组形式

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.sscan("set1"))

运行结果:

(0,['33','44','55','66'])

4.5 sscan_iter获取集合中所有的成员--迭代器的方式

sscan_iter(name,match=None,count=None)

获取集合中所有的成员--迭代器的方式

同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.sscan("set1"))

运行结果:

33445566

4.6 sdiff差集

sdiff(keys,*args)

在第一个name对应的集合中且不在其他name对应的集合的元素集合

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.sadd("set2",11,22,33)print(r.smembers("set1"))#获取集合中所有的成员print(r.smembers("set2"))print(r.sdiff("set1","set2"))#在集合set1但是不在集合set2中print(r.sdiff("set2","set1"))#在集合set2但是不在集合set1中

运行结果:

{'55','33','66','44'}{'22','33','11'}{'55','66','44'}{'22','11'}

4.6 sdiffstore差集--差集存在一个新的集合中

sdiffstore(dest,keys,*args)

获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.sdiffstore("set3","set1","set2")#在集合set1但是不在集合set2中print(r.smembers("set3"))

运行结果:

{'55','44','66'}

4.7 sinter交集

sinter(keys,*args)

获取多一个name对应集合的交集

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.sinter("set1","set2"))#取2个集合的交集

运行结果:

{'33'}

4.8 sunion并集

sunion(keys,*args)

获取多个name对应的集合的并集

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.sunion("set1","set2"))#取2个集合的并集

运行结果:

{'66','33','44','11','22','55'}

4.9 sunionstore并集--并集存在一个新的集合

sunionstore(dest,keys,*args)

获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.sunionstore("set3","set1","set2"))#取2个集合的并集print(r.smembers("set3"))

运行结果:

6{'33','66','55','22','11','44'}

4.10 sismember判断是否是集合的成员 类似in

sismember(name,value)

检查value是否是name对应的集合的成员,结果为True和False

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.sismember("set1",33))#33是集合的成员print(r.sismember("set1",23))#23不是集合的成员

运行结果:

TrueFalse

4.11 smove移动

smove(src,dst,value)

将某个成员从一个集合中移动到另外一个集合

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.smove("set1","set2",44)print(r.smembers("set1"))print(r.smembers("set2"))

运行结果:

{'66','55','33'}{'44','33','22','11'}

4.11 spop删除--随机删除并且返回被删除值

spop(name)

从集合移除一个成员,并将其返回,说明一下,集合是无序的,所有是随机删除的

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.spop("set2"))#这个删除的值是随机删除的,集合是无序的print(r.smembers("set2"))

运行结果:

44{'11','22','33'}

4.12 srem删除--指定值删除

srem(name,values)

在name对应的集合中删除某些值

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.srem("set2",11))#从集合中删除指定值11print(r.smembers("set2"))

运行结果:

1{'22','33'}

5)有序set

Set操作,Set集合就是不允许重复的列表,本身是无序的。

有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。

5.1 新增

zadd(name,mapping,nx=False,xx=False,ch=False,incr=False)

在name对应的有序集合中添加元素

如:

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.zadd("zset1",{'n1':100,'n2':99,'n3':87})r.zadd("zset2",{'m1':100,'m2':99,'m3':87})print(r.zcard("zset1"))#集合长度print(r.zcard("zset2"))#集合长度print(r.zrange("zset1",0,-1))#获取有序集合中所有元素print(r.zrange("zset2",0,-1,withscores=True))#获取有序集合中所有元素和分数

运行结果:

33['n3','n2','n1'][('m3',87.0),('m2',99.0),('m1',100.0)]

5.2 zcard获取有序集合元素个数 类似于len

zcard(name)

获取name对应的有序集合元素的数量

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zcard("zset1"))#集合长度

运行结果:

3

5.3 zrange获取有序集合的所有元素

zrange(name,start,end,desc=False,withscores=False,score_cast_func=float)

按照索引范围获取name对应的有序集合的元素

参数:

  • name - redis的name

  • start - 有序集合索引起始位置(非分数)

  • end - 有序集合索引结束位置(非分数)

  • desc - 排序规则,默认按照分数从小到大排序

  • withscores - 是否获取元素的分数,默认只获取元素的值

  • score_cast_func - 对分数进行数据转换的函数

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zrange("zset1",0,1))#集合长度

运行结果:

['n3','n2']

5.3 zrevrange从大到小排序(同zrange,集合是从大到小排序的)

zrevrange(name,start,end,withscores=False,score_cast_func=float)

从大到小排序(同zrange,集合是从大到小排序的)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zrevrange("zset1",0,-1))#只获取元素,不显示分数print(r.zrevrange("zset1",0,-1,withscores=True))#获取有序集合中所有元素和分数,分数倒序

运行结果:

['n1','n2','n3'][('n1',100.0),('n2',99.0),('n3',87.0)]

5.4 zrangebyscore按照分数范围获取name对应的有序集合的元素

zrangebyscore(name,min,max,start=None,num=None,withscores=False,score_cast_func=float)

按照分数范围获取name对应的有序集合的元素

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)foriinrange(1,30):element='n'+str(i)r.zadd("zset3",{element:i})print(r.zrangebyscore("zset3",15,25))##在分数是15-25之间,取出符合条件的元素print(r.zrangebyscore("zset3",12,22,withscores=True))#在分数是12-22之间,取出符合条件的元素(带分数)

运行结果:

['n15','n16','n17','n18','n19','n20','n21','n22','n23','n24','n25'][('n12',12.0),('n13',13.0),('n14',14.0),('n15',15.0),('n16',16.0),('n17',17.0),('n18',18.0),('n19',19.0),('n20',20.0),('n21',21.0),('n22',22.0)]

5.5 zrevrangebyscore按照分数范围获取有序集合的元素并排序(默认从大到小排序)

zrevrangebyscore(name,max,min,start=None,num=None,withscores=False,score_cast_func=float)

按照分数范围获取有序集合的元素并排序(默认从大到小排序)

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zrevrangebyscore("zset3",22,11,withscores=True))#在分数是22-11之间,取出符合条件的元素按照

运行结果:

[('n22',22.0),('n21',21.0),('n20',20.0),('n19',19.0),('n18',18.0),('n17',17.0),('n16',16.0),('n15',15.0),('n14',14.0),('n13',13.0),('n12',12.0),('n11',11.0)]

5.6 zscan获取所有元素--默认按照分数顺序排序

zscan(name,cursor=0,match=None,count=None,score_cast_func=float)

获取所有元素--默认按照分数顺序排序

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zscan("zset3"))

运行结果:

(0,[('n1',1.0),('n2',2.0),('n3',3.0),('n4',4.0),('n5',5.0),('n6',6.0),('n7',7.0),('n8',8.0),('n9',9.0),('n10',10.0),('n11',11.0),('n12',12.0),('n13',13.0),('n14',14.0),('n15',15.0),('n16',16.0),('n17',17.0),('n18',18.0),('n19',19.0),('n20',20.0),('n21',21.0),('n22',22.0),('n23',23.0),('n24',24.0),('n25',25.0),('n26',26.0),('n27',27.0),('n28',28.0),('n29',29.0)])

5.7 zscan_iter获取所有元素--迭代器

zscan_iter(name,match=None,count=None,score_cast_func=float)

获取所有元素--迭代器

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zscan("zset3"))

运行结果:

('n1',1.0)('n2',2.0)('n3',3.0)('n4',4.0)('n5',5.0)('n6',6.0)('n7',7.0)('n8',8.0)('n9',9.0)('n10',10.0)('n11',11.0)('n12',12.0)('n13',13.0)('n14',14.0)('n15',15.0)('n16',16.0)('n17',17.0)('n18',18.0)('n19',19.0)('n20',20.0)('n21',21.0)('n22',22.0)('n23',23.0)('n24',24.0)('n25',25.0)('n26',26.0)('n27',27.0)('n28',28.0)('n29',29.0)

5.8zcount获取name对应的有序集合中分数 在 [min,max] 之间的个数

zcount(name,min,max)

获取name对应的有序集合中分数 在 [min,max] 之间的个数

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zrange("zset3",0,-1,withscores=True))print(r.zcount("zset3",11,22))

运行结果:

[('n1',1.0),('n2',2.0),('n3',3.0),('n4',4.0),('n5',5.0),('n6',6.0),('n7',7.0),('n8',8.0),('n9',9.0),('n10',10.0),('n11',11.0),('n12',12.0),('n13',13.0),('n14',14.0),('n15',15.0),('n16',16.0),('n17',17.0),('n18',18.0),('n19',19.0),('n20',20.0),('n21',21.0),('n22',22.0),('n23',23.0),('n24',24.0),('n25',25.0),('n26',26.0),('n27',27.0),('n28',28.0),('n29',29.0)]12

5.9zincrby自增

zincrby(name,amount,value)

自增name对应的有序集合的 name 对应的分数

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.zincrby("zset3",2,"n2")#每次将n2的分数自增2print(r.zrange("zset3",0,-1,withscores=True))

运行结果:

[('n1',1.0),('n3',3.0),('n2',4.0),('n4',4.0),('n5',5.0),('n6',6.0),('n7',7.0),('n8',8.0),('n9',9.0),('n10',10.0),('n11',11.0),('n12',12.0),('n13',13.0),('n14',14.0),('n15',15.0),('n16',16.0),('n17',17.0),('n18',18.0),('n19',19.0),('n20',20.0),('n21',21.0),('n22',22.0),('n23',23.0),('n24',24.0),('n25',25.0),('n26',26.0),('n27',27.0),('n28',28.0),('n29',29.0)]

5.10 zrank获取值的索引号

zrank(name,value)

获取某个值在 name对应的有序集合中的索引(从 0 开始)

更多:

zrevrank(name, value),从大到小排序

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zrank("zset3","n1"))#n1的索引号是0这里按照分数顺序(从小到大)print(r.zrank("zset3","n6"))#n6的索引号是1print(r.zrevrank("zset3","n1"))#n1的索引号是29这里安照分数倒序(从大到小)

运行结果:

0528

5.11 zrem删除--指定值删除

zrem(name,values)

删除name对应的有序集合中值是values的成员

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.zrem("zset3","n3")#删除有序集合中的元素n3删除单个print(r.zrange("zset3",0,-1))

运行结果:

['n1','n2','n4','n5','n6','n7','n8','n9','n10','n11','n12','n13','n14','n15','n16','n17','n18','n19','n20','n21','n22','n23','n24','n25','n26','n27','n28','n29']

5.12 zremrangebyrank删除--根据排行范围删除,按照索引号来删除

zremrangebyrank(name,min,max)

根据排行范围删除

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.zremrangebyrank("zset3",0,1)#删除有序集合中的索引号是0,1的元素print(r.zrange("zset3",0,-1))

运行结果:

['n4','n5','n6','n7','n8','n9','n10','n11','n12','n13','n14','n15','n16','n17','n18','n19','n20','n21','n22','n23','n24','n25','n26','n27','n28','n29']

5.13 zremrangebyscore删除--根据分数范围删除

zremrangebyscore(name,min,max)

根据排行范围删除--根据分数范围删除

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.zremrangebyscore("zset3",11,22)#删除有序集合中的分数是11-22的元素print(r.zrange("zset3",0,-1))

运行结果:

['n4','n5','n6','n7','n8','n9','n10','n23','n24','n25','n26','n27','n28','n29']

5.14 zscore获取值对应的分数

zscore(name,value)

获取name对应有序集合中 value 对应的分数

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.zscore("zset3","n27"))#获取元素n27对应的分数27

运行结果:

27.0

五、其他常用操作

1.删除

delete(*names)

根据删除redis中的任意数据类型(string、hash、list、set、有序set)

r.delete("gender")#删除key为gender的键值对

2.检查名字是否存在

exists(name)

检测redis的name是否存在,存在就是True,False 不存在

print(r.exists("zset1"))

3.模糊匹配

keys(pattern='')

根据模型获取redis的name

更多:

  • KEYS * 匹配数据库中所有 key 。

  • KEYS h?llo 匹配 hello , hallo 和 hxllo 等。

  • KEYS hllo 匹配 hllo 和 heeeeello 等。

  • KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo

print(r.keys("foo*"))

4.设置超时时间

expire(name,time)

为某个redis的某个name设置超时时间

r.lpush("list5",11,22)r.expire("list5",time=3)print(r.lrange("list5",0,-1))time.sleep(3)print(r.lrange("list5",0,-1))

5.重命名

rename(src,dst)

对redis的name重命名

r.lpush("list5",11,22)r.rename("list5","list5-1")

6.随机获取name

randomkey()

随机获取一个redis的name(不删除)

print(r.randomkey())

7.获取类型

type(name)

获取name对应值的类型

print(r.type("set1"))print(r.type("hash2"))

8.查看所有元素

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.scan(cursor=0,match=None,count=None)print(r.hscan("hash2"))print(r.sscan("set3"))print(r.zscan("zset2"))print(r.getrange("foo1",0,-1))print(r.lrange("list2",0,-1))print(r.smembers("set3"))print(r.zrange("zset3",0,-1))print(r.hgetall("hash1"))

运行结果:

(0,{'k2':'v2','k3':'v3'})(0,['11','22','33','44','55','66'])(0,[('m3',87.0),('m2',99.0),('m1',100.0)])123haha['22','11','11','-11','00']{'66','55','11','44','22','33'}['n4','n5','n6','n7','n8','n9','n10','n23','n24','n25','n26','n27','n28','n29']{'k2':'v222','k11':'v1','k3':'122','k4':'1'}

9.查看所有元素--迭代器

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)r.scan_iter(match=None,count=None)foriinr.hscan_iter("hash1"):print(i)foriinr.sscan_iter("set3"):print(i)foriinr.zscan_iter("zset3"):print(i)

运行结果:

('k2','v222')('k11','v1')('k3','122')('k4','1')112233445566('n4',4.0)('n5',5.0)('n6',6.0)('n7',7.0)('n8',8.0)('n9',9.0)('n10',10.0)('n23',23.0)('n24',24.0)('n25',25.0)('n26',26.0)('n27',27.0)('n28',28.0)('n29',29.0)

六、other方法

importredisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)print(r.get('name'))#查询key为name的值r.delete("gender")#删除key为gender的键值对print(r.keys())#查询所有的Keyprint(r.dbsize())#当前redis包含多少条数据r.save()#执行"检查点"操作,将数据写回磁盘。保存时阻塞#r.flushdb()#清空r中的所有数据

运行结果:

None['set2','k2','food','visit:12306:totals','foo','foono','set3','list2','cn_name','foo2','n3','foo1','new_name','too','zset1','list1','set1','hash1','zset2','n1','hash2','foo4','n2','en_name','k1','zset3','foo1s']27

七、管道(pipeline)

redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类。它通过减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的功能。

importredisimporttimepool=redis.ConnectionPool(host='localhost',port=6379,decode_responses=True)r=redis.Redis(connection_pool=pool)#pipe=r.pipeline(transaction=False)#默认的情况下,管道里执行的命令可以保证执行的原子性,执行pipe=r.pipeline(transaction=False)可以禁用这一特性。#pipe=r.pipeline(transaction=True)pipe=r.pipeline()#创建一个管道pipe.set('name','jack')pipe.set('role','sb')pipe.sadd('faz','baz')pipe.incr('num')#如果num不存在则vaule为1,如果存在,则value自增1pipe.execute()print(r.get("name"))print(r.get("role"))print(r.get("num"))

运行结果:

jacksb1

管道的命令可以写在一起,如:

importredisimporttimepool=redis.ConnectionPool(host='localhost',port=6379,decode_responses=True)r=redis.Redis(connection_pool=pool)pipe=r.pipeline()#创建一个管道pipe.set('hello','redis').sadd('faz','baz').incr('num').execute()print(r.get("name"))print(r.get("role"))print(r.get("num"))

运行结果:

jacksb1

以上就是关于“python操作redis实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。

发布于 2022-03-29 22:38:55
收藏
分享
海报
0 条评论
22
上一篇:如何用Python玩转Mysql 下一篇:python爬虫案例代码分析
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码