缓存类型
前言
缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。缓存可以在内存中存储一份数据副本,从而不用重新请求计算达到高性能的效果,现在系统中缓存已成为必不可少的模块,并且已经成为了高并发高性能架构的一个关键组件。
缓存妙用
提升性能:这不用说了,当我们在一个请求或者一些计算中需要一定的时间,如果每次请求都去计算一次,那么花费的代价会递增,这时加入缓存,将第一次请求得到的结果存入内存,就能在内存中直接获取而不用再去花费代价去计算,但是在内存中存储一份结果需要一定的空间,所以缓存是以空间换时间的手段。
缓解数据库压力:当用户量增加,数据库压力增加,如果在访问数据库的操作前加入缓存,就能不访问数据库拿到数据。
提升用户体验:因为是存在内存中,所以获取到缓存数据跟快,返回响应速度也就更快。
、 提升并发量:由于性能提升了,响应速度就更快,能够响应的请求也就更多了。
缓存缺陷
数据不一致:当数据被缓存或又更新了,导致数据库数据与缓存的数据不一致,需要一些策略解决。
缓存雪崩:由于设置的缓存过期时间一致,导致所有缓存一起过期,随后大量请求直达服务器,可使用随机过期策略。
缓存穿透:一直使用缓存中不存在的key请求服务器,导致所有请求直接穿透到服务器。
缓存击穿:某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。
缓存的类型
- 客户端缓存
- 客户端缓存指的是让浏览器将一些数据缓存重用,避免重复请求,基本原理是利用HTTP协议缓存协商,在ResponseHeader里面指定下缓存策略即可,适合缓存静态资源,如各种css、js和小图标文件,都设定有效期,资源更新时才用版本号缓存更新模式,在每个资源请求后面带上版本号。
- 客户端缓存指的是让浏览器将一些数据缓存重用,避免重复请求,基本原理是利用HTTP协议缓存协商,在ResponseHeader里面指定下缓存策略即可,适合缓存静态资源,如各种css、js和小图标文件,都设定有效期,资源更新时才用版本号缓存更新模式,在每个资源请求后面带上版本号。
- 反向代理缓存
- 反向代理缓存是在请求经过反向代理时使用缓存,没有缓存转发到目标服务器,否则直接返回。使用Nginx做负载均衡,然后加个缓存解决高频场景,缓存整个动态页,设定有效期。
- CDN缓存
- CDN缓存和反向代理缓存的思路差不多,一个HTTP请求要经过DNS,要经过反向代理,那么在这两个环节加一层缓存必不可少,当请求进入CDN后如果有缓存直接返回。
- 本地缓存
- 本地缓存有叫服务器缓存,在服务端内存中写入缓存,Asp.Net Core中内置了MemoryCache作为本地缓存,在内存中存入一些常用的数据,减少计算压力以及数据库压力,从而达到提升性能的目的。
- 本地缓存有叫服务器缓存,在服务端内存中写入缓存,Asp.Net Core中内置了MemoryCache作为本地缓存,在内存中存入一些常用的数据,减少计算压力以及数据库压力,从而达到提升性能的目的。
- 分布式缓存
- 分布式缓存与服务器缓存都是利用内存缓存的数据重用以加快速度,如果后端做的是集群,为方便内存共享需要使用像数据库一样的第三方存储空间,目前主流的分布式缓存数据库有HBase、Redis、MongoDB、Couchbase、LevelDB......他们都是NoSql数据,在查询上更高效。项目中所有数据几乎都能走缓存,采用双写方案,同步数据库和Redis,查询走Redis,减少数据库压力,如用户登录,浏览记录,页面访问次数等即时信息也可以放入Redis中,注意数据同步即可。
总结
在客户端使用客户端缓存可以减少一些小图标以及一些css、js文件的请求;CDN缓存和反向代理缓存用来拦截到请求后先确认是否有无缓存,有缓存的话不用访问服务器直接返回响应,否则再转发到目标服务器;本地缓存与分布式缓存都是服务端缓存,前者只在单节点服务端存储,不能做到缓存共享,后者提供一个高效的第三方空间,集群中的服务器都能访问到,共享缓存数据。