• Python操作redis


    一:安装

    pip install redis

    二:连接使用

    (1)特点:

      (1):redis通过提供redis 以及StrictRedis两个类实现用于redis的操作

      (2):StrictRedis用于实现大部分官方命令,并使用官方的语法和命令

      (3):Redis是StrictRedis的子类,用于向前兼容redis.py

    (2)使用案例:

    import redis  # 导入redis模块
    
    redis_obj = redis.Redis(host='127.0.0.1',port=6379)  # 创建redis连接 默认端口6379
    
    redis_obj.set('name','SR') # 设置值
    
    res = redis_obj.get('name')  # 获取值
    
    print(res)  # b'SR' 二进制类型 

    PS:获取值属于byte类型 如果需要字符串需要进行转码

    (3)连接池:

      (1):connection pool来管理对一个redis server的所有连接  

      (2):避免每次释放 建立连接 消耗资源

      (3):其通过每次预先创建连接 当有redis进行操作的时候 其直接使用以及预连接的redis服务

      (4):操作结束之后 其不会释放redis连接 留作备用

    (4)使用案例

    import redis
    
    
    # 生成一个连接池子
    redis_obj = redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=10)
    
    # 创建连接
    res = redis.StrictRedis(connection_pool=redis_obj,decode_responses=True)  # decode_responses=True 存入的数据是字符串
    res.set('name', 'SR')
    print(res.get('name'))

    三:String操作

    set操作:

    set(name, value, ex=None, px=None, nx=False, xx=False),
      参数ex,过期时间(秒)
      px,过期时间(毫秒)
      nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
      xx,如果设置为True,则只有name存在时,当前set操作才执行
    setnx(name,value),则只有name不存在时,当前set操作才执行
    setex(name, value, time),设置过期时间(秒)
    psetex(name, time_ms, value),设置过期时间(毫秒)
    r.mset(name1='zhangsan', name2='lisi'),批量设置
    setrange(name,offset,value):用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。如果新值太长时,则向后添加
    
    append(key, value):在redis_name对应的值后面追加内容
    setbit(name, offset, value),对二进制表示位进行设置
    r.set("name","zhangsan")
    r.setrange("name",1,"z")
    print(r.get("name")) #输出:zzangsan
    r.setrange("name",6,"zzzzzzz")
    print(r.get("name")) #输出:zzangszzzzzzz

    get操作:

    mget(keys,*args)
    getset(name, new_value),在设置旧值的同时获取新值
    getrange(key, start, end),获取设置值的子序列
    getbit(name, offset), 获取name对应值的二进制中某位的值(0或1)
    strlen(name),获取name对应的字节长度,一个汉字三个字节。
    r.set("name","zhangsan")
    print(r.getrange("name",0,3))#输出:zhan

    四:Hash操作

    set操作

    hset(name, key, value),name对应的hash中设置一个键值对,没有则创建,有则修改

    r.hset('hkey', 'name', 'zhangsan')

    hmset(name, mapping),在name对应的hash中批量设置键值对

      dict = {"a1":"aa", "b1":"bb"}
        r.hmset('dict_name', dict)

    hsetnx(name, key, value),只有当key不存在时,set操作才成立。

       dict = {"a1":"aa", "b1":"bb"}
        r.hsetnx('dict_name', "a1", "bb")
        print r.hget('dict_name', "a1")  # 输出结果:aa
        r.hsetnx('dict_name', "c1", "cc")
        print r.hget('dict_name', "c1")  # 输出结果:cc

    get操作:

    hget(name, key)

    r.hget('userinfo', 'name')

    hmget(name, keys, *args),获取name对应的包含多个hash值的列表。

    li = ["a1", "b1"]
    print r.hmget('dict_name', li)  # 输出结果:['aa', 'bb']
    print r.hmget('dict_name', "a1", "b1")  # 输出结果:['aa', 'bb']

    hgetall(name),获取name对应的hash的左右键值

    print r.hgetall('dict_name')  # 输出结果:{'a1': 'aa', 'b1': 'bb'}
    hlen(name),获取name对应hash中的键的个数
    hkeys(name),获取name对应hash中所有的键
    hvals(name),获取name对应hash中的所有的值

    1. print r.hlen('dict_name') # 输出结果:2
    2. print r.hkeys('dict_name') # 输出结果:['a1', 'b1']
    3. print r.hvals('dict_name') # 输出结果:['aa', 'bb']
     

    hexists(name, key),检查name对应的hash中是否存在传入的key值

    print r.hexists('dict_name', "a1")  # 输出结果:True

    hdel(name, *keys),删除制定的name对应的hash中传入的key对应的键值对

    r.hdel("dic_name","a1")

    五:List操作

    设置操作:

    lpush(name, values),在那么对应的list中添加元素,每个新元素都添加到列表的左侧

     r.lpush('list_name', 2)
     r.lpush('list_name', 3, 4, 5)
     print r.lrange('list_name', 0, -1)  # 输出:['5', '4', '3', '2']
    rpush(name, values),在那么对应的list中添加元素,每个新元素都添加到列表的右侧
    lpushx(name, value),只有name已经存在时,值添加到列表的左侧
    rpushx(name, value),只有name已经存在时,值添加到列表的右侧

    linsert(name, where, refvalue, value),在name对应的列表前或后插入一个新值

    参数:

    name:redis的name

    where: BEFORE(前)或AFTER(后)

    refvalue: 列表内的值

    value: 要插入的数据

        r.linsert('list_name', "BEFORE", 2, "ss")  # 在列表内找到第一个元素2,在它前面插入ss
        print r.lrange('list_name', 0, -1)  # 输出:['5', '4', '3', 'ss', '2']

    获取操作:

    lrange(name, start, end),获取name对应的start和end范围内的list,lrange(name,0,-1)表示获取全部
    
    llen(name),获取name对应的list中元素的个数
    
    lpop(name),移除name所对应的list中左侧所对应的第一个元素,并将其返回
    
    rpop(name),移除name所对应的list中右侧所对应的第一个元素,并将其返回
    
    ltrim(name, start, end),移除列表内没有在所给的索引之间的值
    
    lindex(name, index),根据所给的索引位置获取对应位置的元素

    lrem(name, value, rem),删除name所对应的list中的指定值

    参数

    name: redis的name

    value: 要删除的值

    num: num=0 删除列表中所有的指定值; num=2 从前到后,删除2个;num=-2 从后向前,删除2个

        r.lrem('list_name', "ss", num=0)
        print r.lrange('list_name', 0, -1)  # 输出:['bbb', '4', '3', '2']
    lpop(name),移除name所对应的list中左侧所对应的第一个元素,并将其返回
    
    rpop(name),移除name所对应的list中右侧所对应的第一个元素,并将其返回
    
    ltrim(name, start, end),移除列表内没有在所给的索引之间的值
    
    lindex(name, index),根据所给的索引位置获取对应位置的元素

     六:Set操作

    设置操作:

    sadd(name, values):向制定的set中添加值

        r.sadd("set_name", "aa")
        r.sadd("set_name", "aa", "bb")  # 重复值设置不进去
        print r.smembers("set_name")  # 输出:set(['aa', 'bb'])

    获取操作:

    smembers(name),获取制定的set中的左右值
    
    scard(name),获取name对应的集合中的元素个数
    
    sismember(name, value),检查value是否是name对应的集合内的元素
    
    srem(name, values),删除name对应的集合中的某些值

    集合操作

    diff(keys, *args),在第一个name对应的集合中且不在其他name对应的集合的元素集合

        r.sadd("set_name", "aa", "bb")
        r.sadd("set_name1", "bb", "cc")
        r.sadd("set_name2", "bb", "cc", "dd")
        print r.sdiff("set_name", "set_name1", "set_name2")  # 输出:set(['aa'])

    sdiffstore(dest, keys, *args),相当于把sdiff获取的值加入到dest对应的集合中

    sinter(keys, args),获取多个name对应集合的交集

        r.sadd("set_name", "aa", "bb")
        r.sadd("set_name1", "bb", "cc")
        r.sadd("set_name2", "bb", "cc", "dd")
        print r.sinter("set_name", "set_name1", "set_name2")  # 输出:set(['bb'])

    sinterstore(dest, keys, *args),返回值放到dest集合中 

    sunion(keys, *args),获取多个集合的并集

    r.sadd("set_name", "aa", "bb")
    r.sadd("set_name1", "bb", "cc")
    r.sadd("set_name2", "bb", "cc", "dd")
    print r.sunion("set_name", "set_name1", "set_name2")  # 输出:set(['cc', 'aa', 'dd', 'bb'])

    七:Zset操作

    添加操作:

    zadd(name, *args, **kwargs),向有序集合中添加参数

    r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5)  # 同r.zadd('zset_name', b1=10, b2=5)
    print r.zrange("zset_name", 0, -1, desc=False, withscores=False, score_cast_func=float)  
    # 输出:['a2', 'a3', 'a1']

    zincrby(name, value, amount),自增有序集合内value对应的分数 ,amount为增加量,这个函数只会影响后面的score,但是删除这个函数后原来的score不变。

        r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5)
        r.zincrby("zset_name", "a3", amount=2)  # 让a3的score增加2,影响下面的数据展示
        print r.zrange("zset_name", 0, -1, desc=False, withscores=True, score_cast_func=float)
        # 输出:[('a2', 3.0), ('a1', 6.0), ('a3', 7.0)]
     
     
        r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5)
        # r.zincrby("zset_name", "a3", amount=2)  取消操作后,结果不变
        print r.zrange("zset_name", 0, -1, desc=False, withscores=True, score_cast_func=float)
        # 输出:[('a2', 3.0), ('a3', 5.0), ('a1', 6.0)]

    获取操作:

    zrange( name, start, end, desc=False, withscores=False, score_cast_func=float),按索引范围获取集合
    参数
      name redis的name
      start 有序集合索引起始位置
      end 有序集合索引结束位置
      desc 排序规则,默认按照分数从小到大排序
      withscores 是否获取元素的分数,默认只获取元素的值
      score_cast_func 对分数进行数据转换的函数
    zrem(name, values),删除值是values的成员

    r.zrem("zset_name", "mongodb", "rabitmq", "redis")
    zremrangebyrank(name, min, max),根据排行范围进行删除
    zremrangebyscore(name, min, max),根据分数范围进行删除
    zcard(name),获取元素的数量
    zcount(name, min, max),获取有序集合中score在[min,max]之间的元素的个数
    zscore(name, value),获取对应value的score

    排序操作:

    zrevrange(name, start, end, withscores=False, score_cast_func=float),从大到小排序

        r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5)
        print r.zrank("zset_name", "a1")  # 从小到大,输出2
        print r.zrevrank("zset_name", "a1")  # 从大到小,输出0

    zrank(name, value)、zrevrank(name, value),获取value在有序集合中的排序位置,从0开始

        r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5)
        print r.zrank("zset_name", "a1")  # 从小到大,输出2
        print r.zrevrank("zset_name", "a1")  # 从大到小,输出0

    集合操作:

    zinterstore(dest, keys, aggregate=None),获取两个有序集合的交集并放入dest集合,如果遇到相同值不同分数,则按照aggregate进行操作,aggregate的值为: SUM MIN MAX 。

        r.zadd("zset_name", "a1", 6, "a2", 3, "a3", 5)
        r.zadd("zset_name1", a1=2, b1=5, b2=7)
        r.zinterstore("zset_name2", ("zset_name", "zset_name1"), aggregate="MAX")
        print r.zscan("zset_name2")  #输出:(0L, [('a1', 6.0)])

    zunionstore(dest, keys, aggregate=None),并集,其他同交集。

    九:其他操作

    delete(*names),根据name删除任意redis数据类型
    
    exists(name),检测name是否存在,返回True或False
    
    keys(pattern='*'),根据* ?等通配符匹配获取redis的name
        print r.keys(pattern='*set*')
        # 输出:['set_name', 'zset_name', 'zset_name1', 'set_name2', 'zset_name2', 'set_name1']
    expire(name, time),设置超时时间
    
    rename(src, dst),重命名
    
    move(name, db),将redis的某个值移动到指定的db下
    
    randomkey(),随机获取一个redis的name(不删除)
    
    type(name),指定name的redis数据类型
  • 相关阅读:
    泛型
    内部类 及 匿名内部类
    BigDecimal
    JodaTime简介
    Java中IO流
    Spring的ApplicationEvent的使用
    swagger文档使用(springboot项目)
    http连接过程遇到的各种性能瓶颈
    http网络连接过程
    python中的TypeError: 'NavigableString' object is not callable错误
  • 原文地址:https://www.cnblogs.com/SR-Program/p/12422578.html
Copyright © 2020-2023  润新知