ASP.NET CORE中怎么用Redis做缓存(不考虑分布式的问题)
1 个回答
-
首先,不应该把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, ListRoles); /// /// 用户角色 /// /// 角色名称 /// 角色编码 internal record Role(int Id, string Code);运行结果分别如下:
以上只是简单地演示在.NET 6 Minimal APIs应用程序是如何使用Redis缓存的存/取功能,在实际应用中还需考虑其它问题,比如:连接池,缓存的刷新机制,缓存数据的数据类型等等。