应用场景介绍

一般的小型系统使用服务器内存缓存就已经可以了。但是对于大型系统,web服务器可能有多台,这时候如果每个web服务器都使用内存缓存,同样还是会造成数据库服务器压力大的问题,因为每台web服务器都会去访问数据库服务器,然后做缓存。

针对上面的问题,引入了分布式缓存服务器,把多台web服务器获取到的数据都存在一台缓存服务器上,多台web服务器共享一台缓存服务器,这样可以减少web服务器对数据库的访问数量。

分布式缓存服务器说明:

1.常用的分布式缓存服务器用Redis、Memcached等。

2..Net Core中提供了统一的分布式缓存服务器的操作接口IDistributedCache,用法和内存缓存类似。

3.分布式缓存和内存缓存的区别:内存缓存的值可以为任意类型,分布式缓存值类型为byte[]和string,如果要存入其他类型的值,需要进行类型转换。

4.Memcached是缓存专用,性能非常高,但是集群、高可用等方面比较弱,而且有“缓存键的最大长度为250字节”等限制。可以安装EnyimMemcachedCore这个第三方的NuGet包。

5.Redis不局限于缓存,Redis做缓存服务器比Memcached性能稍差,但是Redis的高可用、集群等方面非常强大,适合在数据量大、高可用性等场合使用。

Redis使用示例

下面以ASP.NET Core WebApi项目为例,演示内存缓存的使用方法。

1.创建ASP.NET Core WebApi项目

2.项目添加nuget包的引用

Microsoft.Extensions.Caching.StackExchangeRedis

3.在Startup.cs中对Redis服务注册到依赖注入容器中

4. 创建控制器CacheTestController

在构造方法中,对IDistributedCache服务进行注入

控制器中新建action:RedisCacheTest

控制器完整代码:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Threading.Tasks;namespace NetCoreWebApi.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class CacheTestController : ControllerBase{private readonly IDistributedCache _distributed;//redis缓存public CacheTestController(IDistributedCache distributed){_distributed = distributed;}/// <summary>/// 有缓存功能的获取数据方法/// </summary>/// <param name="bookId"></param>/// <returns></returns>[HttpGet]public async Task<IActionResult> RedisCacheTest(int bookId){Console.WriteLine();Console.WriteLine($"RedisCacheTest,bookId={bookId}");var result = await _distributed.GetStringAsync("Book" + bookId);if (string.IsNullOrEmpty(result)){JsonResult bookData = DataClass.GetData(bookId);await _distributed.SetStringAsync("Book" + bookId, bookData.Value.ToString());return new JsonResult(bookData);}else{Console.WriteLine("把数据返回");return new JsonResult(result);}}}
}

DataClass类,模拟从数据库查询数据的操作:

