IDistributedCache 抽象
在多台服务器之间缓存数据。
IDistributedCache 抽象 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
为什么要使用分布式缓存
内存缓存存在于单个进程中,因此重启后会丢失,也不会在多个服务器之间共享。分布式缓存存在于外部存储中(例如 Redis),应用的每个实例都可以读写该存储,从而使缓存内容在横向扩展的部署中保持一致。
IDistributedCache 接口
ASP.NET Core 在 Microsoft.Extensions.Caching.Distributed 中通过 IDistributedCache 对分布式缓存进行了抽象。您的代码依赖这个接口,而不是直接依赖 Redis,因此可以替换具体实现。
public interface IDistributedCache
{
byte[] Get(string key);
Task<byte[]> GetAsync(string key, CancellationToken token = default);
void Set(string key, byte[] value, DistributedCacheEntryOptions options);
void Remove(string key);
void Refresh(string key);
}它存储字节
请注意,缓存存储的是 byte[]。要缓存字符串或对象,必须先将其序列化。针对常见情况,框架还提供了便捷的字符串扩展方法。
using Microsoft.Extensions.Caching.Distributed;
await cache.SetStringAsync("greeting", "Hello, world");
string value = await cache.GetStringAsync("greeting");注入缓存
像请求任何服务一样,通过构造函数注入 IDistributedCache。
public class WeatherService
{
private readonly IDistributedCache _cache;
public WeatherService(IDistributedCache cache)
{
_cache = cache;
}
}从缓存读取
当键不存在或已过期时,GetStringAsync 会返回 null。请始终处理未命中情况。
string cached = await _cache.GetStringAsync("forecast:istanbul");
if (cached is null)
{
// cache miss: load from source
}写入缓存
SetStringAsync 会使用可选的过期 options(选项)存储值(后续课程会介绍)。
await _cache.SetStringAsync(
"forecast:istanbul",
"22C sunny",
new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
});移除与刷新
RemoveAsync 会逐出一个键对应的条目(例如底层数据发生变化时)。RefreshAsync 会在不改变值的情况下重置滑动过期时间。
await _cache.RemoveAsync("forecast:istanbul");
await _cache.RefreshAsync("session:abc123");内存实现
在开发或测试时,请注册内存分布式缓存。它实现了相同的接口,因此您的代码完全相同,但数据实际上不会在进程之间共享。
builder.Services.AddDistributedMemoryCache();与提供程序无关的代码
由于您只依赖 IDistributedCache,从内存提供程序切换到 Redis(或 SQL Server)只需更改一行注册代码,无需修改服务中的代码。
键命名约定
请使用结构化的带命名空间的键,例如 entity:id:field(如 user:42:profile)。清晰的约定可以防止冲突,并使缓存失效过程变得可预测。
string key = $"user:{userId}:profile";不应缓存的情况
应缓存经常读取且很少变化的数据。高度易变的数据或特定用户的敏感数据可能不适合缓存,并且始终要权衡数据过时的风险与性能收益。
快速检查
测试 IDistributedCache 抽象。
总结
IDistributedCache 对外部共享缓存进行了抽象,因此每个应用实例都能看到相同的数据。它存储 byte[],并提供用于字符串的 GetStringAsync/SetStringAsync,以及 RemoveAsync 和 RefreshAsync。依赖该接口可以让代码与提供程序无关,并可在 AddDistributedMemoryCache 和 Redis 之间切换,只需修改一行代码。请使用清晰的带命名空间的键。
常见问题解答
「IDistributedCache 抽象」课时是免费的吗?
是的 — 「IDistributedCache 抽象」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「IDistributedCache 抽象」这节课中我会学到什么?
在多台服务器之间缓存数据。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「IDistributedCache 抽象」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。