静态类中的静态List是否还需要存入MemoryCache?
结论
你的判断是对的,绝大多数场景下这个静态List不需要额外存入MemoryCache。
原因解释
- 静态类的静态属性生命周期和你的应用进程完全绑定:只要应用不重启、你没有主动将
Resources赋值为null,它就会一直常驻内存,且所有用户、所有线程访问的都是同一个实例,和你把它存在MemoryCache里的驻留、共享效果完全一致,重复存属于多此一举。
只有这些特殊场景可以考虑换用MemoryCache
如果你的业务符合下面任意一个需求,用MemoryCache会比直接用静态属性更方便:
- 你需要翻译资源支持自动更新:比如每隔1小时要从数据源拉最新的翻译内容,MemoryCache自带绝对过期时间、滑动过期、过期后自动回调刷新的能力,不用你自己写定时任务、自己处理更新时的并发问题。
- 资源占用大且访问频率低:如果你的翻译资源条目非常多,占用内存大,且只有少部分场景会用到,MemoryCache支持内存不足时自动淘汰不常访问的缓存项,避免静态属性一直占着内存不放。
- 需要内置的线程安全保障:如果你有动态更新翻译资源的需求,静态属性的读写都不是线程安全的,你需要自己加锁避免并发读写导致的异常,MemoryCache的所有操作原生是线程安全的,能省掉你自己处理并发的代码。
额外建议
哪怕你继续用静态属性存翻译资源,也建议把属性的setter去掉改成只读,避免业务代码不小心修改了列表内容,导致全应用范围的异常:
public static class Translations { public static IReadOnlyList<string> Resources {get;} = new List<string>(); }
内容的提问来源于stack exchange,提问作者Cătălin Rădoi
相关产品推荐
相关产品推荐

