缓存学习总结4(分布式缓存)
应用场景介绍
一般的小型系统使用服务器内存缓存就已经可以了。但是对于大型系统,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(分布式缓存)相关推荐
- TimesTen 应用层数据库缓存学习:12. 管理缓存环境
缓存和复制代理的启停和状态查看 cache agent的作用是将监控Oracle中数据的变化,并更新到TimesTen.因此,对于只读和AWT缓存组,cache agent都是必需的. cache a ...
- redis分布式缓存php,基于redis分布式缓存实现
第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景数据结构(Data Structure)需求越来越 ...
- 缓存学习中未命中的缓存情况的处理
this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT)); cache中还是要设置空对象来处 ...
- EhCache 分布式缓存/缓存集群
开发环境: System:Windows JavaEE Server:tomcat5.0.2.8.tomcat6 JavaSDK: jdk6+ IDE:eclipse.MyEclipse 6.6 开发 ...
- 淘宝架构师为你揭秘2017双十一分布式缓存服务Tair
1 问题背景 分布式缓存一般被定义为一个数据集合,它将数据分布(或分区)于任意数目的集群节点上.集群中的一个具体节点负责缓存中的一部分数据,整体对外提供统一的访问接口[1].分布式缓存一般基于冗余备份 ...
- 缓存为王:老码农眼中的分布式缓存
本文来自作者 老曹 在 GitChat 上分享 「缓存为王:老码农眼中的分布式缓存」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 世界是相似的,在商业的世界中,有一句经典语录叫 &quo ...
- 让国内顶尖程序员低头的这份面试题之java缓存总结,从单机缓存到分布式缓存架构
1.缓存定义 高速数据存储层,提高程序性能 2.为什么要用缓存(读多写少,高并发) 1.提高读取吞吐量 2.提升应用程序性能 3.降低数据库成本 4.减少后端负载 5.消除数据库热点 6.可预测的性能 ...
- 分布式缓存:爱我你怕了吗?
背景 俗话说得好,工欲善其事,必先利其器,有了好的工具肯定得知道如何用好这些工具,本篇将介绍如何利用好缓存. 1.确认是否需要缓存 在使用缓存之前,需要确认你的项目是否真的需要缓存.使用缓存会引入的一 ...
- [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现...
原文:[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现 一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证 ...
- 如何在 ASP.Net Core 使用 分布式缓存
ASP.Net Core 提供了多种类型的缓存,除了内存缓存和响应缓存之外,还提供了对 分布式缓存 的支持.在之前的一篇文章中,我讨论了 ASP.Net Core 的内存缓存.在本文中,我们将讨论如何 ...
最新文章
- keepalived主要模块
- 揭秘数据技术的前世今生,Techo TVP 开发者大会来了!
- 考研计算机专业复试,计算机专业考研复试准备
- 后端开发除了编码还要做什么_每个开发人员都应掌握的基本技能(除了编码)
- Linux学习笔记:rpm程序包管理
- 定义一个Employee类并排序(完整版本)
- 长短期记忆网络_思维导图:长短期记忆模型
- Redis底部的几种存储结构(sds、dict、ziplist、intset、skiplist)
- 瑞利衰落信道仿真---Clarke Jakes Zheng模型(含matlab程序)
- 只用最适合的!全面对比主流 .NET 报表控件
- java正态分布的概率密度函数_正态分布概率密度函数
- SPSS实现单因素方差分析
- 惠普计算机如何用u盘引导启动不了系统安装系统,惠普笔记本进BIOS设置U盘启动教程...
- 第三只眼网络监控软件简单分析,试用及清除
- python心形曲线和马鞍面_心形线与马鞍面
- JNDI注入学习(看不懂直接喷,别忍着!)
- 保险私有云 IaaS 资源池选型与演进之路 | SmartX 客户实践
- 区块链快速入门(八)——以太坊
- 论文中如何写mysql的介绍_论文中数据库概念设计怎么写
- CentOS中使用VeraCrypt:安装及创建整个加密硬盘
热门文章
- 针孔相机模型和相机内参矩阵K
- 动态规划-背包问题(易懂)
- python 打开网页方法_python打开网页的方法
- 打开一个vb工程,弹出“visual sourcesafe login“对话框
- formatter格式说明
- Python练习数据结构笔记
- Python class objects confusing
- 企业邮箱邮件的服务器地址是什么?企业邮箱服务器出错怎么办?
- java邮件客户端_java实现POP3邮件客户端
- CRM上线之路 走上了CRM实施顾问-第100天上班 -第21周