zoukankan      html  css  js  c++  java
  • 分布式缓存

    前言  

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

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

      先来了解下分布式缓存,常用的分布式缓存有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大概在上万到几万不等,对于缓存来说,一般都是用来支撑读高并发;

  • 相关阅读:
    Java自学-类和对象 引用
    Java自学-数组 Arrays
    Java自学-数组 二维数组
    Java自学-数组 复制数组
    Java自学-数组 增强型for循环
    IDEA 创建普通的maven+java Project
    git -- 项目开发最常用操作记录
    操作系统-Windows操作系统的线程调度了解这些
    操作系统-CPU调度
    操作系统-线程引入
  • 原文地址:https://www.cnblogs.com/zousc/p/12890420.html
Copyright © 2011-2022 走看看