Azure App Service中ConcurrentDictionary的持久时长与多用户访问问题
嘿,针对你在Azure App Service上基于ASP.NET 4.7 MVC5,用ConcurrentDictionary做数据持久化来减少数据源调用的问题,我给你详细解答下:
问题1:多用户访问与初始化性能损耗
你的理解完全正确!只要你把ConcurrentDictionary定义为静态成员(这也是这类缓存场景的常规做法),它就属于整个Web应用的应用域(AppDomain)级别资源——填充完成后,同一Web应用的所有用户请求都可以直接访问到这个对象里的数据。
因为静态对象会被应用内所有请求线程共享,而且ConcurrentDictionary本身就是线程安全的设计,多用户并发访问也不会出现数据冲突或异常。所以只有在网站重启(比如部署新版本、应用池回收后),第一个触发填充逻辑的用户请求会承担加载数据的性能损耗,后续所有用户都能直接复用缓存好的数据,不用再去调用数据源。
问题2:ConcurrentDictionary的持久时长
这个对象的存活时间完全和应用池/应用域的生命周期绑定,具体来说:
- 正常运行状态下,只要应用池没有被回收、网站没有手动重启,
ConcurrentDictionary里的数据就会一直存在; - 当遇到以下场景时,它会被销毁:
- 应用闲置超时:Azure App Service默认会在应用20分钟没有任何请求时,将应用休眠回收,这时候应用域被销毁,缓存数据也就没了;
- 应用池定期回收:默认配置下应用池会每29小时自动回收一次(你也可以在Azure门户里自定义这个周期);
- 网站部署更新、手动重启;
- Azure平台的后台维护、资源调整导致应用重启。
需要注意的是,ConcurrentDictionary本身没有内置的闲置超时机制,不会自己清空数据——只有当承载它的应用域被销毁时,它才会被回收。
内容的提问来源于stack exchange,提问作者SamJolly
相关产品推荐
相关产品推荐

