基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
1|0系列文章
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目
- 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来
- 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
- 基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先
- 基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查
- 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
- 基于 abp vNext 和 .NET Core 开发博客项目 - 再说Swagger,分组、描述、小绿锁
- 基于 abp vNext 和 .NET Core 开发博客项目 - 接入GitHub,用JWT保护你的API
- 基于 abp vNext 和 .NET Core 开发博客项目 - 异常处理和日志记录
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据
- 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理
- 基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(一)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(五)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)
- 基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目
上一篇文章(https://www.cnblogs.com/meowv/p/12943699.html)完成了项目的全局异常处理和日志记录。
在日志记录中使用的静态方法有人指出写法不是很优雅,遂优化一下上一篇中日志记录的方法,具体操作如下:
在.ToolKits
层中新建扩展方法Log4NetExtensions.cs
。
配置log4net,然后我们直接返回IHostBuilder对象,便于在Main
方法中链式调用。
然后修改MeowvBlogExceptionFilter
过滤器,代码如下:
可以删掉之前添加的LoggerHelper.cs
类,运行一下,同样可以达到预期效果。
本篇将集成Redis,使用Redis来缓存数据,使用方法参考的微软官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/distributed
关于Redis的介绍这里就不多说了,这里有一篇快速入门的文章:Redis快速入门及使用,对于不了解的同学可以看看。
直入主题,先在appsettings.json
配置Redis的连接字符串。
对应的,在AppSettings.cs
中读取。
在.Application.Caching
层添加包Microsoft.Extensions.Caching.StackExchangeRedis
,然后在模块类MeowvBlogApplicationCachingModule
中添加配置缓存实现。
options.Configuration
是 Redis 的连接字符串。
options.InstanceNam
是 Redis 实例名称,这里没填。
options.ConfigurationOptions
是 Redis 的配置属性,如果配置了这个字,将优先于 Configuration 中的配置,同时它支持更多的选项。我这里也没填。
紧接着我们就可以直接使用了,直接将IDistributedCache
接口依赖关系注入即可。
可以看到默认已经实现了这么多常用的接口,已经够我这个小项目用的了,同时在Microsoft.Extensions.Caching.Distributed.DistributedCacheExtensions
中微软还给我们提供了很多扩展方法。
于是,我们我就想到写一个新的扩展方法,可以同时处理获取和添加缓存的操作,当缓存存在时,直接返回,不存在时,添加缓存。
新建MeowvBlogApplicationCachingExtensions.cs
扩展方法,如下:
我们可以在DistributedCacheEntryOptions
中可以配置我们的缓存过期时间,其中有一个判断条件,就是当minutes = -1
的时候,不指定过期时间,那么我们的缓存就不会过期了。
GetStringAsync()
、SetStringAsync()
是DistributedCacheExtensions
的扩展方法,最终会将缓存项cacheItem
转换成JSON格式进行存储。
CacheStrategy
是在.Domain.Shared
层定义的缓存过期时间策略常量。
接下来去创建缓存接口类和实现类,然后再我们的引用服务层.Application
中进行调用,拿上一篇中接入GitHub的几个接口来做新增缓存操作。
和.Application
层格式一样,在.Application.Caching
中新建Authorize文件夹,添加缓存接口IAuthorizeCacheService
和实现类AuthorizeCacheService
。
注意命名规范,实现类肯定要继承一个公共的CachingServiceBase
基类。在.Application.Caching
层根目录添加MeowvBlogApplicationCachingServiceBase.cs
,继承ITransientDependency
。
然后使用属性注入的方式,注入IDistributedCache
。这样我们只要继承了基类:CachingServiceBase
,就可以愉快的使用缓存了。
添加要缓存的接口到IAuthorizeCacheService
,在这里我们使用Func()
方法,我们的接口返回什么类型由Func()
来决定,于是添加三个接口如下:
是不是和IAuthorizeService
代码很像,的确,我就是直接复制过来改的。
在AuthorizeCacheService
中实现接口。
代码很简单,每个缓存都有固定KEY值,根据参数生成KEY,然后调用前面写的扩展方法,再给一个过期时间即可,可以看到KEY里面包含了冒号 :
,这个冒号 :
可以起到类似于文件夹的操作,在界面化管理工具中可以很友好的查看。
这样我们的缓存就搞定了,然后在.Application
层对应的Service中进行调用。代码如下:
直接return我们的缓存接口,当查询到Redis中存在KEY值的缓存就不会再走我们的具体的实现方法了。
注意注意,千万不要忘了在.Application
层的模块类中添加依赖缓存模块MeowvBlogApplicationCachingModule
,不然就会报错报错报错(我就是忘了添加...)
此时项目的层级目录结构。
好的,编译运行项目,现在去调用接口看看效果,为了真实,这里我先将我redis缓存数据全部干掉。
访问接口,.../auth/url,成功返回数据,现在再去看看我们的redis。
成功将KEY为:Authorize:GetLoginAddress 添加进去了,这里直接使用RedisDesktopManager进行查看。
那么再次调用这个接口,只要没有过期,就会直接返回数据了,调试图如下:
可以看到,是可以直接取到缓存数据的,其他接口大家自己试试吧,一样的效果。
是不是很简单,用最少的代码集成Redis进行数据缓存,你学会了吗?😁😁😁
开源地址:https://github.com/Meowv/Blog/tree/blog_tutorial
__EOF__

本文链接:https://www.cnblogs.com/meowv/p/12956696.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?