首页 > 数据库 >后端技术:Redis进行数据缓存的两种方法

后端技术:Redis进行数据缓存的两种方法

时间:2023-12-27 12:22:24浏览次数:39  
标签:缓存 redis app cache Redis sys 两种 import

在fastapi项目中Redis进行数据缓存的两种不同的方法的demo

第一种方法:通过FastAPI应用状态

准备文件:models/redis.py为fastapi的数据库模型文件

import os

import aioredis
from aioredis import Redis


async def sys_cache() -> Redis:
    """
    系统缓存
    :return: cache 连接池
    """

    # 由 url 方式创建 redis 连接池
    sys_cache_pool = aioredis.ConnectionPool.from_url(
        f"redis://{os.getenv('CACHE_HOST', '127.0.0.1')}:{os.getenv('CACHE_PORT', 6379)}",
        db=os.getenv('CACHE_DB', 0),
        encoding='utf-8',
        decode_responses=True
    )
    return Redis(connection_pool=sys_cache_pool)

准备文件:core/Events.py为事件监听,这startup启动函数中的app.state.cache = await sys_cache()为将上面的redis.py::sys_cache()进行注册到state中,然后进行下面的步骤。

"""
@Des: fastapi事件监听
"""

from typing import Callable
from fastapi import FastAPI
from database.mysql import register_mysql
from database.redis import sys_cache
from aioredis import Redis


def startup(app: FastAPI) -> Callable:
    """
    FastApi 启动完成事件
    :param app: FastAPI
    :return: start_app
    """
    async def app_start() -> None:
        # APP启动完成后触发
        print("启动完毕")
        # 注册数据库
        await register_mysql(app)
        # 注入缓存到app state
        app.state.cache = await sys_cache()

        pass
    return app_start


def stopping(app: FastAPI) -> Callable:
    """
    FastApi 停止事件
    :param app: FastAPI
    :return: stop_app
    """
    async def stop_app() -> None:
        # APP停止时触发
        print("停止")
        pass

    return stop_app

具体实现:

api/test_redis.py这里是方法的具体实现:

from core.Response import success
from aioredis import Redis
from database.redis import sys_cache
from fastapi import Depends, Request

# 这里就是通过FastAPI应用`state`状态实现的redis数据缓存方法
async def test_my_redis(req: Request):
    # 连接池放在request
    value = await req.app.state.cache.get("today")
    return success(data=[], msg="test_my_redis")

这种方法的特点是将 Redis 客户端保存在 FastAPI 应用的全局状态中。这样可以在整个应用中轻松访问 Redis 客户端,而不需要在每个路由函数中单独创建或传递客户端实例。且没有类型提示,需要重写FastAPI的state方法。


第二种方法:使用依赖注入

只需要对models/redis.py进行操作,下面是具体的实现:

api/test_redis.py

from core.Response import success
from aioredis import Redis
from database.redis import sys_cache
from fastapi import Depends, Request


async def test_my_redis_depends(today: int, cache: Redis = Depends(sys_cache)):
    # 连接池放在依赖注入

    # await cache.set(name="today", value=today)  # 写入库
    await cache.set(name="ex_today", value=today, ex=60)
    # value = await cache.get("today")  # 获取
    return success(data=[], msg=f"今天是{today}号")

这里对cache: Redis = Depends(sys_cache)的理解为:
cache: Redis = Depends(sys_cache) 表示使用依赖注入来获取 Redis 客户端实例。sys_cache 函数被用作依赖项,它负责创建和返回 Redis 客户端实例。

在这种方法中,依赖注入(Depends)被用于在每次请求时动态地创建或获取 Redis 客户端实例。这种方法的好处是它使得路由函数更加独立和模块化,因为它们不需要直接访问 FastAPI 应用的全局状态。有类型提示。

标签:缓存,redis,app,cache,Redis,sys,两种,import
From: https://www.cnblogs.com/honeyShi/p/17930300.html

相关文章

  • Flutter 中常用的缓存数据方式
    SharedPreferences:优点:使用简单,轻量级,适用于少量数据的缓存;缺点:不适合存储大型、结构化、复杂的数据;SQLite:优点:可以存储大量、结构化、复杂的数据,支持复杂的数据查询操作;缺点:比较复杂,需要学习SQL和数据库操作;Hive:优点:快速、可扩展,性能较好,适用于存储大量数据;缺点:不支持......
  • OB_执行计划缓存
    执行计划缓存淘汰自动淘汰如果租户内存大小为10G,并且变量设置如下:ob_plan_cache_percentage=10;ob_plan_cache_evict_high_percentage=90;ob_plan_cache_evict_low_percentage=50;则:计划缓存内存上限绝对值=10G*10/100=1G;淘汰计划的高水位线=1G*90/100=......
  • shared_preferences缓存
    封装import'dart:convert';import'package:shared_preferences/shared_preferences.dart';classJSpUtil{JSpUtil._internal();//私有的构造方法,防止外部实例化factoryJSpUtil()=>_instance;//工厂方法,返回JSpUtil唯一实例staticlatefinalJSpU......
  • redisearch入门
    redisearch1.安装docker安装dockerrun-d--nameredisearch-p8379:6379redislabs/redisearch2.验证验证search是否安装dockerexec-itredisearchredis-climodulelist1)1)"name"2)"ReJSON"3)"ver"4)(integer)99......
  • 06-redis的cluster集群
    一、介绍Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)。Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为......
  • 07-Redis 多API开发实践
    Redis提供了各类开发语言的API,方便开发语言连接使用Redis。https://redis.io/clients官方网站提供了不同开发语言的API程序。网中,给我们提供了很多种Python连接redis的API,我们通常选择有“笑脸”并且带有“星号”的使用这里我们推荐使用redis-py.redis的多API支持python为......
  • 04-redis主从复制
    一、主从复制特性使用异步复制。一个主服务器可以有多个从服务器。从服务器也可以有自己的从服务器。复制功能不会阻塞主服务器。可以通过复制功能来让主服务器免于执行持久化操作,由从服务器去执行持久化操作即可当配置Redis复制功能时,强烈建议打开主服务器的持久化功能......
  • 03-redis事务,锁和服务器管理命令
    一、redis中的事务redis中的事务跟关系型数据库中的事务是一个相似的概念,但是有不同之处。关系型数据库事务执行失败后面的sql语句不在执行,而redis中的一条命令执行失败,其余的命令照常执行。redis中开启一个事务是使用multi,相当于begin\starttransaction,exec提交事务,discard取......
  • 01-redis的安装和基本配置
    一、redis简介1、Redis是一款开源的,ANSIC语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。2、Redis采用内存(In-Memory)数据集(DataSet)。3、支持多种数据类型。4、运行于大多数POSIX系统,如Linux、*BSD、OSX等。redis软件获取和帮助Redis.ioDownload......
  • 02-redis的持久化和数据类型
    一、redis持久化1.1持久化类型|持久化类型|介绍|优点|缺点|-------------|-----------------|-----------------|-------------|--|RDB持久化|可以在指定的时间间隔内生成数据集的时间点快照(point-in-timesnapshot)。|速度快,适合于用做备份,主从复制也是基于RDB持久化功能......