基于输出缓存WCF服务:仅缓存返回True的结果15天可行吗?
实现WCF服务的结果缓存(仅缓存返回True的Plaque)
当然可行!这是非常典型的缓存优化场景,针对你的WCF服务需求,我们可以用.NET自带的缓存机制轻松实现,只需要在调用业务逻辑前后增加缓存检查和写入的逻辑即可。
核心思路
当Inquiry方法被调用时:
- 先检查缓存中是否存在当前
Plaque对应的有效记录; - 如果有且是
True,直接返回缓存结果,跳过业务逻辑; - 如果没有缓存记录,执行实际的业务逻辑获取结果;
- 若结果为
True,将该Plaque和结果存入缓存,并设置15天的绝对过期时间。
具体代码实现
首先,需要引用System.Runtime.Caching命名空间,然后在你的WCF服务类中添加缓存相关的字段和修改Inquiry方法:
using System.Runtime.Caching; public class YourWcfService : IYourWcfServiceContract { // 全局缓存实例 private static readonly ObjectCache _cache = MemoryCache.Default; // 缓存策略:设置15天的绝对过期时间 private static readonly CacheItemPolicy _cachePolicy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddDays(15) }; // 线程安全锁,防止多线程重复调用业务逻辑 private static readonly object _lockObj = new object(); public bool Inquiry(string Plaque) { // 第一步:检查缓存 if (_cache.Contains(Plaque)) { return (bool)_cache[Plaque]; } // 加锁确保线程安全,避免同一Plaque被多个请求重复处理 lock (_lockObj) { // 双重检查:防止等待锁的期间,其他线程已经把缓存写好了 if (_cache.Contains(Plaque)) { return (bool)_cache[Plaque]; } // 第二步:执行实际业务逻辑(替换成你原来的代码) bool result = GetPlaqueValidationResult(Plaque); // 第三步:如果结果为True,存入缓存 if (result) { _cache.Set(Plaque, result, _cachePolicy); } return result; } } // 这里是你原来的业务逻辑实现,比如查询数据库、调用其他服务等 private bool GetPlaqueValidationResult(string Plaque) { // 示例逻辑,替换成你的真实代码 return Plaque.StartsWith("VALID_"); // 仅作示例 } }
关键注意事项
- 缓存键的唯一性:这里直接用
Plaque作为缓存键是合理的,因为每个Plaque是唯一的标识,不会出现键冲突。 - 线程安全:添加了
lock和双重检查,避免高并发场景下同一Plaque被多个请求重复执行业务逻辑,减少不必要的资源消耗。 - 缓存失效策略:使用了绝对过期(15天后自动失效),完全符合你的需求;如果后续需要调整为“15天内未访问则失效”的滑动过期,可以修改
CacheItemPolicy的SlidingExpiration属性。 - 宿主环境影响:如果你的WCF服务部署在IIS中,要注意应用程序池回收会导致进程内的
MemoryCache丢失。如果需要持久化缓存或者跨多个服务节点共享缓存,可以考虑使用分布式缓存,但对于单节点场景,MemoryCache足够高效。
内容的提问来源于stack exchange,提问作者Ehsan Akbar
相关产品推荐
相关产品推荐

