网站seo竞争分析工具,建立自己的网页,沈阳网页制作设计,软件设计专业学什么文章目录 为不同的场景设计合适的缓存策略1. 缓存是什么2. 缓存的场景3. 缓存的策略4. 缓存位置5. 缓存实现的要点6. 注意问题7. 使用的组件8. 内存缓存和分布式缓存区别 总结 为不同的场景设计合适的缓存策略
1. 缓存是什么
缓存是计算结果的“临时”存储和重复使用缓存本质… 文章目录 为不同的场景设计合适的缓存策略1. 缓存是什么2. 缓存的场景3. 缓存的策略4. 缓存位置5. 缓存实现的要点6. 注意问题7. 使用的组件8. 内存缓存和分布式缓存区别 总结 为不同的场景设计合适的缓存策略
1. 缓存是什么
缓存是计算结果的“临时”存储和重复使用缓存本质是用“空间”换取“时间”
2. 缓存的场景
计算结果如反射对象缓存请求结果如DNS缓存临时共享数据如会话存储热点访问内容页如商品详情热点变更逻辑数据如秒杀的库存数
3. 缓存的策略
越接近最终的输出结果靠前效果越好缓存命中率越高越好命中率低就意味着“空间”浪费
4. 缓存位置
浏览器中反向代理服务器中负载均衡应用进程内存中分布式存储系统中
5. 缓存实现的要点
缓存Key生成策略表示缓存数据的范围、业务含义缓存失效策略如过期事件机制、主动刷新机制缓存更新策略表示更新缓存数据的时机
6. 注意问题
缓存失效导致数据不一致缓存穿透查询无数据时导致缓存不生效查询都落在数据库缓存击穿缓存失效瞬间大量请求访问到数据库缓存雪崩大量缓存同一时间失效导致数据库压力 缓存穿透一般查询结果为null时在缓存里面强制返回一个默认值避免缓存穿透的产生 缓存击穿一般建议做法是使用二级缓存的策略当一级缓存失效时允许一个请求去落到数据库上面去更新缓存数据重置缓存有效时间其他请求仍然是通过缓存去响应 缓存雪崩建议缓存失效时间的策略定义应当相对均匀的使得数据库接收到的请求相对均匀不会出现缓存key会同一时间有大量的失效情况 7. 使用的组件
ResponseCacheMicrosoft.Extensions.Cacheing.Memory.IMemoryCacheMicrosoft.Extensions.Caching.Distributed.IDistributedCache ⇒ 内置分布式缓存EasyCaching
8. 内存缓存和分布式缓存区别
内存缓存可以存储任意的对象分布式缓存的对象需要支持序列化分布式缓存远程请求可能失败内存缓存不会
// Startup
public void ConfigureServices(IServiceCollection services)
{...// 内存缓存services.AddMemoryCache();// Redis缓存services.AddStackExchangeRedisCache(options {Configuration.GetSection(RedisCache).Bind(options);});// ResponseCachingservices.AddResponseCaching();// EasyCachingservices.AddEasyCaching(options {options.UseRedis(Configuration, name: easycaching);});
}//Configure
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{...app.UseRouting();app.UseResponseCaching();
}// 控制器
// ResponseCache
// VaryByQueryKeys表示缓存key生成策略基于query值不同值缓存为不同cache[ResponseCache(Duration 6000, VaryByQueryKeys new string[] { query })]public IActionResult GetAbc([FromQuery]string query){return Content(abc DateTime.Now);} // EasyCaching / IMemoryCache
public IActionResult GetDis([FromServices] IDistributedCache cache, [FromServices]IMemoryCache memoryCache, [FromServices]IEasyCachingProvider easyCaching, [FromQuery]string query)
{#region IDistributedCachevar key $GetDis-{query ?? };var time cache.GetString(key);if (string.IsNullOrEmpty(time)) //此处需要考虑并发情形{var option new DistributedCacheEntryOptions();time DateTime.Now.ToString();cache.SetString(key, time, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow TimeSpan.FromSeconds(600) });}#endregion#region IEasyCachingProvider//var key $GetDis-{query ?? };//var time easyCaching.Get(key, () DateTime.Now.ToString(), TimeSpan.FromSeconds(600));#endregionreturn Content(abc time);}// Redis,Easycaching缓存配置
{...,RedisCache: {Configuration: localhost:6379,InstanceName: GoodSite},easycaching: {redis: {MaxRdSecond: 120,EnableLogging: false,LockMs: 5000,SleepMs: 300,dbconfig: {Password: null,IsSsl: false,SslHost: null,ConnectionTimeout: 5000,AllowAdmin: true,Endpoints: [{Host: localhost,Port: 6379}],Database: 0}}}
}
总结 缓存的设计重点在于设计缓存的key和失效更新策略需要关注缓存失效、缓存击穿、缓存穿透、缓存雪崩这些问题。