首页 > 数据库 >高效缓存策略——.NET Core 中基于 Redis 的分布式缓存实现

高效缓存策略——.NET Core 中基于 Redis 的分布式缓存实现

时间:2024-08-23 09:23:17浏览次数:13  
标签:Core 缓存 Redis distributedCache NET public 分布式

引言

在构建高性能的应用程序时,缓存是不可或缺的技术之一。通过缓存,我们能够显著减少数据库的压力、提升应用的响应速度。而在分布式系统中,分布式缓存则成为了处理高并发和大数据量的理想选择。本文将以 Redis 为例,介绍如何在 .NET Core 中实现分布式缓存,帮助开发者打造高效的缓存策略。

Redis 分布式缓存的优势

Redis 是一种开源的内存数据存储,支持多种数据结构,如字符串、哈希、集合等。作为分布式缓存的热门选择,它具有以下优势:

  • 超高性能: 基于内存操作,读写速度极快。
  • 支持多种数据类型: Redis 可以处理各种数据类型,灵活性强。
  • 持久化机制: 支持将数据持久化到磁盘,保证数据不会丢失。
  • 跨平台支持: Redis 支持多种操作系统,兼容性强。

.NET Core 中集成 Redis 作为分布式缓存

我们将分步骤介绍如何在 .NET Core 项目中集成 Redis 缓存。

第一步:添加依赖包

在你的 .NET Core 项目中,使用以下命令安装 Redis 的相关包。

dotnet add package StackExchange.Redis
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis

第二步:配置 Redis 连接信息

在 appsettings.json 文件中添加 Redis 连接配置。

{
  "RedisCacheSettings": {
    "ConnectionString": "localhost:6379",
    "InstanceName": "SampleInstance"
  }
}

第三步:在 Startup.cs 中配置 Redis 缓存服务

打开 Startup.cs 文件,添加 Redis 缓存服务的配置。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 从 appsettings.json 中获取 Redis 连接配置
        var redisConnectionString = Configuration.GetSection("RedisCacheSettings:ConnectionString").Value;
        
        // 添加 Redis 缓存服务
        services.AddStackExchangeRedisCache(options =>
        {
            options.Configuration = redisConnectionString;
            options.InstanceName = Configuration.GetSection("RedisCacheSettings:InstanceName").Value;
        });

        // 其他服务配置...
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 配置应用程序中间件
    }
}

第四步:使用 Redis 进行缓存操作

我们将在控制器中演示如何使用 IDistributedCache 来存取 Redis 缓存中的数据。

public class ProductController : ControllerBase
{
    private readonly IDistributedCache _distributedCache;

    public ProductController(IDistributedCache distributedCache)
    {
        _distributedCache = distributedCache;
    }

    [HttpGet]
    public async Task<IActionResult> GetProductInfo()
    {
        // 定义缓存键
        var cacheKey = "productInfo";
        
        // 从缓存中获取数据
        var cachedProductInfo = await _distributedCache.GetStringAsync(cacheKey);
        
        if (cachedProductInfo != null)
        {
            // 如果缓存中有数据,直接返回
            return Ok($"从缓存获取的数据:{cachedProductInfo}");
        }

        // 模拟从数据库或API获取数据
        var productInfo = "Product Name: XYZ, Price: $99.99";

        // 将数据存入缓存,并设置过期时间为5分钟
        var cacheOptions = new DistributedCacheEntryOptions()
            .SetAbsoluteExpiration(TimeSpan.FromMinutes(5));
        
        await _distributedCache.SetStringAsync(cacheKey, productInfo, cacheOptions);

        return Ok($"从数据库获取的数据:{productInfo}");
    }
}

代码解释:

  1. 缓存键的定义: cacheKey 用于标识缓存中的特定数据。
  2. 从缓存中读取数据: 通过 _distributedCache.GetStringAsync() 方法尝试从 Redis 缓存中读取数据。
  3. 缓存数据: 如果缓存中没有数据,则从数据库或外部 API 获取数据,并使用_distributedCache.SetStringAsync() 方法将数据缓存。
  4. 缓存策略设置: 通过 DistributedCacheEntryOptions 设置缓存的过期时间,这里我们将缓存的存活时间设置为 5 分钟。

