分布式缓存

前言  

  缓存这种能够提升指令和数据读取速度的特性,随着本地计算机系统向分布式系统的扩展,在分布式计算领域中得到了广泛的应用,称为分布式缓存。分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。

  既然是缓存,那么本质还是存储一些数据,与本地缓存一样,当请求进来时,先去缓存中查找,缓存中存在直接返回缓存中的数据,否则进入数据库查找。所谓分布式缓存,即在分布式环境下的缓存,所有节点都能共享缓存,简单的说就是把本地缓存的缓存内存移到一个共享的地方,就像数据库一样,不管哪个客户端都能访问到。

  先来了解下分布式缓存,常用的分布式缓存有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();
}
Privacy

效果

  然后启动看看情况

  

  缓存时间是后台发送到前端的ViewBag.date,当前时间是前端获取的时间@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") 一直刷新可以看到缓存时间不会变动,当前时间一直在改变,这说明后台获取的时间被存在了redis中了,每次获取都是从redis中读取的,并没有重新计算。

  现在多启动几个实例

  

  可以看到不同实例中获取的缓存一致,这是因为缓存存在于redis中,他们都能访问到,不同于本地缓存只存在于当前进程中。这样就实现了分布式的缓存。

  

总结

  redis就相当于我们经常使用的数据库,所有客户端都能访问到,那为啥不直接用常用的数据库做缓存?当然是可以的,但是不会这么做,因为redis是树状结构、基于内存、单线程,所以读写更快,这使得它作为一个数据临时存储点,表现的非常出色,可以很好得解决高并发;单机redis来说,能够承载的QPS大概在上万到几万不等,对于缓存来说,一般都是用来支撑读高并发;

原文地址:https://www.cnblogs.com/zousc/p/12890420.html