python redis使用

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)
View Code

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')

  

 

原文地址:https://www.cnblogs.com/huay/p/11406440.html