首页 / 问答 / ASP.NET CORE中怎么用Redis做缓存(不考虑分布式的问题)

ASP.NET CORE中怎么用Redis做缓存(不考虑分布式的问题)

Redis 842 次浏览
0

想要知道具体的用法

回复 [×]
提交评论
请输入评论内容

1 个回答

  • 0

    首先,不应该把Redis看得太神秘,它就是一个基于内存的键/值缓存系统(也称为缓存数据库)。

    其次,Redis本身对外提供的API访问,这所以很多语言有可以直接访问Redis的能力,是因为不同语言基于这些API做了封装。

    .NET中也有许多封装好了的可以访问Redis的客户端组件,比如:ServiceStack.Redis, StackExchange.Redis,FreeRedis等等。通过这些客户端的封装,.NET开发人员可以直接使用.NET的语法访问Redis,以下示例将使用ServiceStack.Redis客户端作为演示(笔者用起来感觉最顺手的.NET下的Redis客户端组件)。

    注:ServiceStack.Redis是收费组件,如果不付费,有每小时6000次请求的限制。如何解除这一限制,请自行百度。

    以下是基于.NET 6 Minimal APIs开发的示例程序,内容比较简单,一个是/redis/test_01,另一个是/redis/test_02

    其中/redis/test_01是简单地存/取一个用户名,而/redis/test_02则是存/取一个用户登录信息对象,完整示例代码如下:

    using ServiceStack.Redis;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    var app = builder.Build();
    
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }
    
    app.MapGet("/redis/test_01", () =>
    {
        var client = new RedisClient("127.0.0.1:6379");
        client.Set(RedisKeyCollection.UserNameKey(1), "Rector");
    
        var nameFromRedis = client.Get(RedisKeyCollection.UserNameKey(1));
    
        return Results.Ok($"Name from redis is {nameFromRedis}.");
    })
    .WithName("TEST_01");
    
    app.MapGet("/redis/test_02", () =>
    {
        var client = new RedisClient("127.0.0.1:6379");
        var userInfo = new UserInfo(1, "Rector", true, DateTime.Now, new()
        {
            new(1, "Admin"),
            new(2, "Manager")
        });
        client.Set(RedisKeyCollection.UserInfoKey(userInfo.Id), userInfo);
    
        var userFromRedis = client.Get(RedisKeyCollection.UserInfoKey(1));
    
        return Results.Ok(userFromRedis);
    })
    .WithName("TEST_02");
    
    app.Run();
    
    /// 
    /// 用于存储Redis键的集合类
    /// 
    internal record RedisKeyCollection
    {
        /// 
        /// 只存储用户名的Redis键
        /// 
        public static string UserNameKey(int userId)
        {
            return $"user:name:{userId}";
        }
        /// 
        /// 用于存储不同用户基本信息的Redis键
        /// 
        public static string UserInfoKey(int userId)
        {
            return $"user:info:{userId}";
        }
    }
    
    /// 
    /// 用户登录登录信息实体模型
    /// 
    /// 用户ID
    /// 登录名
    /// 是否激活
    /// 最后登录时间
    /// 角色集合
    internal record UserInfo(int Id, string LoginName, bool isActive, DateTime? lastLoginAt, List Roles);
    /// 
    /// 用户角色
    /// 
    /// 角色名称
    /// 角色编码
    internal record Role(int Id, string Code);
    

    运行结果分别如下:

    以上只是简单地演示在.NET 6 Minimal APIs应用程序是如何使用Redis缓存的存/取功能,在实际应用中还需考虑其它问题,比如:连接池,缓存的刷新机制,缓存数据的数据类型等等。

    Rector的个人主页

    Rector

    2021-12-12 回答

    我来回答