缓存

1、什么是缓存?
缓存就是用来避免频繁的到主存储器(一般来说可能是数据库,结构化的磁盘文件,远程网络接口,程序接口等等提供数据返回的)获取数据而建立的一个存 取更快的临时存储器(缓存)。一般来说,缓存比主存储器更小(不一定,也可能是存储的数据结构不一样,但是存取速度非常快),但 是存取速度非常快。

2、缓存的作用
缓存一般用来:
.存储频繁访问的数据,如网站访问人数统计等
.临时存储耗时的计算结果
.内存缓存减少磁盘IO

3、缓存类型
(a)在WEB开发中,缓存按照层次划分可以分为:
A、数据库端缓存
B、应用层缓存
C、前端缓存
D、客户端缓存

缓存_第1张图片
(b)按照缓存的数据划分,可以分为:
A、全量缓存;
B、增量缓存;
C、定量缓存

(c)按照缓存策略分,可以分为:

A、单机缓存 
B、简单分布式缓存 
C、使用复制方式的缓存集群 
D、使用散列方式的缓存集群 
E、高性能高、可靠的缓存集群

3.1、数据库端缓存
这个可以用以“空间换时间”来说。比如建一个表来存储另外一个表某个类型的数据的总条数,在每次更新数据的时候同事更新 数据表和统计条数的表。在需要获取某个类型的数据的条数的时候,就不需要select count去查询,直接查询统计表就可以了,这样可以提高查询的速度和数据库的性能。
3.2、应用层缓存
应用层缓存这块跟开发人员关系最大,也是平时经常接触的。
.缓存数据库的查询结果,减少数据的压力。这个在大型网站是必须做的。
.缓存磁盘文件的数据。比如常用的数据可以放到内存,不用每次都去读取磁盘,特别是密集计算的程序,比如中文分词的词库。
.缓存某个耗时的计算操作,比如数据统计。
应用层缓存的架构也可以分几种
.嵌入式,也就是缓存和应用在同一个机器或者服务。比如单机的文件缓存,java中用hashMap来缓存数据等等。这种缓存速度快,没有网络消耗。
.分布式缓存,把缓存的数据独立到不同的机器,通过网络来请求数据,比如常用的memcache就是这一类。
分布式缓存一般可以分为几种:
.按应用切分数据到不同的缓存服务器或者服务,这是一种比较简单和实用的方式。
.按照某种规则(hash,路由等等)把数据存储到不同的缓存服务器
.代理模式,应用在获取数据的时候都由代理透明的处理,缓存机制有代理服务器来处理

页面片段缓存
    针对动态页面里相对静态的部分进行缓存
数据缓存
    在进行页面片段缓存后,系统的压力确实进一步降低了,但同样,随着访问量的增加,系统还是开始变慢,经过查找,可能会发现系 统中存在一些重复获取数据信息的地方,像获取用户信息等,这个时候开始考虑是不是可以将这些数据信息也缓存起来呢,于是将这些数据缓存到本地内存,进行数据缓存。

缓存架构

缓存_第2张图片

缓存_第3张图片

3.2.1、应用层缓存数据分类
(1)对数据分类目的:
• 满足高并发要求;
• 使缓存的内容更加广泛。
(2)按照数据更新频率划分,可分为如下三类:
         a、高频率使用但不频繁更新的业务数据:由于不频繁更新,所以可以在系统启动时,从数据库中加载,放入redis。如果更新,需重启服务,当然这比较笨。更好的做法是在系统启动的同时,启动一个监听通道(如利用redis的pub/sub功能)。当数据发生更新时,往通道publish一个消息,系统接收到消息后,重新从数据库中加载数据,放入缓存。这样系统实现了无中断的更新缓存。
         b、高频率使用更新还算频繁的业务数据:由于有一定频率的更新,所以可以在用户访问时,查询缓存,如果没有值,则从数据库中加载入redis,并设置过期时间。这样,过期时间内的访问就都走缓存了。这种策略也有问题,就是大并发访问时,容易造成数据库瞬间高并发读,如果程序再写的烂点,查询语句再复杂点,那可能造成数据库死锁。更好的做法是单独启动一个定时任务,把定时任务看做是一个用户,他每隔一段时间从数据库中读取数据,然后放入缓存。而前台用户访问的始终是缓存数据,不会触发数据库的相关操作。这个策略也可以用在场景一中。
         c、高频率使用高频率更新的业务数据:这种数据就需要在写入数据库的同时放入缓存,不设置过期时间,这样用户每次访问都走缓存。为了保证数据的一致,还有数据对内存的占用,还需要有一些额外的策略。

3.2.2、数据一致行问题考虑:

按照数据更新频率划分,可以在一定程度上保证数据的一致性,但是不满足对数据有高一致性的要求。

具体取决于你的系统在延迟性、吞吐量和一致性等方面的取舍,这里也是适用CAP定理的。如果你要求高一致性和低延迟性,类似关系数据库一样的要求,那么建议你使用terracotta之类的数据网格缓存,还有Oracle的Coherence,它们都在内存上加了一致性锁之类机制;如果你要求有很大吞吐量,应付互联网庞大用户蜂拥而进的数据,那么采取NoSQL或memcache、redis之类解决方案。

3.3、前端缓存
我们这里说的前端缓存可以理解为一般使用的cdn技术,利用squid,nginx等做前端缓冲技术,主要还是针对静态文件类型,比如图片,css,js,html等静态文件。
3.4、客户端缓存
浏览器端的缓存,可以让用户请求一次之后,下一次不在从服务器端请求数据,直接从本地缓存读取,可以减轻服务器负担也可以加快用户的访问速度。
4、缓存的过期和更新
4.1、缓存的过期包含
.时间过期
         我们在缓存数据的时候我们可以指定数据缓存的最大时间,如果超过这个时间,我们就认为缓存是失效的。
.基于规则的过期
         我们在缓存中存储了某些数据来标明数据的版本。比如存取的时间,更新的时间,数据的版本信息等等。然后比较这些信息是否有变化来判断是否过期。
4.2、缓存的更新包含

.被动
当缓存失效的时候我们的应用程序重新从主存储器中取数据,然后重新放回缓存中。
.主动
当数据一更新的时候,我们的应用主动的去更新我们的缓存内容。
.被动和主动结合(基于版本)

当数据一更新的时候,我们更新一个数据被更新的标志。然后根据上面讲到的“基于规则的过期”来更新数据。

5、缓存系统评价

缓存系统评价从下面三个方面进行综合考虑:

1)速度;

2)及时性;

3)命中率。


你可能感兴趣的:(redis,缓存)