redis缓存的概念

Cache的基本类型介绍

在如今蒸蒸日上的互联网的趋势下,缓存为王,占了我们各个网络和互联网应用。那么什么是缓存喃?

在计算器中,高速缓冲存储器是一个硬件或软件组件,其存储数据,以便该数据可以在将来的请求送达更快;存储在缓存中的数据可能是早期计算的结果,也可能是存储在其他位置的数据的副本。一个缓存命中时,所请求的数据在高速缓存中找到,而出现高速缓存未命中当它不能发生时发生。缓存命中是通过从缓存中读取数据来实现的,这比重新计算结果或从速度较慢的数据存储中读取要快。因此,从缓存中可以处理的请求越多,系统执行速度就越快。

https://en.wikipedia.org/wiki/Cache_(computing)

系统缓存

buffer与cache:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           990M        316M        147M         67M        526M        436M

buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存在写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间在写入磁盘,所以服务器突然断电会丢失内存中的部分数据。

cache:缓存也叫读缓存,一般用于读操作,CPU读文件从内存读,如果内存没有就先从硬盘读到内存再读到CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。

cache的保存位置:

客户端:浏览器 内存:本地服务器、远程服务器 硬盘:本机硬盘、远程服务器硬盘

cache的特性:

自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除

过期时间:强制过期,源网站更新图片后CDN是不会更新的,需要强制是图片缓存过期

命中率:即缓存的读取命中率

用户层缓存

### DNS缓存:

默认为60秒,即60秒之内在访问同一个域名就不在进行DNS解析,一般优化可以在一个网站内放多个域名,达到缓存的目的

### 浏览器缓存

about:cache

在这里插入图片描述

浏览器缓存过期机制

Etab标记和Last-modified(最后修改时间)

Etag由服务器端生成,基于Etag标记是否一致做判断页面是否发生过变化,比如基于Nginx 的etag on来实现;客户端通过If-None-Match这个条件请求来验证资源是否修改。

在这里插入图片描述

第一次请求:

1.客户端发起 HTTP GET 请求一个文件;

2.服务器处理请求,返回响应报文,响应头包括Etag,状态码200

第二次请求:

1.客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送的请求报文请求头包括If-None-Match,而它的值就是Etag的值(此处由发起请求的客户端来设置)。

2.服务器会判断客户端发送过来的If-None-Match值与服务器的Etag值是否与相同,如果相同,就把If-None-Match的值置为false,状态码置为304(未修改——Not Modified),响应体为空,返回响应报文,客户端将继续使用本地缓存。如果不相同,就将If-None-Match的值设为true,返回状态码为200,客户端重新解析服务器返回的数据。

Etag和Last-Modified关联:
Last-Modified表示响应资源在服务器最后修改时间。事实证明,在尝试确定文档是否已更改时,Last-Modified日期并不很可靠。有时开发人员会在修复某些内容后将所有文件上传到服务器,即使内容仅在子集上更改,也会重置所有文件的Last-Modified日期。为了适应这种情况,大多数服务器也会发送一个ETag。 ETag代表实体标记,并且是唯一的标识符,其仅根据文件的内容而改变。大多数服务器实际上使用像SHA256这样的散列函数来计算ETag。

If-Modified-Since 和 Last-Modified的关联:

一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 响应头字段,而 If-Modified-Since 则是由客户端往服务器发送的请求头字段。当再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 字段将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则返回 304 和空响应体告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。

If-None-Match和If-Modified-Since都可以出现在同一个请求中,但ETag优先于If-Modified-Since(就是Last-Modified的时间戳的值),因为它被认为更准确(Etag显然比Last-Modified值准确)

expires(有效期)和cache-control(过期时间)

以上两种都需要发送请求,即不管资源是否过期都要发送请求进行协商,这样会消耗不必要的时间,因此有了缓存
的过期时间,即第一次请求资源的时候带一个资源的过期时间,默认为30天,当前这种方式使用的比表较多,但是无法保证客户的时间都是准确并且一致的,因此会加入一个最大生存周期,使用用户本地的时间计算缓存数据是否超过多少天,下面的过期时间为2027年,但是缓存的最大生存周期计算为天等于3650天即10年,过期时间如下:

在这里插入图片描述
Expires:

这个字段是HTTP/1.0中的,Expires是需要在服务端配置(具体配置也根据服务器而定),Expires添加的是该资源过期的日期,浏览器会根据该过期日期与客户端时间对比,如果过期时间还没到,则会去缓存中读取该资源,如果已经到期了,则浏览器判断为该资源已经不新鲜要重新从服务端获取。通过这种方式,可以实现直接从浏览器缓存中读取,而不需要去服务端判断是否已经缓存,避免了这次http请求。值得注意的是Expires时间可能存在客户端时间跟服务端时间不一致的问题。所以,建议Expires结合Cache-Control一起使用,大型网站中一起使用的情况比较多见。

