当前位置: 首页 > news >正文

用工厂函数简化redis配置

工厂函数(Factory Function)不同于构造函数,工厂函数就是一个普通函数,通常用于创建对象或实例。它的核心思想是通过一个函数来封装对象的创建逻辑,而不是直接使用类的构造函数。工厂函数可以根据输入参数动态地决定创建哪种类型的对象,从而提供更高的灵活性和可扩展性。

工厂函数的特点

  1. 封装创建逻辑:工厂函数隐藏了对象的创建细节,使得调用者不需要关心对象是如何被创建的。

  2. 动态创建对象:可以根据输入参数动态决定创建哪种类型的对象。

  3. 不依赖于类的构造函数:工厂函数通常不直接使用 new 关键字,而是通过内部逻辑来创建对象。

  4. 可扩展性强:在不修改现有代码的情况下,可以轻松添加新的对象类型。

工厂函数的用途

工厂函数常用于以下场景:

  • 当对象的创建逻辑复杂时,可以将创建逻辑封装到工厂函数中,使代码更清晰。

  • 当需要根据不同的条件创建不同类型的对象时,工厂函数可以根据输入参数动态选择对象类型。

  • 在某些编程语言中,工厂函数可以用于避免直接使用类的构造函数,从而实现更灵活的设计模式。

举例说明:

在某个项目中有大量的redis,一旦Redis服务器发生了变化,比如改了IP地址,项目的每个地方需要配置特别麻烦。所以,就使用了工厂函数。

在database.py中配置:

REDIS_CONFIG = {
    "host": getenv("REDIS_HOST", "127.0.0.1"),
    "port": int(getenv("REDIS_PORT", "6379")),
    "db": int(getenv("REDIS_DB", "0")),
    "password": getenv("REDIS_PASSWORD", None),
    "encoding": "utf8",
    "pool_minsize": int(getenv("REDIS_POOL_MINSIZE", "1")),
    "pool_maxsize": int(getenv("REDIS_POOL_MAXSIZE", "10")),
    "timeout": int(getenv("REDIS_TIMEOUT", "5"))
}
def get_redis_client(decode_responses: bool = True) -> redis.Redis:
    """获取Redis客户端实例
    
    Args:
        decode_responses: 是否自动解码响应数据为字符串
        
    Returns:
        Redis: Redis客户端实例
    """
    return redis.Redis(
        host=getenv("REDIS_HOST", "172.23.151.30"),
        port=int(getenv("REDIS_PORT", "6379")),
        db=int(getenv("REDIS_DB", "0")),
        password=getenv("REDIS_PASSWORD", ""),
        socket_timeout=int(getenv("REDIS_TIMEOUT", "5")),
        socket_connect_timeout=int(getenv("REDIS_TIMEOUT", "5")),
        pool_minsize=int(getenv("REDIS_POOL_MINSIZE", "1")),
        pool_maxsize=int(getenv("REDIS_POOL_MAXSIZE", "10")),
        decode_responses=decode_responses
    )

在各个文件中生成redis_client :

from config.database import get_redis_client

# Redis 客户端配置
redis_client = get_redis_client(decode_responses=True)

或者类中直接初始化:

from config.database import get_redis_client

def __init__(self):
    self.model = RecommendationModel()
    self.redis_client = get_redis_client()

后面直接使用即可:

相关文章:

  • 《Python编程调用本地部署大模型llava:7b :人工智能如何帮助医生诊断疾病》
  • 【PTA】1016 部分A+B
  • 我如何开发 Doc Java工具,简化文档模板生成
  • Hi3516DV300——Taurus开发环境搭建
  • About HP.FocusMode
  • 清华大学DeepSeek使用手册:6本502页大合集PDF下载
  • LLM - Attention Is All You Need 的理解
  • 推荐1款OCR的扫描仪软件,无需安装,打开即用!
  • 智能化、数字化的智慧工地云平台源码,PC端+移动端+大屏端,开箱就能上项目
  • 解决windows npm无法下载electron包的问题
  • Biomamba劝学
  • 分布式中间件:环境准备
  • 3dsmax烘焙光照贴图然后在unity中使用
  • YOLOv12:目标检测新时代的破局者
  • DeepSeek vs Grok vs ChatGPT:大模型三强争霸,谁将引领AI未来?
  • OpenCV计算摄影学(12)色调映射(Tone Mapping)的一个类cv::TonemapMantiuk
  • 模型推理增强微调
  • C++核心指导原则: 标准库
  • UE5设置打开新窗口默认停靠在主窗口
  • 【分享】网间数据摆渡系统,如何打破传输瓶颈,实现安全流转?
  • 中国驻美国使领馆提醒在美中国公民注意交通安全
  • 今年五一假期出游人群规模预计比去年提升8%,哪里最热门?
  • 澎湃读报丨央媒头版集中刊发社论,庆祝“五一”国际劳动节
  • 美乌矿产协议签署被曝“临门一脚”时生变,美方提附加条件
  • 住房和城乡建设部办公厅主任李晓龙已任部总工程师
  • 蔡澜回应“入ICU观察”称未至于病危,助理:只是老毛病