You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中基于IDistributedCache实现Redis缓存的滑动过期

IDistributedCache滑动过期处理与Memcache的差异

一、IDistributedCache的滑动过期处理逻辑

IDistributedCache不会自动处理滑动过期的刷新逻辑,因为分布式缓存场景下多实例共享缓存,自动刷新会带来一致性和性能问题,所以需要你在每次访问缓存数据时手动触发过期时间刷新:

  • 可以调用RefreshAsync方法直接重置滑动过期时间,该方法会基于你最初设置的DistributedCacheEntryOptions.SlidingExpiration参数重新计算过期时间;
  • 或者在获取缓存数据后,重新调用SetAsync方法(带上相同的滑动过期配置)来覆盖原缓存,间接实现过期时间刷新。

示例代码:

// 获取缓存
var cachedData = await _distributedCache.GetStringAsync("user:123");
if (cachedData != null)
{
    // 手动刷新滑动过期时间
    await _distributedCache.RefreshAsync("user:123");
}

需要注意的是,Redis作为IDistributedCache的常用实现,本身支持通过EXPIRE命令更新过期时间,但IDistributedCache抽象层没有封装“访问即自动刷新”的逻辑,必须由业务代码显式处理。

二、与Memcache滑动过期行为的差异

  • Memcache自动刷新:Memcache的滑动过期是服务器端自动处理的——只要有客户端访问某个缓存键,Memcache就会自动延长该键的过期时间,无需业务代码做额外操作。这是Memcache内置的lazy expiration机制的一部分。
  • IDistributedCache(Redis实现)需手动触发:Redis本身没有内置“访问即刷新过期”的功能,必须通过业务代码调用刷新方法,或者自定义Lua脚本在获取缓存的同时更新过期时间。
  • 一致性风险不同:Memcache的自动刷新在单实例场景下很方便,但多实例集群中可能出现多个节点同时刷新导致的过期时间不一致;而IDistributedCache的手动刷新逻辑由业务层控制,一致性更可控,但需要额外的代码开发成本。

内容的提问来源于stack exchange,提问作者Sachin Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:54:53