using Microsoft.AspNetCore.Mvc;
using System;namespace NetCoreWebApi
{public class DataClass{public static JsonResult GetData(int bookId){Console.WriteLine("数据库被访问");//模拟从数据库查询数据return new JsonResult(new{bookId = bookId,bookName = BookName(bookId)});}public static string BookName(int bookId){switch (bookId){case 1:return "书籍1";case 2:return "书籍2";case 3:return "书籍3";default:return "没有查询到书籍名称";}}}
}

5.在页面对webapi接口进行调用

可以看到ID为1的值已经被缓存到redis中,接着再访问ID为1的记录:

这次数据直接返回了,没有查询数据库,说明缓存功能生效了。

Redis缓存帮助类库

杨中科老师提供的帮助类库,解决缓存穿透、缓存雪崩等问题,同时支持自动进行数据类型转换。

不过要在.net6 的版本中才能使用。

包的名称为:Zack.ASPNETCore

缓存学习总结4(分布式缓存)相关推荐

  1. TimesTen 应用层数据库缓存学习:12. 管理缓存环境

    缓存和复制代理的启停和状态查看 cache agent的作用是将监控Oracle中数据的变化,并更新到TimesTen.因此,对于只读和AWT缓存组,cache agent都是必需的. cache a ...

  2. redis分布式缓存php,基于redis分布式缓存实现

    第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景数据结构(Data Structure)需求越来越 ...

  3. 缓存学习中未命中的缓存情况的处理

    this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT)); cache中还是要设置空对象来处 ...

  4. EhCache 分布式缓存/缓存集群

    开发环境: System:Windows JavaEE Server:tomcat5.0.2.8.tomcat6 JavaSDK: jdk6+ IDE:eclipse.MyEclipse 6.6 开发 ...

  5. 淘宝架构师为你揭秘2017双十一分布式缓存服务Tair

    1 问题背景 分布式缓存一般被定义为一个数据集合,它将数据分布(或分区)于任意数目的集群节点上.集群中的一个具体节点负责缓存中的一部分数据,整体对外提供统一的访问接口[1].分布式缓存一般基于冗余备份 ...

  6. 缓存为王:老码农眼中的分布式缓存

    本文来自作者 老曹 在 GitChat 上分享 「缓存为王:老码农眼中的分布式缓存」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 世界是相似的,在商业的世界中,有一句经典语录叫 &quo ...

  7. 让国内顶尖程序员低头的这份面试题之java缓存总结,从单机缓存到分布式缓存架构

    1.缓存定义 高速数据存储层,提高程序性能 2.为什么要用缓存(读多写少,高并发) 1.提高读取吞吐量 2.提升应用程序性能 3.降低数据库成本 4.减少后端负载 5.消除数据库热点 6.可预测的性能 ...

  8. 分布式缓存:爱我你怕了吗?

    背景 俗话说得好,工欲善其事,必先利其器,有了好的工具肯定得知道如何用好这些工具,本篇将介绍如何利用好缓存. 1.确认是否需要缓存 在使用缓存之前,需要确认你的项目是否真的需要缓存.使用缓存会引入的一 ...

  9. [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现...

    原文:[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现 一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证 ...

  10. 如何在 ASP.Net Core 使用 分布式缓存

    ASP.Net Core 提供了多种类型的缓存,除了内存缓存和响应缓存之外,还提供了对 分布式缓存 的支持.在之前的一篇文章中,我讨论了 ASP.Net Core 的内存缓存.在本文中,我们将讨论如何 ...

最新文章

  1. keepalived主要模块
  2. 揭秘数据技术的前世今生,Techo TVP 开发者大会来了!
  3. 考研计算机专业复试,计算机专业考研复试准备
  4. 后端开发除了编码还要做什么_每个开发人员都应掌握的基本技能(除了编码)
  5. Linux学习笔记:rpm程序包管理
  6. 定义一个Employee类并排序(完整版本)
  7. 长短期记忆网络_思维导图:长短期记忆模型
  8. Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist)
  9. 瑞利衰落信道仿真---Clarke Jakes Zheng模型(含matlab程序)
  10. 只用最适合的!全面对比主流 .NET 报表控件
  11. java正态分布的概率密度函数_正态分布概率密度函数
  12. SPSS实现单因素方差分析
  13. 惠普计算机如何用u盘引导启动不了系统安装系统,惠普笔记本进BIOS设置U盘启动教程...
  14. 第三只眼网络监控软件简单分析,试用及清除
  15. python心形曲线和马鞍面_心形线与马鞍面
  16. JNDI注入学习(看不懂直接喷,别忍着!)
  17. 保险私有云 IaaS 资源池选型与演进之路 | SmartX 客户实践
  18. 区块链快速入门(八)——以太坊
  19. 论文中如何写mysql的介绍_论文中数据库概念设计怎么写
  20. CentOS中使用VeraCrypt:安装及创建整个加密硬盘

热门文章

  1. 针孔相机模型和相机内参矩阵K
  2. 动态规划-背包问题(易懂)
  3. python 打开网页方法_python打开网页的方法
  4. 打开一个vb工程,弹出“visual sourcesafe login“对话框
  5. formatter格式说明
  6. Python练习数据结构笔记
  7. Python class objects confusing
  8. 企业邮箱邮件的服务器地址是什么?企业邮箱服务器出错怎么办?
  9. java邮件客户端_java实现POP3邮件客户端
  10. CRM上线之路 走上了CRM实施顾问-第100天上班 -第21周