大话缓存

一. 前言

  说起缓存,业内有句话,架构师有一半以上的时间是在和缓存打交道。那么缓存到底是什么呢?又有什么作用呢?该系列将揭开缓存神秘的面纱,从零开始,由浅入深,细究各类缓存。

  缓存我个人理解,是利用空间换时间最好的体现,将一些耗时操作(复杂的数据库查询、文件内容的读取)、不经常改变的数据(比如商城的商品大类别),放到缓存(内存)里,提高了访问速度。比如我们很常见的一个例子,某某知名网站的某个页面,可能再特殊情况下,该页面1分钟会有100w次访问量,那就意味着访问了100w次数据库,我的天!忽略服务器端是否会挂掉的问题,假设不挂掉,那么也是需要强大的结构来支持(什么分布式部署、数据主从配置之类),成本巨大;这时如果第一个人访问的时候,我把该页面缓存起来,那么后面的999999次访问都是从缓存中获取,实际上相当于1分钟只访问了一次数据库,性能差别可想而知。

  从我上面举得例子中,我们很容易能看出来,缓存最大的优势:节约时间、提高性能

     那么你可能会问,缓存有这么大的好处,我们是不是数据都可以放到缓存里,来提高性能呢?答案是肯定的:不能!万物都有两面性,有利必有弊,细心的人,会从从上面的例子中发现,我将商品的类别缓存起来,但是商品的类别是肯定会更新的,更新了怎么办? 这时候引出一个词语“缓存过期时间”,意味着我们可以设置缓存的过期时间,一旦缓存过期,将重新获取数据,进行更新。你可能还会问,缓存过期时间设置为多少合适呢?如果缓存还没过期,商品类别的信息已经更新了,那么怎么办呢? 解决这个问题,需要引出一个新的词语“缓存依赖”,缓存可以依赖:文件、文件夹、数据库,依赖项一旦发生变化了,缓存立即更新

    下面我们总结一下缓存好处和弊端:

     好处:访问速度快,提高了并发访问返回速率的时间。

     弊端:数据放到内存里,失去了及时性。(可以通过缓存依赖解决)

     我们什么情况下适合用缓存呢?

     (1). 查询多,修改少的数据。

     (2). 信息要求不是很及时,允许适当的延迟。

     (3). 复杂的计算、远程接口、长时间的查询。

     (4). 高并发,但如果数据量太大,高并发太高,单纯的服务器数据缓存是满足不了的,需要引入分布式缓存(NoSql)。

二. 前端缓存(本地缓存)

  读了“前言”,你可能对缓存的概念有了一定了解,但是细心的人可能会更疑惑,因为他在生活中发现了这样几个现象,在手机上装了一个应用,比如QQ,初次安装时可能100M左右,但随着使用,一个月后,发现,我的天,竟然1G了,在QQ的设置页面里,有个选项,叫“清空缓存数据”,如下图:

  

  点击进行清空后,发现QQ所占的空间又变小了,这里也称作缓存,但是你可能会发现,在前言中提到,缓存是存在服务器内存中的,那么为什么本地的空间后变大呢? 这里所说缓存到底是不是缓存呢?

      首先,答案的是肯定的:这里的缓存是缓存,但此缓存非彼缓存,前言中提到的缓存是指“服务器端数据缓存”,这里所说的缓存是指“本地缓存”,那么本地缓存到底是存在哪里的呢?以什么形式存储的?这里要留一个悬念,在后续章节会为我们揭晓。

      在这里,我们揭晓几个别的概念。

      本地缓存的存储方式有哪几种?

      (1). Cookies

      (2). SessionStorage 

      (3). LocalStorage

      (4). WebSQL

      (5). IndexedDB

   什么情况下要用本地存储呢?

      (1). APP和网站图片缓存

      (2). 自动登录功能的实现

      (3). 记住密码的实现

      (4). APP或网站页面传值或标记问题。

三. 分布式缓存(NoSql)

      分布式缓存属于服务器端缓存的范畴,NoSQL天生就是为“高并发”而诞生,当数据量非常大,且并发请求非常高,单纯的数据缓存已经不能满足我们的要求了,这是需要引入NoSQL,常见的NoSQL有:Memcache和Redis。

     区分NoSQL和分布式缓存。

     NoSQL:指的是非关系型数据库,可以只把他部署到一台服务器上,也可以把它架设到多台服务器上,从而构成分布式架构的缓存。

     分布式缓存:是指把一种缓存技术同时部署到多台服务器上,从而来减轻服务器压力。

     误区1:NoSQL并不等于分布式 缓存,只有将NoSQL技术部署到多台服务器上,才是分布式架构的缓存,由于NoSQL天生支持分布式,所以通常将分布式缓存和NoSQL一起来说。

     误区2:NoSQL是为高并发而诞生的。 但是分布式架构的缓存和普通的服务器数据缓存相比,它并不是用来提高性能的,相反他会比本地的缓存慢一些。分布式缓存是为了减轻一台服务器压力而产生一种架构模式,所以如果一台服务器足够承载压力的话,完全没有必要部署成分布式的。

四. 系列章节  

  下面将分章节来介绍数据缓存、页面缓存、本地缓存、分布式缓存,同时讲解缓存使用过程中会遇到的问题以及如果管理缓存(单例?工厂?IOC?)、服务器端框架封装(依赖倒置、IOC)、模拟多线程测试、JS写法的演变(最终形成面向对象的前端缓存框架),如下图:

  

        

          章节介绍

第一节:从程序集的角度分析System.Web.Caching.Cache,并完成基本封装。

第二节:从程序集的角度分析MemoryCache,并完成基本封装。

第三节:工厂+反射+配置文件(手写IOC)对缓存进行管理。

第四节:单例模式对缓存进行管理。

第五节:测试缓存的基本用法。

第六节:测试缓存单线程和多线程安全问题。

第七节:扩展Session和MVC中特有的ViewBag、ViewData、TempData进行页面间的数据传递。

第八节:输出缓存的特性配置、配置文件统一管理。

第九节:缓存依赖文件、文件夹、多文件。

第十节:缓存依赖数据库。

第十一节:缓存自动更新解决方案。

第十二节:面向对象的方式进行JS框架封装,介绍JS写法的演变

第十三节:Cookies

第十四节:SessionStorage

第十五节:LocalStorage

第十六节:前端数据库-WebSQL

第十七节:前端的NoSQL-IndexedDB

第十八节:NoSQL-Memcached

第十九节:NoSQL-Redis

 

 

 

原文地址:https://www.cnblogs.com/yaopengfei/p/7220716.html