Python封装Redis通用工具类

1.django项目settings.py文件关于redis的配置

    # Redis缓存库配置
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://192.168.10.2:6379/0",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",
                "CONNECTION_POOL_KWARGS": {"max_connections": 512},
                "IGNORE_EXCEPTIONS": True,
                "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
                "SOCKET_TIMEOUT": 5,  # in seconds
            }
        },
        "authority": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://192.168.10.2:6379/1",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",
                "CONNECTION_POOL_KWARGS": {"max_connections": 512},
                "IGNORE_EXCEPTIONS": True,
                "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
                "SOCKET_TIMEOUT": 5,  # in seconds
            }
        },
        "feedflow": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://192.168.10.2:6379/2",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",
                "CONNECTION_POOL_KWARGS": {"max_connections": 512},
                "IGNORE_EXCEPTIONS": True,
                "SOCKET_CONNECT_TIMEOUT": 5,  # in seconds
                "SOCKET_TIMEOUT": 5,  # in seconds
            }
        },
    }

2.封装redis工具类

"""
全局管理缓存的调用,封装django自带的cache
主要用于小数据量的调用
"""
import json
import re
import redis
from contextlib import contextmanager
from functools import reduce
from django.core import signals
from django.core.cache import _create_cache
from django_redis import get_redis_connection


def query_cache(dbname):
    """
    redis 扩展redis 原生 功能用此连接方式
    """
    conn_redis = get_redis_connection(dbname)
    return conn_redis


def get_cache(backend, **kwargs):
    """django-redis 自带方法请用这个"""
    cache = _create_cache(backend, **kwargs)
    signals.request_finished.connect(cache.close)
    return cache


