【微服务】07-缓存

这篇具有很好参考价值的文章主要介绍了【微服务】07-缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为不同的场景设计合适的缓存策略

1. 缓存是什么

  • 缓存是计算结果的“临时”存储和重复使用
  • 缓存本质是用“空间”换取“时间”

2. 缓存的场景

  • 计算结果,如:反射对象缓存
  • 请求结果,如:DNS缓存
  • 临时共享数据,如:会话存储
  • 热点访问内容页,如:商品详情
  • 热点变更逻辑数据,如:秒杀的库存数

3. 缓存的策略

  • 越接近最终的输出结果(靠前),效果越好
  • 缓存命中率越高越好,命中率低就意味着“空间”浪费

4. 缓存位置

  • 浏览器中
  • 反向代理服务器中(负载均衡)
  • 应用进程内存中
  • 分布式存储系统中

5. 缓存实现的要点

  • 缓存Key生成策略,表示缓存数据的范围、业务含义
  • 缓存失效策略,如:过期事件机制、主动刷新机制
  • 缓存更新策略,表示更新缓存数据的时机

6. 注意问题

  • 缓存失效,导致数据不一致
  • 缓存穿透,查询无数据时,导致缓存不生效,查询都落在数据库
  • 缓存击穿,缓存失效瞬间,大量请求访问到数据库
  • 缓存雪崩,大量缓存同一时间失效,导致数据库压力

缓存穿透,一般查询结果为null时,在缓存里面强制返回一个默认值,避免缓存穿透的产生

缓存击穿,一般建议做法是使用二级缓存的策略,当一级缓存失效时,允许一个请求去落到数据库上面去更新缓存数据,重置缓存有效时间,其他请求仍然是通过缓存去响应

缓存雪崩,建议缓存失效时间的策略定义应当相对均匀的,使得数据库接收到的请求相对均匀,不会出现缓存key会同一时间有大量的失效情况

7. 使用的组件

  • ResponseCache
  • Microsoft.Extensions.Cacheing.Memory.IMemoryCache
  • Microsoft.Extensions.Caching.Distributed.IDistributedCache ⇒ 内置分布式缓存
  • EasyCaching

8. 内存缓存和分布式缓存区别

  • 内存缓存可以存储任意的对象
  • 分布式缓存的对象需要支持序列化
  • 分布式缓存远程请求可能失败,内存缓存不会
// Startup
public void ConfigureServices(IServiceCollection services)
{
	...
	// 内存缓存
	services.AddMemoryCache();
	
	// Redis缓存
	services.AddStackExchangeRedisCache(options =>
    {
        Configuration.GetSection("RedisCache").Bind(options);
    });
    
    // ResponseCaching
    services.AddResponseCaching();
    
    // EasyCaching
    services.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 IDistributedCache
       var 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));


       #endregion

       return 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和失效更新策略,需要关注缓存失效、缓存击穿、缓存穿透、缓存雪崩这些问题。文章来源地址https://www.toymoban.com/news/detail-681367.html

到了这里,关于【微服务】07-缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nacos实现Java和.NetCore的服务注册和调用

    用nacos作为服务注册中心,如何注册.NetCore服务,如何在Java中调用.NetCore服务呢?可以分为下面几个步骤:   0.运行nacos   1.开发.net core服务,然后调用nacos提供的.net core sdk注册服务。   2.开发Java服务,然后注册服务。   3.用RestTemplate调用.net core服务。   4.用OpenFeign调用服务

    2024年01月17日
    浏览(34)
  • 基于.NetCore开发博客项目 StarBlog - (27) 使用JWT保护接口

    这是StarBlog系列在2023年的第二篇更新😂 这几个月都在忙,更新变得很不勤快,但是拖着不更新我的心里更慌,很久没写,要开头就变得很难😑 说回正题,之前的文章里,我们已经把博客关键的接口都开发完成了,但还少了一个最关键的「认证授权」,少了这东西,网站就跟

    2024年02月02日
    浏览(63)
  • 项目发布部署:如何发布.NETCore项目到IIS服务器?

    前言:本文将详细介绍如何发布.NET Core项目到IIS服务器。首先,第一步需要安装IIS,介绍了在本地电脑和服务器中进行安装。然后需要安装SDK和运行时才能发布.NETCore项目。其次介绍了如何发布.NETCore项目和Vue项目,并配置IIS。最后介绍了如何将项目部署到Service服务中。 (

    2024年02月13日
    浏览(42)
  • 银河麒麟OS C# .netcore桌面应用开发环境搭建笔记

    一、安装.netcore 参考在 Ubuntu 上安装 .NET - .NET | Microsoft Docs。 1、x64平台:可直接用包管理安装。(仅在 x64 体系结构上支持包管理器安装。) 2、arm等其他平台:通过一些其他方式(例如使用 Snap、安装程序脚本或通过手动二进制安装)安装 .NET。 a)手动安装: 先创建并进入

    2024年02月07日
    浏览(30)
  • .NetCore gRpc 客户端与服务端的单工通信Demo

    方式一 使用vs 2022(也可以是其他版本)创建一个grpc的服务,如下这样 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uipEG9Xu-1687172462785)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20230619183828284.png)] 简单方便,创建项目后的目录结构如下图

    2024年02月09日
    浏览(42)
  • .Net 6/NetCore3.1 Vue Element Uniapp前后端分离低代码快速开发框架

    这是一个能提高开发效率的开发框架,全自动生成PC与移动端(uniapp)代码;支持移动ios/android/h5/微信小程序。 1、前后端分离项目 2、纯后端项目 3、移动端开发uni-app(IOS、Android、H5、微信小程序) 4、内容管理系统 1、代码生成器 2、一对一与一对多代码生成 3、全自动导入导出

    2024年02月10日
    浏览(29)
  • 【NetCore】09-中间件

    1.1 中间件工作原理 1.2 中间件核心对象 IApplicationBuilder RequestDelegate IApplicationBuilder可以通过委托方式注册中间件,委托的入参也是委托,这就可以将这些委托注册成一个链,如上图所示;最终会调用Builder方法返回一个委托,这个委托就是把所有的中间件串起来后合并成的一个

    2024年02月12日
    浏览(37)
  • .netcore发布独立版部署

    .NetCore 在发布独立版时会打包独立环境,就算服务没有安装环境也能运行,这就是.NetCore跨平台的特性之一。 按照微软的传统配套,c#开发的项目一般都是发布打包程序部署在iis,但是.netcore 跨平台的,就是说当发布独立版时可以跨平台部署。 在发布独立版是,会把项目中的

    2024年02月11日
    浏览(38)
  • 杨中科 .netcore 依赖注入

    生活中的“控制反转”:自己发电和用电网的电。 依赖注入(Dependency Injection,Dl)是控制反转:(Inversion of Control,l0c)思想的实现方式。 依赖注入简化模块的组装过程,降低模块之间的耦合度 缺点是? 你需要对一切流程很清楚。 \\\'怎样创建XX对象”----“我要XX对象 两种实现方式:

    2024年02月21日
    浏览(20)
  • .NetCore调用Soap接口

    添加服务引用的方式无法满足我请求Soap接口,所以写了个Soap帮助类,使用HttpClient的方式请求接口。 提示:以下是本篇文章正文内容,下面案例可供参考 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 可选的

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包