关于MemoryCache中SetSize方法的作用与大小限制的疑问
MemoryCache中SetSize的作用及常见问题解答
1. SetSize的核心作用
SetSize不是限制单条缓存条目本身的大小,它是给当前缓存条目分配一个自定义权重值,和MemoryCache的全局容量限制(通过MemoryCacheOptions.SizeLimit配置)配合使用。当所有缓存条目的权重总和超过全局SizeLimit时,MemoryCache会按默认的LRU(最近最少使用)策略淘汰旧条目,释放缓存空间。
2. SetSize的单位
- 它没有固定的KB/MB这类物理单位,完全是自定义的整数规则。比如你可以约定1单位代表1KB,或者1单位代表1MB,只要全局
SizeLimit和所有缓存条目的SetSize遵循同一规则即可。
3. 缓存内容实际大小超过SetSize设置值的情况
- 既不会抛出异常,也不会阻止缓存这条数据。因为
SetSize只是标记权重,不做实际大小校验。比如你给实际3.3KB的缓存设置SetSize(1024)(假设你约定1单位=1字节,那1024就是1KB),MemoryCache依然会正常缓存这条数据,只是计算总权重时会按1024统计。但如果全局SizeLimit是按字节配置的,这种权重和实际内存占用不匹配的情况,可能导致缓存提前淘汰或者内存占用超出预期。
补充示例(按字节匹配权重)
如果想让权重和实际内存占用对应,可这样配置:
// 全局缓存配置,设置总容量为1MB(按字节计算) services.AddMemoryCache(options => { options.SizeLimit = 1024 * 1024; }); // 缓存条目设置,按实际数据字节数设置权重 var cacheEntryOptions = new MemoryCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromSeconds(600)) .SetAbsoluteExpiration(TimeSpan.FromSeconds(3600)) .SetPriority(CacheItemPriority.Normal) .SetSize(3379); // 对应3.3KB左右的实际数据大小 _cache.Set(myKey, myData, cacheEntryOptions);
内容的提问来源于stack exchange,提问作者Paritosh
相关产品推荐
相关产品推荐

