前言
缓存这种能够提升指令和数据读取速度的特性,随着本地计算机系统向分布式系统的扩展,在分布式计算领域中得到了广泛的应用,称为分布式缓存。分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。
既然是缓存,那么本质还是存储一些数据,与本地缓存一样,当请求进来时,先去缓存中查找,缓存中存在直接返回缓存中的数据,否则进入数据库查找。所谓分布式缓存,即在分布式环境下的缓存,所有节点都能共享缓存,简单的说就是把本地缓存的缓存内存移到一个共享的地方,就像数据库一样,不管哪个客户端都能访问到。
先来了解下分布式缓存,常用的分布式缓存有Redis、MongoDB、Memcached、HBase。。。它们都是NoSq(Not Only SQL)数据库,NoSql是指非关系型数据库,我们常用的SQLserver、MySQL。。。都是关系型数据库,这些数据库用来存储重要信息,对于日常使用没问题,当面对大规模高并发的时候就有些无力,这个时候NoSq可以更好的应对。
实现
本篇中我们使用Redis实现分布式缓存,首先要准备好环境,先去安装好redis(Redis安装),安装完成后就要准备实现了。
环境:.net core 3.0
首先NuGet一下Redis,常用的有ServiceStack.Redis、StackExchange.Redis;过去ServiceStack.Redi最具有名望,但是早已经沦为商业化,使用需要为信仰充值,否则只能被每小时6000次访问量安排的明明白白;StackExchange.Redis后来居上,虽然能用但是据说线上Timeout错误坑人,StackExchange.Redis的2.0版本解决了。我们使用CSRedis~~
NuGet 命令或者搜索下载一下:
nuget Install-Package CSRedisCore
我们继续用上一篇的MVC项目,在HomeController下Privacy()中写一些简单代码,为体现缓存还是记录下时间。。。至于redis默认没密码就不用password,连接字符串自行配置
//连接redis
var rds = new CSRedis.CSRedisClient("127.0.0.1:6379,password=123,defaultDatabase=13,poolsize=50,ssl=false,writeBuffer=10240,prefix=key前缀");
public IActionResult Privacy() { var redis = new CSRedis.CSRedisClient("127.0.0.1:6379,password=123456"); string date = redis.Get("date"); if (date == null) { date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"); redis.SetNx("date", date); } ViewBag.date = date; return View(); }
效果
然后启动看看情况
缓存时间是后台发送到前端的ViewBag.date,当前时间是前端获取的时间@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") 一直刷新可以看到缓存时间不会变动,当前时间一直在改变,这说明后台获取的时间被存在了redis中了,每次获取都是从redis中读取的,并没有重新计算。
现在多启动几个实例
可以看到不同实例中获取的缓存一致,这是因为缓存存在于redis中,他们都能访问到,不同于本地缓存只存在于当前进程中。这样就实现了分布式的缓存。
总结
redis就相当于我们经常使用的数据库,所有客户端都能访问到,那为啥不直接用常用的数据库做缓存?当然是可以的,但是不会这么做,因为redis是树状结构、基于内存、单线程,所以读写更快,这使得它作为一个数据临时存储点,表现的非常出色,可以很好得解决高并发;单机redis来说,能够承载的QPS大概在上万到几万不等,对于缓存来说,一般都是用来支撑读高并发;