Orchard源码:缓存设计
概述
从缓存失效的几种方式开始了解Orchard缓存设计
1.设置失效时间
1 2 3 4 5 6 | Func< int > retrieve = () => _cacheManager.Get( "testItem" , ctx => { ctx.Monitor(_clock.When(TimeSpan.FromSeconds(1))); return ++cached; }); |
2.通知删除
1 2 3 4 5 6 7 8 9 10 11 12 13 | //第一步构造器注入signals private readonly ISignals _signals; //获取缓存数据 var data = _cacheManager.Get( "key2" , l => { l.Monitor(_signals.When( "NofifyKey" ));NofifyKey return "AAA" ; }); //更新缓存 _signals.Trigger( "NofifyKey" ); |
还是其它的几种失效方式,
DirectoryToken :目录最后修改日期监控失效
FileToken:文件最后修改日期监控失效
AsyncVolativeToken:异步任务执行完成时失效
等等等具体请看代码实现
实现
注册缓存相关组件
1 2 3 4 5 6 7 8 | var builder = new ContainerBuilder(); builder.RegisterModule( new CacheModule()); builder.RegisterType<DefaultCacheManager>().As<ICacheManager>(); builder.RegisterType<DefaultCacheHolder>().As<ICacheHolder>().SingleInstance(); builder.RegisterType<DefaultCacheContextAccessor>().As<ICacheContextAccessor>(); builder.RegisterInstance<IClock>(_clock = new StubClock()); _container = builder.Build(); _cacheManager = _container.Resolve<ICacheManager>( new TypedParameter( typeof (Type), GetType())); |
Orchard使用Autofac作为容器组件。注册的相关类型:
DefaultCacheManager:缓存管理器,构造函数第一个参数为持有ICacheManager对象的类型。type作为缓存Key的一部分,这样不同的类使用相同的缓存键互不影响。
DefaultCacheHolder:缓存存储方式,Orchard使用了ConcurrentDictionary<CacheKey, object> , 可以实现自己的ICacheHolder,如支持分布式缓存
DefaultCacheContextAccessor:用于保存缓存上下文。当有多个缓存上下文时,保证缓存同时失效。
IAcquireContext: 缓存上下文。 Monitor委托用于获取缓存失效方式
ICache:缓存项,每一个持有ICacheManager对象的类型对应一个ICache
总结
介绍了Orchard缓存模块的相关类,没有贴出更多详细的代码。了解每个类大致作用再阅读调试源码会有更深的印象。 有问题的话请留言。
参考
http://blog.wangtuyao.com/post/2014/9/14/orchard-caching-moudle 介绍了多个缓存上下文同时失效的设计
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 个人数据保全计划:从印象笔记迁移到joplin
· Vue3.5常用特性整理
· 重拾 SSH:从基础到安全加固
· 为什么UNIX使用init进程启动其他进程?