redis
设置超时
import redis import datetime extime = datetime.datetime(2015,9,8,15,19,10) r.expire('ex1', 10) #设置超时时长 print(extime) r.expireat('ex2', extime)#设置超时时间节点
#判断key是否存在
r.exists(key)
#删除
r.delete(key)
连接
''' 连接 ''' import redis conn=redis.Redis(host='47.98.55.9',port=6379,password='123456') conn.set('foo','bar') print(conn.get('foo'))
连接池
''' 连接池 edis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,
每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。 ''' import redis pool=redis.ConnectionPool(host='127.0.0.1',port='6379',password='123456') r=redis.Redis(connection_pool=pool) r.set('name','rose') print(r.get('name'))
使用生成器迭代读取
#减少内存占用
#使用通配符*读取
list=[] for key in r.scan_iter('key_*', count=10): info = { "title": r.hget(key, 'title'), "img": r.hget(key, 'img'), } list.append(info) print(list)
字符串
''' 字符串 set(name, value, ex=None, px=None, nx=False, xx=False) 在Redis中设置值,默认不存在则创建,存在则修改 参数: ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行 xx,如果设置为True,则只有name存在时,岗前set操作才执行 ''' #设置值,只有name不存在时,执行设置操作(添加) ret=r.setnx('name', 'rose') #key timeout value,设置过期时间,单位秒 ret=r.setex('name',10,'rose') #key timeout value,设置过期时间 单位毫秒 r.psetex('name', '10000','jack') print(r.get('name')) #批量设置值,亮亮取值 keydict = {} keydict['key1'] = 324 keydict['key2'] = 'ag' print(r.mset(keydict)) list = ['key1','key2'] print(r.mget(list)) #取值 r.get('name') #设置新值并获取原来的值 ret=r.getset('name','jack') #取字符串部分内容 r.set('say','hello world') ret=r.getrange('say',0,4) print(ret) #从字符串下标为offset开始替换 r.set('say','hello world') ret=r.setrange('say',6,'langlang') print(r.get('say')) #获取name对应的值的二进制表示中的某位的值 (0或1),从右往左数 r.set('num',5) print(bin(5).replace('b','')) print(r.getbit('num',1)) #返回字节的长度 r.strlen('name') # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。(整型) r.incr('count',2) # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。(浮点型) r.incrbyfloat('f',1.1) # 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自增。(整型) r.decr('num',2) print(r.get('num')) #在字符串后面追加内容 r.append('say','ac')
hash操作
#name对应的hash中设置一个键值对(不存在,则创建;否则,修改) r.hset('userinfo','name','jack') #批量设置 dict={'name':'jack','age':22,'sex':'girl'} r.hmset('userinfo',dict) #读取 ret=r.hget('userinfo','name') #批量读取 dict={'name','age'} ret=r.hmget('userinfo',dict) #读取对应userinfo所有 ret=r.hgetall('userinfo') print(ret) for i,j in ret.items(): print(i.decode('utf-8')+':'+j.decode('utf-8')) # 获取name对应的hash中键值对的个数 ret=r.hlen('userinfo') # 获取name对应的hash中所有的keys ret=r.hkeys('userinfo') # 获取name对应的hash中所有的value的值 ret=r.hvals('userinfo') # 检查name对应的hash是否存在当前传入的key ret=r.hexists('userinfo','name') # 将name对应的hash中指定key的键值对删除 ret=r.hdel('userinfo','name') # 自增name对应的hash中的指定key的值,不存在则创建key=amount ret=r.hincrby('userinfo','age',1) print(r.hget('userinfo','age')) # 自增name对应的hash中的指定key的值,不存在则创建key=amount(浮点型) ret=r.hincrbyfloat('userinfo','hight',1.1) print(r.hget('userinfo','hight')) # # 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆 #数量必须足够多否则测不出(10000可以) #一万条数据查询一百次 cursor=0 i=0 while True: cursor1, data1 = r.hscan('num', cursor=cursor, match=None, count=100) i += 1 print(i) print(data1) if cursor1: cursor=cursor1 else: break #hscan_iter(name, match=None, count=None) #利用yield封装hscan创建生成器,实现分批去redis中获取数据 ret=r.hscan_iter('num',match=None,count=1000) for item in r.hscan_iter('num'): print(item)
借助模糊查询进行读取
import redis conn=redis.Redis(host='47.98.55.9',port=6379,password='123456') payment_1_2={ 'course_id': 2, 'title': 'CRM客户关系管理系统实战开发-专题', } payment_1_1={ 'course_id': 2, 'title': 'CRM客户关系管理系统实战开发-专题', } conn.hmset('payment_1_1',payment_1_2) conn.hmset('payment_1_1',payment_1_1) for key in conn.scan_iter('payment*', count=10): print(key)
list操作
#存入在name对应的list中添加元素,每个新的元素都添加到列表的最左边 r.lpush('list',111,22,33,44,55) #存入在name对应的list中添加元素,每个新的元素都添加到列表的最右边 r.lpush('list',111,22,33,44,55) #在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边 r.lpushx('list',888) #在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边 r.rpushx('list',99) #元素个数 print(r.llen('list')) linsert(name, where, refvalue, value)) # 参数: # name,redis的name # where,BEFORE或AFTER # refvalue,标杆值,即:在它前后插入数据 # value,要插入的数据 #对name对应的list中的某一个索引位置重新赋值 r.lset('list',0,234) #在name对应的list中删除指定的值 #lrem(self, name, count, value) # 参数: # name,redis的name # value,要删除的值 # num, num=0,删除列表中所有的指定值; # num=2,从前到后,删除2个; # num=-2,从后向前,删除2个 r.lrem('list',2,888) #在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素 ret=r.lpop('list') #在name对应的列表的右侧侧获取第一个元素并在列表中移除,返回值则是第一个元素 ret=r.rpop('list') #在name对应的列表中根据索引获取列表元素 ret=r.lindex('list',2) #在name对应的列表中根据索引获取列表元素 # 在name对应的列表分片获取数据 # 参数: # name,redis的name # start,索引的起始位置 # end,索引结束位置 ret=r.lrange('list',0,-1) #在name对应的列表中移除没有在start-end索引之间的值 r.ltrim('list',0,3) #从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边 # 参数: # src,要取数据的列表的name # dst,要添加数据的列表的name r.rpoplpush('list','list2') #将多个列表排列,按照从左到右去pop对应列表的元素 # 参数: # keys,redis的name的集合 # timeout,超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞 # 更多: # r.brpop(keys, timeout),从右向左获取数据 ret=r.blpop('list',2) #自定义增量迭代 def list_iter(name): """ 自定义redis列表增量迭代 :param name: redis中的name,即:迭代name对应的列表 :return: yield 返回 列表元素 """ list_count = r.llen(name) for index in range(list_count): yield r.lindex(name, index) # 使用 for item in list_iter('list'): print(item)
set(集合)
#增加元素(不存在返回1,否则返回0) r.sadd('s',12) #统计元素个数 ret=r.scard('s') #在第一个name对应的集合中且不在其他name对应的集合的元素集合 r.sdiff(keys, *args) sdiffstore(dest, keys, *args) # 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中 # 获取多一个name对应集合的并集 ret=r.sinter('s','s1') # 检查value是否是name对应的集合的成员 ret=r.sismember('s', 12) # 获取name对应的集合的所有成员 ret=r.smembers('s') # 将某个成员从一个集合中移动到另外一个集合 ret=r.smove('s','s1',12) #spop(name) # 从集合的右侧(尾部)移除一个成员,并将其返回 #srandmember(name, numbers) #从name对应的集合中随机获取 numbers 个元素 sscan(name, cursor=0, match=None, count=None) sscan_iter(name, match=None, count=None) # 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大 交集 #交集 r.sinter('s1','s2') #差集 print(r.sdiff('s1','s2')) #获取多个元素的交集 r.sinterstore("set3", "set1", "set2") #并集 r.sunion('s1','s2') #判断元素是否存在 r.sismember("set1", 33) #移动元素 r.smove("set1", "set2", 44) #随机删除元素 r.spop("set2") #删除指定元素 r.srem("set2", 11)
有序集合
增加元素 r.zadd("z1",{"1":2,"3":3}) 统计数量 zcard(name) # 获取name对应的有序集合中分数 在 [min,max] 之间的个数 zcount(name, min, max) # 自增name对应的有序集合的 name 对应的分数 zincrby(name, value, amount) #切片取出 r.zrange('z1',0,-1) #同时取出分值,按分数倒序,从左往右递增 r.zrange('z1',0,-1,withscores=True) #按照正序取值 r.zrangebyscore("z1", 15, 25) #按照分值范围取值,倒序 r.zrevrangebyscore('z1',100,10,withscores=True) #获取所有元素,按分数正序 print(r.zscan('z1')) #迭代取值 for i in r.zscan_iter("z1"): # 遍历迭代器 print(i) #统计指定分数值范围元素的个数 print(r.zcount("z1", 11, 22)) #自增 r.zincrby("z1", 2,'b') # 每次将n2的分数自增2 #获取索引号,逆序 print(r.zrank('z1','b')) #删除元素成功返回1 r.zrem('z1','1') #指定索引删除元素 r.zremrangebyrank("zset3", 0, 1) #获取值对应的分数 r.zscore("z1", "f")
单个取值
#取分值最大的, r.zpopmax('z1') #取出最小的 r.zpopmin('z1')