Python 连接 redis 模块
redis 模块使用可以分类为:
- 连接方式
- 连接池
- 操作
- String操作
- Hash操作
- List操作
- Set操作
- Sort Set操作
- 管道
- 发布订阅
(1)操作模式
redis提供两个类Redis和StrictRedis用于实现大部分官方的命令,Redis是StrictRedis的子类,用于向后兼用旧版本。
#!/usr/bin/env python3#coding:utf8import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('name', 'test')print(r.get('name')) |
(2)连接池
redis使用connection pool来管理对一个redis server 的所有连接,避免每次建立,释放连接的开销,默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
import redispool = redis.ConnectionPool(host='0.0.0.0', port=6379)r = redis.Redis(connection_pool=pool)r.set('age', '16')print(r.get('age')) |
(3)数据操作
String 操作
redis中的String在在内存中按照一个name对应一个value来存储的。
- set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改参数:ex,过期时间(秒)px,过期时间(毫秒)nx,如果设置为True,则只有name不存在时,当前set操作才执行xx,如果设置为True,则只有name存在时,岗前set操作才执行import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('age','22')print(r.get('age'))结果:22 |
- setnx(name,value)
设置值,只有name不存在时,执行设置操作(添加)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.setnx('name', 'tom')print (r.get('name')) |
- setex(name,value,time)
# 设置值# 参数:# time,过期时间(数字秒 或 timedelta对象)#!/usr/bin/env python3#coding:utf8import redisr = redis.Redis(host='0.0.0.0', port=6379)r.setex('name', 'tom','1')print (r.get('name'))结果:b'yaoyao'当超过一秒print (r.get('name'))结果:None |
- psetex(name,time_ms,value)
# 设置值# 参数:# time_ms,过期时间(数字毫秒 或 timedelta对象)import redisimport timer = redis.Redis(host='0.0.0.0', port=6379)r.psetex('name','1','test')print (r.get('name'))time.sleep(0.1)print(r.get('name'))结果:b'test'None |
- mset(*args, **kwargs)
#批量设置值 #如:#mset(k1='v1', k2='v2')import redisr = redis.Redis(host='0.0.0.0', port=6379)r.mset(name='tom',age='18')print(r.get('name'))print(r.get('age')) |
- get(name)
#获取值import redisr = redis.Redis(host='0.0.0.0', port=6379)r.mset(name='tom',age='18')print(r.get('name'))print(r.get('age')) |
- getrange(key, start, end)
# 获取子序列(根据字节获取,非字符)# 参数:# name,Redis 的 name# start,起始位置(字节)# end,结束位置(字节)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('name','tomhhaha')res=r.getrange('name',0,3)print(res)结果:b'tomh' |
- settrange(name,offset,value)
# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)# 参数:# offset,字符串的索引,字节(一个汉字三个字节)# value,要设置的值import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('name','tomname')r.setrange('name',0,'python')print(r.get('name'))结果:b'pythone' |
- setbit(name,offset,value)
# 对name对应值的二进制表示的位进行操作# 参数:# name,redis的name# offset,位的索引(将值变换成二进制后再进行索引)# value,值只能是 1 或 0# 注:如果在Redis中有一个对应: n1 = "foo",#那么字符串foo的二进制表示为:01100110 01101111 01101111#所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1,#那么最终二进制则变成 01100111 01101111 01101111,即:"goo"# 扩展,转换二进制表示:# source = "武沛齐"import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('name','python')print(r.get('name'))r.setbit('name','7','1')print(r.get('name'))结果:b'python'b'mython' |
- getbit(name,offset)
# 获取name对应的值的二进制表示中的某位的值 (0或1)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('name','python')print(r.getbit('name','2'))结果:1 |
- bitcount(key,start=None,end=None)
# 获取name对应的值的二进制表示中 1 的个数# 参数:# key,Redis的name# start,位起始位置# end,位结束位置import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('name','python')rint(r.bitcount('name','0','5'))结果:27 |
- bitop(operation,dest,*keys)
# 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值# 参数:# operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)# dest, 新的Redis的name# *keys,要查找的Redis的name# 如:bitop("AND", 'new_name', 'n1', 'n2', 'n3')# 获取Redis中n1,n2,n3对应的值,然后讲所有的值做位运算(求并集),然后将结果保存 new_name 对应的值中import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('n1','11')r.set('n2','21')r.set('n3','11')r.bitop('AND','newname','n1','n2','n3')print(r.get('newname'))结果:b'01' |
- strlen(name)
# 返回name对应值的字节长度(一个汉字3个字节)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('name','python')print(r.strlen('name'))结果:6 |
- incr(self, name, amount = 1)
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。# 参数:# name,Redis的name# amount,自增数(必须是整数)# 注:同incrbyimport redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('age','1') print(r.incr('age','2'))结果:3如果没有print(r.incr('ageno','2'))结果2 |
- incrbyfloat(self,name,amount=1.0)
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。# 参数:# name,Redis的name# amount,自增数(浮点型)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('byfloat','1')print(r.incrbyfloat('byfloat','2.0'))结果:3.0 |
- decr(self, name, amount=1)
# 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。# 参数:# name,Redis的name# amount,自减数(整数)import redisr = redis.Redis(host='0.0.0.0', port=6379) r.set('age','11')print(r.decr('age','2')) |
- append(key,value)
# 在redis name对应的值后面追加内容# 参数:key, redis的namevalue, 要追加的字符串import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('age','a')print(r.get('age'))print(r.append('age','b'))#结果:b'a'2 |
Hash 操作
- hset(name,key,value)
# name对应的hash中设置一个键值对(不存在,则创建;否则,修改)# 参数:# name,redis的name# key,name对应的hash中的key# value,name对应的hash中的value# 注:# hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建(相当于添加)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hset('noset','python','11')print(r.hget('noset','python'))b'11' |
- hmset(name,mapping)
# 在name对应的hash中批量设置键值对# 参数:# name,redis的name# mapping,字典,如:{'k1':'v1', 'k2': 'v2'}# 如:# r.hmset('xx', {'k1':'v1', 'k2': 'v2'})import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'v1','k2':'v2'})print(r.hmget('someset','k1','k2'))结果:[b'v1', b'v2'] |
- hget(name,key)
# 在name对应的hash中获取根据key获取valueimport redisr = redis.Redis(host='0.0.0.0', port=6379)r.hset('noset','python','11')print(r.hget('noset','python'))b'11' |
- hmget(name,keys,*args)
# 在name对应的hash中获取多个key的值# 参数:# name,reids对应的name# keys,要获取key集合,如:['k1', 'k2', 'k3']# *args,要获取的key,如:k1,k2,k3# 如:# r.mget('xx', ['k1', 'k2'])# 或# print r.hmget('xx', 'k1', 'k2')import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hset('noset','python','11')print(r.hget('noset','python'))b'11' |
- hgetall(name)
#获取name对应hash的所有键值import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'v1','k2':'v2'})print(r.hgetall('someset'))结果:{b'k2': b'v2', b'k1': b'v1'} |
- hlen(name)
# 获取name对应的hash中键值对的个数import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'v1','k2':'v2'})print(r.hlen('someset'))结果:2 |
- hkeys(name)
# 获取name对应的hash中所有的key的值import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'v1','k2':'v2'})print(r.hkeys('someset'))结果:[b'k2', b'k1'] |
- hvals(name)
# 获取name对应的hash中所有的value的值import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'v1','k2':'v2'})print(r.hvals('someset'))结果:[b'v2', b'v1'] |
- hexists(name,key)
# 检查name对应的hash是否存在当前传入的keyimport redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'v1','k2':'v2'}) print(r.hexists('someset','k1'))结果:True |
- hdel(name,*key)
# 将name对应的hash中指定key的键值对删除import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'v1','k2':'v2'})print(r.hdel('someset','k1'))print(r.hget('someset','k1'))结果:1None |
- hincrby(name,key,amount=1)
# 自增name对应的hash中的指定key的值,不存在则创建key=amount# 参数:# name,redis中的name# key, hash对应的key#amount,自增数(整数)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'1','k2':'v2'})r.hincrby('someset','k1','2')print(r.hget('someset','k1'))结果:b'3' |
- hincrbyfloat(name,key,amount=1.0)
# 自增name对应的hash中的指定key的值,不存在则创建key=amount# 参数:# name,redis中的name# key, hash对应的key# amount,自增数(浮点数)# 自增name对应的hash中的指定key的值,不存在则创建key=amountimport redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'1.0','k2':'v2'})print(r.hincrbyfloat('someset','k1','2.0'))结果:3.0 |
- hscan(name,cursor=0,match=None,count=None)
# 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据, #并非一次 性将数据全部获取完,从而放置内存被撑爆# 参数:# name,redis的name# cursor,游标(基于游标分批取获取数据)# match,匹配指定key,默认None 表示所有的key# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数# 如:# 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)# 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)# ...# 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕import redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'1.0','k2':'v2'})print(r.hscan('someset',cursor=2, match=0, count=5)) |
- hscan_iter(name,match=None,count=None)
# 利用yield封装hscan创建生成器,实现分批去redis中获取数据# 参数:# match,匹配指定key,默认None 表示所有的key# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数# 如:# for item in r.hscan_iter('xx'):# print itemimport redisr = redis.Redis(host='0.0.0.0', port=6379)r.hmset('someset',{'k1':'1.0','k2':'v2'})for i in r.hscan_iter('someset',match=None, count=None): print(i)结果:(b'k2', b'v2')(b'k1', b'1.0') |
List操作
- lpush(name,values)
# 在name对应的list中添加元素,每个新的元素都添加到列表的最左边# 如:# r.lpush('oo', 11,22,33)# 保存顺序为: 33,22,11# 扩展:# rpush(name, values) 表示从右向左操作import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')print(r.lrange('num','0','2'))结果:[b'55', b'44', b'33'] |
- lpushx(name,value)
# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边# 更多:# rpushx(name, value) 表示从右向左操作import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpushx('num','33') print(r.lindex('num','0'))结果:b'33' |
- llen(name)
# name对应的list元素的个数import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')print(r.llen('num'))结果:10 |
- linsert(name,where,refvalue,value)
# 在name对应的列表的某一个值前或后插入一个新值# 参数:# name,redis的name# where,BEFORE或AFTER# refvalue,标杆值,即:在它前后插入数据# value,要插入的数据import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')r.linsert('num','AFTER','55','66')print(r.lrange('num','0','3')) 结果:[b'55', b'66', b'44', b'33'] |
- r.lset(name,index,value)
# 对name对应的list中的某一个索引位置重新赋值# 参数:# name,redis的name# index,list的索引位置# value,要设置的值import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')r.lset('num','0','1')print(r.lrange('num','0','3'))结果:[b'1', b'44', b'33', b'55'] |
- r.lrem(name,value,num)
在name对应的list中删除指定的值# 参数:# name,redis的name# value,要删除的值# num, num=0,删除列表中所有的指定值;# num=2,从前到后,删除2个;# num=-2,从后向前,删除2个;import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')r.lrem('num','33',num=1)print(r.lrange('num','0','2'))结果:[b'55', b'44', b'55'] |
- lpop(name)
# 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素# 更多:# rpop(name) 表示从右向左操作import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')print(r.lpop('num'))b'55' |
- lindex(name,index)
#在name对应的列表中根据索引获取列表元素import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpushx('num','33') print(r.lindex('num','0'))结果:b'33' |
- ltrim(name,start,end)
#在name对应的列表中移除没有在start-end索引之间的值# 参数:# name,redis的name# start,索引的起始位置# end,索引结束位置import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')r.ltrim('num','0',1)print(r.lrange('num','0','2')) |
- lrange(name,start,end)
# 在name对应的列表分片获取数据# 参数:# name,redis的name# start,索引的起始位置# end,索引结束位置import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num','33','44','55')print(r.lrange('num','0','2'))结果:[b'55', b'44', b'33'] |
- rpoplpush(src,dst)
# 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边# 参数:# src,要取数据的列表的name# dst,要添加数据的列表的nameimport redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num1','11','22','33')r.lpush('num2','44','55','66')r.rpoplpush('num1','num2')print(r.lrange('num1','0','2'))print(r.lrange('num2','0','3'))结果:[b'33', b'22', b'11'][b'33', b'66', b'55', b'44'] |
- blpop(keys,timeout)
# 将多个列表排列,按照从左到右去pop对应列表的元素# 参数:# keys,redis的name的集合# timeout,超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞# 更多:# r.brpop(keys, timeout),从右向左获取数据import redisr = redis.Redis(host='0.0.0.0', port=6379)r.lpush('num1','11','22','33')print(r.blpop('num1',timeout=3))结果:(b'num1', b'33') |
- brpoplpush(src,dst,timeout=0)
# 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧 # 参数: # src,取出并要移除元素的列表对应的name # dst,要插入元素的列表对应的name # timeout,当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞 自定义增量迭代 # 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要: # 1、获取name对应的所有列表 # 2、循环列表 # 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆, 所有有必要自定义一个增量迭代的功能: def list_iter(name): """ 自定义redis列表增量迭代 :param name: redis中的name,即:迭代name对应的列表 :return: yield 返回 列表元素 """ list_count = r.llen(name) for index in xrange(list_count): yield r.lindex(name, index) #使用 for item in list_iter('pp'): print (item) |
Set操作
set集合不允许重复的列表
- sadd(name,values)
# name对应的集合中添加元素import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex','11')print(r.smembers('sex'))结果:{b'11'} |
- scard(name)
#获取name对应的集合中元素个数import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex','11')print(r.scard('sex'))结果:1 |
- sdiff(keys,*args)
#在第一个name对应的集合中且不在其他name对应的集合的元素集合import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','22','33')r.sadd('sex2','22','33','55')print(r.sdiff('sex1','sex2'))结果:{b'11'} |
- sdiffstore(dest,keys,*args)
# 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')r.sadd('sex2','22','33','55')r.sadd('sex3','66','77','88')r.sdiffstore('sex4','sex1','sex2','sex3')print(r.smembers('sex4'))结果:{b'44', b'11'} |
- sinter(keys,*args)
# 获取多一个name对应集合的并集import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')r.sadd('sex2','22','33','55')r.sadd('sex3','66','77','88')r.sinter('sex1','sex2',)print(r.smembers('sex1'))结果:{b'44', b'11', b'22', b'33'} |
- sinterstore(dest,keys.*args)
# 获取多一个name对应集合的并集,再讲其加入到dest对应的集合中 import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')r.sadd('sex2','22','33','55')r.sinterstore('sex4','sex1','sex2')print(r.smembers('sex4')) |
- sismember(name,value)
# 检查value是否是name对应的集合的成员import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')print(r.sismember('sex1','11'))结果:True |
- smembers(name)
# 获取name对应的集合的所有成员import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')print(r.smembers('sex1'))结果:{b'11', b'44', b'33', b'22'} |
- smove(src,dst,value)
# 将某个成员从一个集合中移动到另外一个集合import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')r.sadd('sex2','22','55','66')r.smove('sex1','sex2','11')print(r.smembers('sex2')) |
- spop(name)
# 从集合的右侧(尾部)移除一个成员,并将其返回import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')print(r.smembers('sex1'))print(r.spop('sex1')) |
- srandmember(name,numbers)
# 从name对应的集合中随机获取 numbers 个元素import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')print(r.srandmember('sex1','2'))结果:[b'44', b'11'] |
- srem(name,values)
# 在name对应的集合中删除某些值import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')r.srem('sex1','11')print(r.smembers('sex1'))结果:{b'44', b'33'} |
- sunion(keys,*args)
# 获取多一个name对应的集合的并集import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')r.srem('sex2','11','55','66')print(r.sunion('sex1','sex2'))结果:{b'11', b'22', b'44', b'33'} |
- sunionstore(dest,keys,*args)
# 获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中import redisr = redis.Redis(host='0.0.0.0', port=6379)r.sadd('sex1','11','44','33')r.srem('sex2','11','55','66')r.sunionstore('sex3','sex1','sex2')print(r.smembers('sex3'))结果:{b'22', b'11', b'33', b'44'} |
- sscan(name,cursor=0,match=None,count=None)
|
1
|
# 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大 |
- sscan_iter(name,match=None,count=None)
|
1
|
# 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大 |
有序集合操作
在集合的基础上,为每个元素排序,元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。
- zadd(name,*args,**kwargs)
# 在name对应的有序集合中添加元素# 如: # zadd('zz', 'n1', 1, 'n2', 2)# 或# zadd('zz', n1=11, n2=22)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.zadd('znum', n1=11, n2=22,n3=33) |
- zcard(name)
# 获取name对应的有序集合元素的数量import redisr = redis.Redis(host='0.0.0.0', port=6379)r.zadd('znum', n1=11, n2=22,n3=33)print(r.zcard('znum')) |
- zcount(name,min,max)
# 获取name对应的有序集合中分数 在 [min,max] 之间的个数import redisr = redis.Redis(host='0.0.0.0', port=6379)r.zadd('znum', n1=11, n2=22,n3=33)print(r.zcount('znum','11','22'))结果:2 |
- zincrby(name,value,amount)
# 自增name对应的有序集合的 name 对应的分数import redisr = redis.Redis(host='0.0.0.0', port=6379)r.zadd('znum', n1=11, n2=22,n3=33)print(r.zincrby('znum','22','1'))结果:1.0 |
- r.zrange(name, start, end, desc=False, withscores=Flase, score_cast_func=float)
# 按照索引范围获取name对应的有序集合的元素# 参数:# name,redis的name# start,有序集合索引起始位置(非分数)# end,有序集合索引结束位置(非分数)# desc,排序规则,默认按照分数从小到大排序# withscores,是否获取元素的分数,默认只获取元素的值# score_cast_func,对分数进行数据转换的函数# 更多:# 从大到小排序# zrevrange(name, start, end, withscores=False, score_cast_func=float)# 按照分数范围获取name对应的有序集合的元素# zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)# 从大到小排序# zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)import redisr = redis.Redis(host='0.0.0.0', port=6379)r.zadd('znum', n1=22, n2=33,n3=11)print(r.zrevrange('znum','0', '2', withscores=False, score_cast_func=float))结果:[b'n2', b'n1', b'n3'] |
- zrank(name, value)
# 获取某个值在 name对应的有序集合中的排行(从 0 开始)import redis r = redis.Redis(host='localhost', port=6379)r.zadd('znum', n1=22, n2=33,n3=11)print(r.zrank('znum','22'))结果:0# 更多:#zrevrank(name, value),从大到小排序import redisr = redis.Redis(host='0.0.0.0', port=6379)r.zadd('znum', n1=22, n2=33,n3=11)print(r.zrevrank('znum','22')) 结果: |
- zrangebylex(name, min, max, start=None, num=None)
# 当有序集合的所有成员都具有相同的分值时,有序集合的元素会根据成员的 值#(lexicographical ordering)来进行排序,而这个命令则可以返回给定的有序集合键# key 中, 元素的值介于 min 和 max 之间的成员# 对集合中的每个成员进行逐个字节的对比(byte-by-byte compare), 并按照从低到高的顺序, 返回排序后的集合成员。 如果两个字符串有一部分内容是相同的话, 那么命令会认为较长的字符串比较短的字符串要大# 参数:# name,redis的name# min,左区间(值)。 + 表示正无限; - 表示负无限; ( 表示开区间; [ 则表示闭区间# min,右区间(值)# start,对结果进行分片处理,索引位置# num,对结果进行分片处理,索引后面的num个元素# 如:# ZADD myzset 0 aa 0 ba 0 ca 0 da 0 ea 0 fa 0 ga# r.zrangebylex('myzset', "-", "[ca") 结果为:['aa', 'ba', 'ca']# 更多:# 从大到小排序# zrevrangebylex(name, max, min, start=None, num=None) |
- zrem(name, values)
|
1
2
|
# 删除name对应的有序集合中值是values的成员# 如:zrem('zz', ['s1', 's2']) |
- zremrangebyrank(name, min, max)
|
1
|
# 根据排行范围删除 |
- zremrangebyscore(name, min, max)
|
1
|
# 根据分数范围删除 |
- zremrangebylex(name, min, max)
|
1
|
# 根据值返回删除 |
- zscore(name, values)
|
1
|
# 获取name对应有序集合中 value 对应的分数 |
- zinterstore(dest, keys, aggregate=None)
|
1
2
|
# 获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作# aggregate的值为: SUM MIN MAX |
- zunionstore(dest, keys, aggregate=None)
|
1
2
|
# 获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作# aggregate的值为: SUM MIN MAX |
- zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
|
1
|
# 同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作 |
- zscan_iter(name, match=None, count=None,score_cast_func=float)
|
1
|
# 同字符串相似,相较于字符串新增score_cast_func,用来对分数进行操作 |
其他常用操作
- delete(*name)
# 根据删除redis中的任意数据类型import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('num','11')print(r.get('num'))r.delete('num')print(r.get('num'))结果:b'11'None |
- exists(name)
# 检测redis的name是否存在import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('num','11')print(r.get('num'))print(r.exists('num'))r.delete('num')print(r.get('num'))print(r.exists('num'))b'11'TrueNoneFalse |
- keys(pattern='*')
# 根据模型获取redis的name# 更多:# KEYS * 匹配数据库中所有 key 。# KEYS h?llo 匹配 hello , hallo 和 hxllo 等。# KEYS h*llo 匹配 hllo 和 heeeeello 等。# KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hilloimport redisr = redis.Redis(host='0.0.0.0', port=6379)print(r.keys(pattern='*'))结果:[b'foo', b'num2', b'sex1', b'someset', b'noset', b'sex2', b'num',b'role', b'name', b'num1', b'n3', b'newname', b'byfloat', b'n2',b'ageno', b'name1', b'sex4', b'sex3', b'age', b'sex'] |
- expire(name,time)
|
1
|
# 为某个redis的某个name设置超时时间 |
- rename(src, dst)
# 对redis的name重命名为import redisr = redis.Redis(host='0.0.0.0', port=6379)r.set('xin','11')print(r.get('xin'))r.rename('xin','xin1')print(r.get('xin1'))结果:b'11'b'11' |
- move(name,db)
|
1
|
# 将redis的某个值移动到指定的db下 |
- randomkey()
# 随机获取一个redis的name(不删除)import redisr = redis.Redis(host='0.0.0.0', port=6379)print(r.randomkey())结果:b'n2' |
- type(name)
# 获取name对应值的类型import redisr = redis.Redis(host='0.0.0.0', port=6379)print(r.type('num'))结果:b'string' |
- scan(cursor=0,match=None,count=None)
|
1
|
# 同字符串操作,用于增量迭代获取key |
- scan_iter(match=None,count=None)
|
1
|
# 同字符串操作,用于增量迭代获取key |
管道
redis默认在执行每次请求都会创建(连接池申请链接)和断开(归还连接池)一次连接操作,如果想要再一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline是原子性操作。
#!/usr/bin/env python # -*- coding:utf-8 -*- import redis pool = redis.ConnectionPool(host='0.0.0.0', port=6379) r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False) pipe = r.pipeline(transaction=True) r.set('name', 'python') r.set('age', '18') pipe.execute() |
发布与订阅

