当前位置: 首页 > news >正文

网站视频下载软件高明区做网站

网站视频下载软件,高明区做网站,东莞招聘网人才网,如何做品牌营销策划前言从2017年11月11号在Github创建EasyCaching这个仓库#xff0c;到现在也已经将近一年半的时间了#xff0c;基本都是在下班之后和假期在完善这个项目。由于EasyCaching目前只有英文的文档托管在Read the Docs上面#xff0c;当初选的MkDocs现在还不支持多语言#xff0c… 前言从2017年11月11号在Github创建EasyCaching这个仓库到现在也已经将近一年半的时间了基本都是在下班之后和假期在完善这个项目。由于EasyCaching目前只有英文的文档托管在Read the Docs上面当初选的MkDocs现在还不支持多语言所以这个中文的要等它支持之后才会有计划。之前在群里有看到过有人说没找到EasyCaching的相关介绍这也是为什么要写这篇博客的原因。下面就先简单介绍一下EasyCaching。什么是EasyCachingEasyCaching这个名字就很大程度上解释了它是做什么的easy和caching放在一起其最终的目的就是为了让我们大家在操作缓存的时候更加的方便。它的发展大概经历了这几个比较重要的时间节点18年3月在茶叔的帮助下进入了NCC19年1月镇汐大大提了很多改进意见19年3月NopCommerce引入EasyCaching (可以看这个 commit记录)19年4月列入awesome-dotnet-core(自己提pr过去的有点小自恋。。)在EasyCaching出来之前大部分人应该会对CacheManager比较熟悉因为两者的定位和功能都差不多所以偶尔会听到有朋友拿这两个去对比。为了大家可以更好的进行对比下面就重点介绍EasyCaching现有的功能了。EasyCaching的主要功能EasyCaching主要提供了下面的几个功能统一的抽象缓存接口多种常用的缓存Provider(InMemoryRedisMemcachedSQLite)为分布式缓存的数据序列化提供了多种选择二级缓存缓存的AOP操作(able, putevict)多实例支持支持DiagnosticsRedis的特殊Provider当然除了这8个还有一些比较小的就不在这里列出来说明了。下面就分别来介绍一下上面的这8个功能。统一的抽象缓存接口缓存本身也可以算作是一个数据源也是包含了一堆CURD的操作所以会有一个统一的抽象接口。面向接口编程虽然EasyCaching提供了一些简单的实现不一定能满足您的需要但是呢只要你愿意完全可以一言不合就实现自己的provider。对于缓存操作目前提供了下面几个基本都会有同步和异步的操作。TrySet/TrySetAsyncSet/SetAsyncSetAll/SetAllAsyncGet/GetAsync(with data retriever)Get/GetAsync(without data retriever)GetByPrefix/GetByPrefixAsyncGetAll/GetAllAsyncRemove/RemoveAsyncRemoveByPrefix/RemoveByPrefixAsyncRemoveAll/RemoveAllAsyncFlush/FlushAsyncGetCountGetExpiration/GetExpirationAsyncRefresh/RefreshAsync(这个后面会被废弃直接用set就可以了)从名字的定义应该就可以知道它们做了什么这里就不继续展开了。多种常用的缓存Provider我们会把这些provider分为两大类一类是本地缓存一类是分布式缓存。目前的实现有下面五个本地缓存InMemorySQLite分布式缓存StackExchange.RediscsredisEnyimMemcachedCore它们的用法都是十分简单的。下面以InMemory这个Provider为例来说明。首先是通过nuget安装对应的包。dotnet add package EasyCaching.InMemory其次是添加配置public void ConfigureServices(IServiceCollection services){ services.AddEasyCaching(option { option.UseInMemory(default); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){ app.UseEasyCaching();}配置文件的示例easycaching: {inmemory: {MaxRdSecond: 120,EnableLogging: false,LockMs: 5000,SleepMs: 300,DBConfig:{SizeLimit: 10000,ExpirationScanFrequency: 60 } }}关于配置这里有必要说明一点那就是MaxRdSecond的值因为这个把老猫子大哥坑了一次所以要拎出来特别说一下这个值的作用是预防在同一时刻出现大批量缓存同时失效为每个key原有的过期时间上面加了一个随机的秒数尽可能的分散它们的过期时间如果您的应用场景不需要这个可以将其设置为0。最后的话就是使用了。[Route(api/[controller])]public class ValuesController : Controller{private readonly IEasyCachingProvider _provider;public ValuesController(IEasyCachingProvider provider){this._provider provider; } [HttpGet] [Route(sync)]public string Get(){var res1 _provider.Get(demo, () 456, TimeSpan.FromMinutes(1));var res2 _provider.Getstring(demo); _provider.Set(demo, 123, TimeSpan.FromMinutes(1)); _provider.Remove(demo);return sync; } [HttpGet] [Route(async)]public async Taskstring GetAsync(string str){var res1 await _provider.GetAsync(demo, async () await Task.FromResult(456), TimeSpan.FromMinutes(1));var res2 await _provider.GetAsyncstring(demo);await _provider.SetAsync(demo, 123, TimeSpan.FromMinutes(1));await _provider.RemoveAsync(demo);return async; }}还有一个要注意的地方是如果用的get方法是带有查询的它在没有命中缓存的情况下去数据库查询前会有一个加锁操作避免一个key在同一时刻去查了n次数据库这个锁的生存时间和休眠时间是由配置中的LockMs和SleepMs决定的。分布式缓存的序列化选择对于分布式缓存的操作我们不可避免的会遇到序列化的问题.目前这个主要是针对redis和memcached的。当然对于序列化都会有一个默认的实现是基于BinaryFormatter因为这个不依赖于第三方的类库如果没有指定其它的就会使用这个去进行序列化的操作了。除了这个默认的实现还提供了三种额外的选择。Newtonsoft.JsonMessagePack和Protobuf。下面以在Redis的provider使用MessagePack为例来看看它的用法。services.AddEasyCaching(option { option.UseRedis(config { config.DBConfig.Endpoints.Add(new ServerEndPoint(127.0.0.1, 6379)); }, redis1) .WithMessagePack();}); 不过这里需要注意的是目前这些Serializer并不会跟着Provider走意思就是不能说这个provider用messagepack那个provider用json只能有一种Serializer可能这一个后面需要加强。多实例支持可能有人会问多实例是什么意思这里的多实例主要是指在同一个项目中同时使用多个provider包括多个同一类型的provider或着是不同类型的provider。这样说可能不太清晰再来举一个虚构的小例子可能大家就会更清晰了。现在我们的商品缓存在redis集群一中用户信息在redis集群二中商品评论缓存在mecached集群中一些简单的配置信息在应用服务器的本地缓存中。在这种情况下我们想简单的通过IEasyCachingProvider来直接操作这么多不同的缓存显然是没办法做到的这个时候想同时操作这么多不同的缓存就要借助IEasyCachingProviderFactory来指定使用那个provider。这个工厂是通过provider的名字来获取要使用的provider。下面来看个例子。我们先添加两个不同名字的InMemory缓存services.AddEasyCaching(option { option.UseInMemory(m1); config.UseInMemory(options { options.DBConfig new InMemoryCachingOptions { SizeLimit 100 }; }, m2);});使用的时候[Route(api/[controller])] public class ValuesController : Controller { private readonly IEasyCachingProviderFactory _factory; public ValuesController(IEasyCachingProviderFactory factory) { this._factory factory; } [HttpGet] [Route()] public string Get() { var provider_1 _factory.GetCachingProvider(m1); var provider_2 _factory.GetCachingProvider(m2);return $multi instances; } } 上面这个例子中provider_1和provider_2是不会互相干扰对方的因为它们是不同的provider直观感觉有点类似区域(region)的概念可以这样去理解但是严格意义上它并不是区域。缓存的AOP操作说起AOP可能大家第一印象会是记录日志操作把参数打一下结果打一下。其实这个在缓存操作中同样有简化的作用。一般情况下我们可能是这样操作缓存的。public async TaskProduct GetProductAsync(int id) { string cacheKey $product:{id}; var val await _cache.GetAsyncProduct(cacheKey); if(val.HasValue) return val.Value; var product await _db.GetProductAsync(id); if(product ! null) _cache.SetProduct(cacheKey, product, expiration); return val; } 如果使用缓存的地方很多那么我们可能就会觉得烦锁。我们同样可以使用AOP来简化这一操作。public interface IProductService { [EasyCachingAble(Expiration 10)]TaskProduct GetProductAsync(int id);}public class ProductService : IProductService{public TaskProduct GetProductAsync(int id){return Task.FromResult(new Product { ... }); }}可以看到我们只要在接口的定义上面加上一个Attribute标识一下就可以了。当然只加Attribute不加配置它也是不会生效的。下面以EasyCaching.Interceptor.AspectCore为例添加相应的配置。public IServiceProvider ConfigureServices(IServiceCollection services){ services.AddScopedIProductService, ProductService(); services.AddEasyCaching(options { options.UseInMemory(m1); });return services.ConfigureAspectCoreInterceptor(options { options.CacheProviderName m1; });}这两步就可以让你在调用方法的时候优先取缓存没有缓存的时候会去执行方法。下面再来说一下三个Attritebute的一些参数。首先是三个通用配置CacheKeyPrefix指定生成缓存键的前缀正常情况下是用在修改和删除的缓存上CacheProviderName可以指定特殊的provider名字IsHightAvailability缓存相关操作出现异常时是否还能继续执行业务方法EasyCachingAble和EasyCachingPut还有一个同名和配置。EasyCachingEvict有两个特殊的配置。IsAll这个要搭配CacheKeyPrefix来用就是删除这个前缀的所有keyIsBefore在业务方法执行之前删除缓存还是执行之后支持Diagnostics为了方便接入第三方的APM提供了Diagnostics的支持便于实现追踪。下图是我司接入Jaeger的一个案例。二级缓存二级缓存多级缓存其实在缓存的小世界中还算是一个比较重要的东西一个最为头疼的问题就是不同级的缓存如何做到近似实时的同步。在EasyCaching中二级缓存的实现逻辑大致就是下面的这张图。如果某个服务器上面的本地缓存被修改了就会通过缓存总线去通知其他服务器把对应的本地缓存移除掉。下面来看一个简单的使用例子。首先是添加nuget包。dotnet add package EasyCaching.InMemorydotnet add package EasyCaching.Redisdotnet add package EasyCaching.HybridCachedotnet add package EasyCaching.Bus.Redis其次是添加配置。services.AddEasyCaching(option { option.UseInMemory(m1); option.UseRedis(config { config.DBConfig.Endpoints.Add(new Core.Configurations.ServerEndPoint(127.0.0.1, 6379)); config.DBConfig.Database 5; }, myredis); option.UseHybrid(config { config.EnableLogging false; config.TopicName test_topic; config.LocalCacheProviderName m1; config.DistributedCacheProviderName myredis; }); option.WithRedisBus(config { config.Endpoints.Add(new Core.Configurations.ServerEndPoint(127.0.0.1, 6379)); config.Database 6; });});最后就是使用了。[Route(api/[controller])] public class ValuesController : Controller { private readonly IHybridCachingProvider _provider; public ValuesController(IHybridCachingProvider provider) { this._provider provider; } [HttpGet] [Route()] public string Get() { _provider.Set(cacheKey, val, TimeSpan.FromSeconds(30));return $hybrid; } } 如果觉得不清楚可以再看看这个完整的例子EasyCachingHybridDemo。Redis的特殊Provider大家都知道redis支持多种数据结构还有一些原子递增递减的操作等等。为了支持这些操作EasyCaching提供了一个独立的接口IRedisCachingProvider。这个接口目前也只支持了百分之六七十常用的一些操作还有一些可能用的少的就没加进去。同样的这个接口也是支持多实例的也可以通过IEasyCachingProviderFactory来获取不同的provider实例。在注入的时候不需要额外的操作和添加Redis是一样的。不同的是在使用的时候不再是用IEasyCachingProvider而是要用IRedisCachingProvider。下面是一个简单的使用例子。[Route(api/mredis)]public class MultiRedisController : Controller{private readonly IRedisCachingProvider _redis1;private readonly IRedisCachingProvider _redis2;public MultiRedisController(IEasyCachingProviderFactory factory){this._redis1 factory.GetRedisProvider(redis1);this._redis2 factory.GetRedisProvider(redis2); } [HttpGet]public string Get(){ _redis1.StringSet(keyredis1, val);var res1 _redis1.StringGet(keyredis1);var res2 _redis2.StringGet(keyredis1);return $redis1 cached value: {res1}, redis2 cached value : {res2}; } }除了这些基础功能还有一些扩展性的功能在这里要非常感谢yrinleung他把EasyCaching和WebApiClientCAP等项目结合起来了。感兴趣的可以看看这个项目EasyCaching.Extensions。写在最后以上就是EasyCaching目前支持的一些功能特性如果大家在使用的过程中有遇到问题的话希望可以积极的反馈帮助EasyCaching变得越来越好。如果您对这个项目有兴趣可以在Github上点个Star也可以加入我们一起进行开发和维护。前段时间开了一个Issue用来记录正在使用EasyCaching的相关用户和案例如果您正在使用EasyCaching并且不介意透露您的相关信息可以在这个Issue上面回复。原文地址https://www.cnblogs.com/catcher1994/p/10806607.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://wiki.neutronadmin.com/news/299789/

