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

      

     

  • 相关阅读:
    网络适配器、网卡和网卡驱动
    PostgreSQL
    vsftp安装
    Ubuntu里面软件的安装与卸载
    ubuntu下查找某个文件的路径
    TCP的几个状态
    C++产生随机数
    ERROR Cannot determine the location of the VS Common Tools Folder
    小波变换C++实现(一)----单层小波变换
    离散卷积的计算
  • 原文地址:https://www.cnblogs.com/huay/p/11406440.html
Copyright © 2020-2023  润新知