Cache-Control:

该字段是HTTP/1.1协议中的,可以是请求头中的或者响应头中的字段。它允许服务器控制客户端缓存收到的响应的方式和时长。 Cache-Control是一个复杂的野兽,具有许多内置功能。 99%的情况下,只需要“cacheability”(可缓存性)和“max-age”。但是Cache-Control可能被某些缓存和浏览器忽略。可以通过将Expires HTTP版本1.0标头字段值设置为早于响应时间的时间来进行模拟。Cache-Control相对于Expires更加具体,细致。若同时设置了Cache-Control和Expires,Cache-Control的优先级高于Expires。

https://blog.csdn.net/qq_34115899/article/details/86107217#If-Modified-Since%EF%BC%9A

CDN缓存

什么是CDN:

内容分发网络(Content Delivery Network),通过将服务内容分发至全网加速节点,利用全球调度系统使用户能
够就近获取,有效降低访问延迟,提升服务可用性,CDN 第一降低机房的使用带宽,因为很多资源通过CDN就直
接返回用户了,第二解决不同运营商之间的互联,因为可以让联通的网络访问联通让电信的网络访问电信,起到加
速用户访问的目的, 第三:解决用户访问的地域问题,就近返回用户资源。

百度CDN:https://cloud.baidu.com/product/cdn.html
阿里CDN:https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n
腾讯CDN:https://www.qcloud.com/product/cdn

用户请求CDN流程:

提前对静态内容进行预缓存,避免大量的请求回源,导致主站网络带宽被打满而导致数据无法更新,另外CDN可以将数据根据访问的热度不同而进行不同级别的缓存,例如访问量最高的资源访问CDN 边缘节点的内存,其次的放在SSD或者SATA,再其次的放在云存储,这样兼顾了速度与成本。

在这里插入图片描述

CDN主要优势:
提前对静态内容进行预缓存,避免大量的请求回源,导致主站网络带宽被打满而导致数据无法更新,另外CDN可以将数据根据访问的热度不同而进行不同级别的缓存,例如访问量最高的资源访问CDN 边缘节点的内存,其次的放在SSD或者SATA,再其次的放在云存储,这样兼顾了速度与成本。缓存-缓存到最快的地方如内存,缓存的数据准确命中率高,访问速度就快。

调度准确-将用户调度到最近的边缘节点
性能优化-CDN 专门用于缓存响应速度快
安全相关-抵御攻击
节省带宽:由于用户请求由边缘节点响应,因此大幅降低到源站带宽。

应用层缓存

Nginx、PHP等web服务可以设置应用缓存以加速响应用户请求,另外有些解释性语言比如PHP/Python/Java不能
直接运行,需要先编译成字节码,但字节码需要解释器解释为机器码之后才能执行,因此字节码也是一种缓存,有
时候会出现程序代码上线后字节码没有更新的现象。

# Nginx缓存配置实例
# vim /apps/nginx/conf/nginx.conf
proxy_cache_path /data/nginx/proxycache  levels=1:1:1  keys_zone=proxycache:20m
inactive=120s  max_size=1g; #配置在nginx.conf http配置段
# vim /apps/nginx/conf/conf.d/web.conf
location /web {  #要缓存的URL 或者放在server配置项对所有URL都进行缓存
 proxy_pass http://IP:80/;
 proxy_set_header clientip $remote_addr;
 proxy_cache proxycache;
 proxy_cache_key $request_uri;
 proxy_cache_valid 200 302 301 1h;
 proxy_cache_valid any 1m;
}

其他层面缓存

硬件缓存

在这里插入图片描述

比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数
据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据
的目的,因为CPU的速度太快了,CPU需要的数据由于硬盘往往不能在短时间内满足CPU的需求,因此PCU缓存、
内存、Raid 卡缓存以及硬盘缓存就在一定程度上满足了CPU的数据需求,即CPU 从缓存读取数据可以大幅提高
CPU的工作效率。

http://www.sohu.com/a/246498483_468626

### cookie与session

Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤,比如加密后的账
户名密码等信息 Cookies是服务器在客户端浏览器上存储的小段文本并随每一个请求发送至同一个服务器,是一种
实现客户端保持状态的方案。

session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当浏览器请求http地址时,可以基于之前的session实现会话保持、session共享等.一般实现可以为redis和memachace

cookie和session的区别

1、Cookie以文本文件格式存储在浏览器中,而session存储在服务端。

2、cookie的存储限制了数据量,只允许
4KB,而session是无限制的。

3、cookie包含在每一个客户端请求报文中,因此容易被人捕获。

4、cookie和session都可以设置过期时间。

cookie和session的区别

1、Cookie以文本文件格式存储在浏览器中,而session存储在服务端。

2、cookie的存储限制了数据量,只允许4KB,而session是无限制的。

3、cookie包含在每一个客户端请求报文中,因此容易被人捕获。

4、cookie和session都可以设置过期时间。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值