在 Asp.net Core MVC 中使用 <distributed-cache> Tag helper 时如何破坏缓存或获取缓存键

问题描述

<distributed-cache> 标签和 Redis 有问题。

我们有一个 <partial> Razor 视图,用于显示长时间运行的查询的结果。我们从使用 @inject 注入的服务中获取数据。数据很少更新,因此我们将内容包装在 <distributed-cache> 标签助手中,并带有一个expires-after 属性

但是,当数据最终更新(在我们应用程序的另一部分)时,我们需要从分布式缓存中删除该键,以强制页面在下次执行时更新。 (我们无法预测数据何时会发生变化 - 我们只能响应外部事件。)

我们遇到的问题是,尽管具有固定的 name 属性,但缓存键似乎无法预测。例如,<distributed-cache name='_myQuery' vary-by-user='true'> 在 Redis 中按照 7/za/Bc/ZRn/MsR/hG69TYTx1LEzqBvlyH1OLJgrpk4= 行创建一个键。

我该怎么做:

  1. 预测/计算 redis 中的缓存键是什么,以便我可以在应用程序的其他部分删除它?;

  2. 这一次强制 <distributed-cache> 标签忽略缓存值吗?我知道我们有 enabled 属性,因为这不会起作用,因为页面不知道何时使缓存无效。

解决方法

深入研究 ASP.NET Core source 后,我找到了 CacheTagKey.cs 文件,其中包含 GenerateKey()GenerateHaskedKey() 方法。这些方法从一堆参数中创建密钥,然后 SHA256 对密钥进行哈希处理并返回 base64。

所以看起来我可以用它来预测缓存键并解决问题。