class CacheAdpter():
    @classmethod
    def hset(cls, cache_name, mainkey, subkey, values, second=None):
        """
        单个添加 redis hash 值
        :param cache_name: db
        :param mainkey: 主key
        :param subkey: 子key
        :param second: 不建议设置过期时间,此过期时间针对mainkey设置,对subkey无效
        :return
        CacheAdpter.hmset('authority', CacheKey.AUTHY_CUSTOMER_ROLE, 20, key_1='values_11', key_2='values_662')
        """
        use_cache = query_cache(cache_name)
        use_cache.hset(mainkey, subkey, values)
        if second:
            use_cache.expire(mainkey, second)

    @classmethod
    def hmset(cls, cache_name, mainkey, second=None, **kwargs):
        """
        批量添加 redis hash 值
        :param cache_name: db
        :param mainkey: 主key
        :param **kwargs: 批量subkey
        :param second: 不建议设置过期时间,此过期时间针对mainkey设置,对subkey无效
        :return
        CacheAdpter.hmset('authority', CacheKey.AUTHY_CUSTOMER_ROLE, 20, key_1='values_11', key_2='values_662')
        """
        use_cache = query_cache(cache_name)
        use_cache.hmset(mainkey, kwargs)
        if second:
            use_cache.expire(mainkey, second)

    @classmethod
    def hdel(cls, cache_name, mainkey, key):
        """
        删除 redis hash 数据
        :param cache_name: db
        :param mainkey: 主key
        :param subkey: 子key
        :return:
        """
        use_cache = query_cache(cache_name)
        use_cache.hdel(mainkey, key)

    @classmethod
    def hget(cls, cache_name, mainkey, subkey, type=False):
        """
        获取 redis hash 数据 扩展redis hash hget 调用
        :param cache_name: db
        :param mainkey: 主key
        :param subkey: 子key
        :return:
        """
        use_cache = query_cache(cache_name)
        result = use_cache.hget(mainkey, subkey)
        # bytes 转 str
        if type:
            return None if result is None else str(result, encoding='utf-8')
        else:
            result = json.loads(result) if result else None
            return result

    @classmethod
    def hkeys(cls, cache_name, mainkey, default=None):
        """
        获取主key中所有子key的列表
        :param cache_name: 缓存库
        :param mainkey: 主key
        :return: 返回列表
        """
        default = default if default else []
        use_cache = query_cache(cache_name)
        keys_list = use_cache.hkeys(mainkey)
        if not keys_list:
            return default
        return keys_list

    @classmethod
    def get_time_out(cls, cache, timeout):
        """
        设置db 过期时间
        :param cache: db
        :param timeout: 过期时间
        :return:
        """
        if not timeout:
            timeout = cache.default_timeout
        return timeout

    @classmethod
    def get(cls, cache_name, key, default=None):
        """
        获取 redis 数据
        :param cache_name: db
        :param key: 主key
        :return:
        """
        use_cache = get_cache(cache_name)
        value = use_cache.get(key)
        if value is None:
            return default
        return value

    @classmethod
    def set(cls, cache_name, key, value, timeout=0):
        """
        存储 redis 数据
        :param cache_name :db
        :param key: key
        :param value: values
        :param timeout:设置过期时间 单位秒
        :return:
        """
        use_cache = get_cache(cache_name)
        use_cache.set(key, value, cls.get_time_out(use_cache, timeout))

    @classmethod
    def get_many(cls, cache_name, keys, default=None):
        """
        批量获取 redis 数据
        :param cache_name :db
        :param keys: key list []
        :return:
        """
        default = default if default else {}
        use_cache = get_cache(cache_name)
        value_dict = use_cache.get_many(keys)
        if value_dict is None:
            return default
        return value_dict

    @classmethod
    def set_many(cls, cache_name, keys, timeout=0):
        """
        批量设置 redis 过期数据
        :param cache_name :db
        :param keys: key list []
        :param timeout 60*24
        :return:
        """
        use_cache = get_cache(cache_name)
        use_cache.set_many(keys, cls.get_time_out(use_cache, timeout))

    @classmethod
    def delete(cls, cache_name, key):
        """
        删除  redis set 数据
        :param cache_name :db
        :param key: key
        :return:
        """
        use_cache = get_cache(cache_name)
        use_cache.delete(key)

    @classmethod
    def delete_many(cls, cache_name, keys):
        use_cache = get_cache(cache_name)
        for key in keys:
            use_cache.delete(key)

    @classmethod
    def get_large_list(cls, cache_name, key):
        use_cache = get_cache(cache_name)

        value_list = []
        grp_num = use_cache.get(key)
        if grp_num is None:
            return value_list

        keys = [key + '_' + str(i) for i in range(grp_num)]
        value_dict = use_cache.get_many(keys)
        if not value_dict:
            return value_list
        else:
            return reduce(list.__add__, value_dict.values())

    @classmethod
    def sadd(cls, cache_name, key, values):
        """
        添加元素到redis集合中,添加多个元素需要封装为可迭代类型
        :param key: 键
        :param values: 值
        :param cache_name: 缓存库
        :return:
        """
        use_cache = query_cache(cache_name)
        if isinstance(values, str or int):
            return use_cache.sadd(key, values)
        return use_cache.sadd(key, *values)

    @classmethod
    def smembers(cls, cache_name, key):
        """
        获取缓存中集合的所有元素
        :param key: 键
        :param cache_name: 缓存库
        :return: 以列表返回所有结果
        """
        use_cache = query_cache(cache_name)
        value = use_cache.smembers(key)
        if value:
            return sorted([i.decode() for i in value])
        return None

    @classmethod
    def delete_set_key(cls, cache_name, key):
        """
        由于django自带的redis无法删除set(集合)中的键,所以调用此方法
        :param key: 键
        :param cache_name: 缓存库
        :return:
        """
        use_cache = query_cache(cache_name)
        return use_cache.delete(key)

    @classmethod
    def incr(cls, cache_name, key, count, timeout=0):
        use_cache = query_cache(cache_name)
        use_cache.incr(key, count)
        if timeout:
            use_cache.expire(key, timeout)

    @classmethod
    def get_8origin(cls, cache_name, key, default=None):
        """
        获取 redis 数据, 通过get_redis_connection原生连接获取数据
        :param cache_name: db
        :param key: 主key
        :return:
        """
        use_cache = query_cache(cache_name)
        value = use_cache.get(key)
        result = json.loads(value) if value else default
        return result

    @classmethod
    def add(cls, cache_name, key, value, timeout=None):
        """
        当缓存中键不存在时向缓存中写入键值,可以设置有效期
        :param key: 键
        :param value: 值
        :param cache_name: 缓存库
        :param timeout: 有效期时间
        :return:
        """
        use_cache = get_cache(cache_name)
        if isinstance(timeout, int):
            return use_cache.add(key, value, timeout)
        else:
            return use_cache.add(key, value, timeout=cls.get_time_out(use_cache, None))
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Redis工具类封装Redis数据库操作的一组函数或方法,方便开发人员在Python中使用Redis进行数据存储、读取和修改等操作。它可以简化与Redis的交互流程,提高开发效率。 Python Redis工具类通常包含以下功能: 1. 连接Redis数据库:提供连接Redis数据库的方法,包括指定主机名、端口号和认证信息。 2. 数据保存和读取:提供将数据保存到Redis数据库和从数据库中读取数据的方法,支持多种数据类型(如字符串、哈希、列表、集合、有序集合等)。 3. 数据修改和删除:提供更新和删除数据的方法,可以更新单个键值对或批量操作。 4. 事务和管道支持:提供事务和管道操作的方法,可以提高多个Redis命令的执行效率。 5. 分布式锁支持:提供实现分布式锁的方法,用于并发控制和资源竞争场景。 6. 发布订阅功能:提供发布订阅功能的方法,支持在多个客户端之间发布和接收消息。 7. 集群支持:提供连接Redis集群的方法,支持在多个Redis节点之间进行数据分布和负载均衡。 通过使用Python Redis工具类,开发人员可以更方便地操作Redis数据库,无需手动处理与Redis的连接、事务管理和数据格式转换等细节。同时,Python Redis工具类还提供了一些高级功能,如分布式锁和发布订阅等,可以满足不同的业务需求。 总之,Python Redis工具类是一种简化Redis操作的工具,可以提高开发效率和代码可读性,使开发人员能够更好地利用Redis进行数据存储和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值