使用场景
Redis 分布式缓存在以下场景中特别适用:

  1. 高并发系统: Redis 能有效减少数据库的压力,提升系统的响应时间。
  2. 热点数据: 经常被访问的数据(如热门商品、配置数据等)可以通过缓存减少重复的查询操作。
  3. 分布式系统: 在分布式系统中,各服务节点可以共享同一个缓存,实现数据的高效复用。

总结

通过在 .NET Core 中集成 Redis 作为分布式缓存,开发者能够大幅度提升应用的性能与可扩展性。在实际开发中,合理地设计缓存策略,选择合适的缓存过期时间和数据一致性策略,能够帮助我们最大化缓存的效率与稳定性。

标签:Core,缓存,Redis,distributedCache,NET,public,分布式
From: https://blog.csdn.net/qq_40998698/article/details/141380373

相关文章

  • Redis学习(一)
    1.通用命令keys*delk1existsk1expipek1ttlk12.String类型String类型的常见命令setk1v1 添加键值对getk1v1 获得键值对对应的值msetk1v1k2v2 一次性设置多个值mgetk1k2k3 一次性获取多个键值对的值incrk1 让k1自增incrbyk12 按步长2自增......
  • core dump如何解决排查的过程
    **Coredump**是指程序在运行过程中发生严重错误,通常是由于非法操作(如访问无效内存地址)导致程序崩溃,操作系统生成了一个包含程序状态的内存映像文件(coredump)。这个文件可以用于调试,帮助开发者找到问题的根源。解决和排查coredump的过程通常涉及以下几个步骤:###1.**启用Co......
  • 浅谈Redis(一)
    浅谈Redis(一)文章目录浅谈Redis(一)Redis的特点Redis线程模型Redis单线程为什么快Redis持久化方案Redis缓存淘汰策略Redis缓存穿透、击穿和雪崩区别和解决方案Redis是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,比如str......
  • Springboot实战——黑马点评之缓存
    Springboot黑马点评——缓存1缓存初识与简单实现1.1根据商铺id的缓存查询基础缓存实现:考虑到有数据会同时存在于数据库和缓存中,所以:Q:数据库和缓存的数据一致性问题?A:三种缓存更新策略用来解决一致性问题1.2缓存更新策略的选择第一种:内存淘汰第二种:超时剔除第三......
  • Asp .Net Core 学习笔记
    Startup类ConfigureServices方法注册服务,并通过依赖注入(DI)或者ApplicationServices在整个应用中使用服务使用IServiceCollection的各种Add{Service}进行注册,例如,AddDbContext、AddDefault、AddEntityFrameworkStores和AddPages在Configure方法配置应用服务之前,由主机......
  • 第四章 Python操作redis(操作案例)
    一、python对redis基本操作(1)连接redis#方式1importredisr=redis.Redis(host='127.0.0.1',port=6379)r.set('foo','Bar')print(r.get('foo'))#方式2importredispool=redis.ConnectionPool(host='127.0.0.1',po......
  • 第三章 redis数据类型
    redis数据类型redis可以理解成一个全局的大字典,key就是数据的唯一标识符。根据key对应的值不同,可以划分成5个基本数据类型。redis={"name":"yuan","scors":["100","89","78"],"info":{"name":"rain"......
  • 大厂面试官:你知道Redis如何实现分布式锁么?
    常见面试题,看完基本也没啥问题了Redis如何实现分布式锁分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。如下图所示:Redis本身可以被多个客户端共享访问,正好就是一个共享存储系统,可以用来保存分布式锁,而且Redis的读写......
  • 【redis数据库】基础入门,五种类型增删改查
    目录1.redis的启动2.redis基本操作3.redis的数据类型4.字符串操作添加修改值获取值5.键相关操作查找键判断键是否存在查看键对应的值类型设置已有键的过期时间查看键过期时间6.哈希操作添加值添加多个值获取字段获取字段对应的值获取多个字段的值获取所有字......
  • EF Core使用SharedTypeEntity,映射实体类到不同的数据库表(转载)
    我们可以借助EFCore的SharedTypeEntity,映射一个实体类到多个结构相同的数据库表:publicclassUser{publicintId{get;set;}publicstringName{get;set;}}publicclassSomeDbContext:DbContext{protectedoverridevoidOnConfiguring(DbConte......