我有我的控制器成员
private Lazy<MyCache> loadedComponentCache = new Lazy<MyCache>(() =>
{
MyCache instance = MyCacheb.Instance;
instance.LoadStuffAsync().Wait();
return instance;
}, LazyThreadSafetyMode.PublicationOnly);
我正在使用懒惰调用一个长时间运行的方法LoadAsync()
,只有在用户访问该页面后命中某个API端点时才需要调用该方法。
[HttpGet]
public ActionResult GetStuff()
{
var results = from component in loadedComponentCache.Value.All()
// ...
}
任何想法为什么每次API端点被击中时它都会重新加载?我的理解是,只有当用户访问页面时才会创建我的控制器实例,因此每个访问该页面的用户每次API调用只会触发一次。
答案 0 :(得分:0)
您可以将loadedComponentCache设为静态,但这并不理想。如果您使用的是IoC容器,则可以将其注册为单例。尽管可能,但通常应避免使用这些长寿命物体。
如果您确实需要这个长期存储缓存,那么您应该考虑使用类似Redis的东西,它是针对这种情况设计和优化的,并且可以分布在多个节点上。 https://redis.io/topics/introduction