相关文章:

  • 怎样讲卖灯的网站做的好安徽360优化
  • 上海网站设计哪家好html网页游戏制作
  • 用自己主机做网站视频网站没有icp备案怎么访问
  • 没有网站可以做百度推广吗greentree wordpress
  • 传媒网站建设公司太原关键词优化平台
  • 网网站基础建设优化知识h5做网站
  • 羊毛网站建设视频界面设计与制作就业方向
  • 什么网站做热能表好网络营销网站的功能
  • 司法政务网站群建设东凤网站
  • 怎么看网站是否被k过wordpress转服务器
  • 怀柔网站整站优化公司注册商标名字推荐
  • 贺州市八步区乡镇建设局网站扮家家室内设计网
  • php 小企业网站 cms军事新闻最新消息军事新闻
  • 涿州网站网站建设苏州企业网站建设开发
  • 购物网站建设 属于信息系统管理与设计么网站维护中是怎么回事
  • 做电影网站服务器需求海外网站购物平台有哪些
  • 做网站学的什么专业网站备案需要关闭网站吗
  • 分析网站设计对网站搜索引擎友好性的影响错题网站开发
  • 淘宝客网站html上海电商网站设计
  • 茶叶网站建站公司备案证查询网站查询
  • 做娱乐网站的意义目的建筑工程网上办事大厅登录
  • 网站建站备案专业seo网站优化公司
  • 网站后台培训方案江苏省建设厅官方网站公式公告
  • 哈尔滨网站建设吧公司创建流程
  • 大连网站建站WordPress搜索功能增强
  • 网站一般字体教育局网站群建设方案
  • 百度网站官网网址尚品中国网站
  • 大众点评网站团购怎么做太原互联网推广公司
  • 怎样做网站外链深圳网站设计九曲
  • 申请友情链接wordpress 优化''