anjoy8 / Blog.Core

💖 ASP.NET Core 8.0 全家桶教程,前后端分离后端接口,vue教程姊妹篇,官方文档:
http://apk.neters.club/.doc
Apache License 2.0
5.06k stars 1.38k forks source link

.NET8 使用了最新的优化缓存的代码,GetAllCacheKeys方法获取不到key #369

Closed naozikaopa406 closed 3 months ago

naozikaopa406 commented 3 months ago

image

.NET 8 框架 ,经测试,Sqlsugar二级缓存确实生效,同一个使用缓存的SQL,多次调用,只执行了一次。但是获取不到key.

redis方式正常.分布式缓存有问题。

naozikaopa406 commented 3 months ago

新增测试截图 image 先写入缓存,再查询缓存个数为0,第三个获取刚才插入的缓存的值为“123123”.

LemonNoCry commented 3 months ago

未复现

增加了测试用例,已通过内存、Redis未复现问题 1.增加单元测试CacheTest,测试未复现 2.增加ValuesController测试接口TestCacheAsync,测试未复现

你是在哪里使用?可否截个完整代码,测试用例已提交

naozikaopa406 commented 3 months ago

image 新版本缓存相关类,大概就这些,里面的代码应该是同步的。

image 然后应用启动的时候使用内存方式。

image 然后再MoneyCache和TimeCache里有用到,经过测试,确实有二级缓存效果。

最后再控制器里面用ICaching接口获取所有缓存key,count=0. 不知道是不是缺少某个文件造成的。。。

LemonNoCry commented 3 months ago

了解了

注意一下IMemoryCache的注册,因为MemoryCache无法获取所有Key,所以自己实现了MemoryCacheManager 检查一下是不是有其他注册类,注册了IMemoryCache,只有这一个原因会导致获取所有Key获取不到

例如IpPolicyRateLimitSetup中 重复注册了内存缓存services.AddMemoryCache();services.AddSingleton<IMemoryCache>

如果引用了第三方类库,他的注册方法里写了内存缓存, 你就在他方法下面重复注册services.AddSingleton<IMemoryCache>(provider => provider.GetService<MemoryCacheManager>());就可以覆盖

你要检查一下其他注册类有没有重复注册,可以直接全局搜索关键字来检索

LemonNoCry commented 3 months ago

另外我将增加校验提示,如果GetAllCacheKeys注入的不是MemoryCacheManager会警告,为了健壮性不直接抛异常

naozikaopa406 commented 3 months ago

经全文检索,没有其他地方注册IMemoryCache。然后用了最新的警告相关代码,正常了。。。