发布者:服务器
订阅者:Dashboad和数据处理
- demo
#!/usr/bin/env python# -*- coding:utf-8 -*-import redisclass RedisHelper: '''类''' def __init__(self): #链接 self.__conn = redis.Redis(host='0.0.0.0') self.chan_sub = 'fm104.5' #创建频道 self.chan_pub = 'fm104.5' def public(self,info): '''公共的''' self.__conn.publish(self.chan_pub,info) '''将内容发布到频道''' return True def subscribe(self): pub = self.__conn.pubsub() pub.subscribe(self.chan_sub) pub.parse_response() return pub |
- 发布者
#!/usr/bin/env python# -*- coding:utf-8 -*- #导入模块from redis_demo.demo import RedisHelper#实例化obj = RedisHelper()#把内容发布到频道obj.public('python') |
- 订阅者
#!/usr/bin/env python# -*- coding:utf-8 -*-from redis_demo.demo import RedisHelperobj = RedisHelper()redis_sub = obj.subscribe()while True: msg= redis_sub.parse_response() print (msg) print(type(msg)) |
Python 连接 redis 模块的更多相关文章
- python连接redis、redis字符串操作、hash操作、列表操作、其他通用操作、管道、django中使用redis
今日内容概要 python连接redis redis字符串操作 redis之hash操作 redis之列表操作 redis其他 通用操作,管道 django中使用redis 内容详细 1.python ...
- python连接redis,redis集群
python连接redis: import redis r = redis.Redis(host='192.168.50.181',port=6002) r.set('user_phone_14900 ...
- python 连接 redis cluster 集群
一. redis集群模式有多种, cluster模式只是其中的一种实现方式, 其原理请自行谷歌或者百度, 这里只举例如何使用Python操作 redis cluster 集群 二. python 连接 ...
- python连接redis哨兵集群
一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...
- python之redis模块
一.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- Python连接Redis连接配置
1. 测试连接: Python 2.7.8 (default, Oct 20 2014, 15:05:19) [GCC 4.9.1] on linux2 Type "help", ...
- Python 连接Redis两中方式
一.通过django里设置settings文件连接redis #1.settings添加 CACHES = { "default": { "BACKEND": ...
- redis基础之python连接redis(五)
前言 前面介绍了在数据库命令行直接操作redis,现在学习使用python的redis包来操作redis,本人安装的是redis==2.10.6: 系列文章 redis安装和配置 redis命令行操作 ...
- python连接redis sentinel集群
安装 python redis 客户端 pip install redis #!/usr/bin/env python # -*- coding:utf-8 -*- #!/usr/bin/env py ...
随机推荐
- TeamViewer一直显示“未就绪,请检查您的连接”什么原因?
一.错误 错误:未就绪,请检查您的连接 二.问题原因 1.网络连接有问题 很多用户在点击启动TeamViewer的时候,在下方看到显示未连接状态.这种情况可能是软件自身问题,重启一下或重新下载安装包安 ...
- python-django rest framework框架
1.API 接口 是什么,干什么用的? API简单的来说就是一个url - http://www.oldboyedu.com/get_user/ - http://www.oldboyedu.com ...
- HDU-2767-tarjan/Kosaraju求scc
http://acm.hdu.edu.cn/showproblem.php?pid=2767 问最少添加几条边使得图为强连通. tarjan跑一下,然后对强连通分量缩点,找下此时出度为零和入度为零的点 ...
- H5 DeviceMotionEvent 事件制作“摇一摇效果”
摇一摇”的效果制作主要依赖于H5的deviceMotionEvent事件 先讲怎么使用,具体的原理在后边补充 第一步:捕捉重力加速度 var acceleration = eventData.acce ...
- 移动端页面利用好viewport,适配各种宽度屏幕
最近研究微贷网的移动端代码,发现他们网站在适配不同宽度屏幕的显示情况时,发现他们并不是利用rem单位,而是利用js动态设置mete的viewport来达到适配的效果. 感觉挺不错的,也不需要计算什么东 ...
- Leetcode 1021. 最佳观光组合
1021. 最佳观光组合 显示英文描述 我的提交返回竞赛 用户通过次数91 用户尝试次数246 通过次数92 提交次数619 题目难度Medium 给定正整数数组 A,A[i] 表示第 i 个观 ...
- 121. Best Time to Buy and Sell Stock 买卖股票的最佳时机
网址:https://leetcode.com/problems/Best-Time-to-Buy-and-Sell-Stock/ 第一想法是滑动窗口法,稍微尝试后发现不可行,至少我不会... 而后想 ...
- [poj 2453] An Easy Problem
An Easy Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8371 Accepted: 5009 D ...
- org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'list' in 'c
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'list' in ' ...
- 使用JdbcTemplate操作数据库(二十九)
使用JdbcTemplate操作数据库 Spring的JdbcTemplate是自动配置的,你可以直接使用@Autowired来注入到你自己的bean中来使用. 举例:我们在创建User表,包含属性n ...