zoukankan      html  css  js  c++  java
  • python之redis的使用及封装

    首先安装 redis 模块

    Python 要使用 redis,需要先安装 redis 模块:

    sudo pip3 install redis
    或
    sudo easy_install redis
    或
    sudo python setup.py install

    redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。

    redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。

    实例:

    import redis   # 导入redis 模块
    
    r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
    r.set('name', 'runoob')  # 设置 name 对应的值
    print(r['name'])
    print(r.get('name'))  # 取出键 name 对应的值
    print(type(r.get('name')))  # 查看类型

    输出结果为:

    runoob
    runoob
    <class 'str'>

    连接池

    redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销。

    默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池。

    实例

    import redis    # 导入redis 模块
    
    pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
    r = redis.Redis(host='localhost', port=6379, decode_responses=True)  
    r.set('name', 'runoob')  # 设置 name 对应的值
    print(r.get('name'))  # 取出键 name 对应的值

     

    redis 基本命令详见:https://www.runoob.com/w3cnote/python-redis-intro.html

    下面为封装好的redis脚本

    import redis
    
    # 不适用于模糊搜索
    class MyRedis():
        def __init__(self, host = "XXX", port = 6379, password = 'XXX'):
            pools = redis.ConnectionPool(host= host, port= port, password= password, decode_responses=True)
            self.__redis = redis.StrictRedis(connection_pool=pools)
    
        # 在 Redis 中设置值,默认,不存在则创建,存在则修改。
        def set(self, key, value):
            return self.__redis.set(key, value)
    
        # 取出键对应的值
        def get(self, key):
            if self.__redis.exists(key):
                return self.__redis.get(key)
            else:
                return None
    
        # 获取有序集合中所有元素
        def zrange(self, key):
            if self.__redis.exists(key):
                return self.__redis.zrange(key,0,-1,desc=False, withscores=True)
            else:
                return None
    
        # 获取值的索引号
        def zrank(self, key):
            if self.__redis.exists(key):
                return self.__redis.zrank(key)
            else:
                return None
    
        # 按照分数范围获取name对应的有序集合的元素
        def zrangebyscore(self, key):
            if self.__redis.exists(key):
                return self.__redis.zrangebyscore(key, 0, -1, withscores=True)
            else:
                return None
    
        # 按照分数范围获取有序集合的元素并排序(默认从大到小排序)
        def zrevrange(self, key):
            if self.__redis.exists(key):
                return self.__redis.zrevrange(key, 0, -1)
            else:
                return None
    
        # 删除键值对
        def delete(self,key):
            if self.__redis.exists(key):
                 return self.__redis.delete(key)
            else:
                return None
    
        # 获取key对应hash的所有键值
        def hgetall(self, key):
            if self.__redis.exists(key):
                return self.__redis.hgetall(key)
            else:
                return None
    
        # 统计返回的总个数
        def rcount(self, re, key):
            if self.__redis.exists(key):
                sum = 0
                for i in re:
                    print(i)
                    sum += 1
                print("总共有%s个" % (sum))
    
    
    if __name__ =="__main__":
        MyR = MyRedis()
        key = "XXX"
        re = MyR.zrange(key)
        MyR.rcount(re, key)
    View Code

    1、常见报错:

    UserWarning: redis-py works best with hiredis. Please consider installing warnings.warn(msg)

    解决方法:安装 hiredis库

  • 相关阅读:
    题解 CF171G 【Mysterious numbers
    题解 P1157 【组合的输出】
    题解 P3955 【图书管理员】
    题解 P2036 【Perket】
    题解 CF837A 【Text Volume】
    题解 CF791A 【Bear and Big Brother】
    题解 CF747A 【Display Size】
    题解 P1332 【血色先锋队】
    题解 P2660 【zzc 种田】
    题解 P4470 【[BJWC2018]售票】
  • 原文地址:https://www.cnblogs.com/CincentHuang/p/15698259.html
Copyright © 2011-2022 走看看