分布式缓存

前言  

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

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

  先来了解下分布式缓存,常用的分布式缓存有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 命令或者搜索下载一下:

1
nuget Install-Package CSRedisCore

 

  我们继续用上一篇的MVC项目,在HomeController下Privacy()中写一些简单代码,为体现缓存还是记录下时间。。。至于redis默认没密码就不用password,连接字符串自行配置

1
//连接redis<br>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大概在上万到几万不等,对于缓存来说,一般都是用来支撑读高并发;

 

posted @   贰拾~  阅读(834)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示