一、缓存的本质
缓存的本质可以看作一个基于内存的hash表。跟所有具有hash表结构的设计一样可以通过计算key的hashcode,对hashcode进行取余运算。得到的余数即为hash表结构中索引的位置
二、缓存的实际应用场景
缓存作为性能优化的解决方案存在于很多技术架构业务场景中
- 本地缓存 在应用服务器中本地缓存着热点数据,应用程序可以在本地内存中直接访问数据,无需访问数据库
- 分布式缓存 本地内存无法满足业务需求时,就需要部署远程分布式集群服务器。由于内存资源是宝贵且有限的,不可能所有资源都放在缓存中,缓存中的资源通常都是需要频繁访问的且在某一个时间段内不会过期失效。
- CDN(内容分发网络) CDN本质上也是一个缓存,终端服务器提前将数据分发到本地运营商的服务器上,当用户访问时就近访问本地运营商的机房,加快请求速度,减少请求时间,减轻终端服务器的压力
- 反向代理 有反向代理即有正向代理,正向代理位于浏览器一侧,代理浏览器将http请求发送到互联网上。反向代理位于浏览器一侧,代理服务器接受http请求,以达到保护被代理目标的安全性的目的,同时可以将静态资源以及一些动态资源缓存到代理服务上,加快请求速度,减少响应时间。
三、缓存使用不当可能会带来的后果
- 频繁修改的数据 对于频繁修改的数据,最新的数据还没来得及写入缓存,导致应用读取到失效的数据。
- 非热点数据 缓存以内存作为存储介质,内存资源是宝贵且有限的,如果存储了大量的非热点数据,导致热点数据还未被再次访问时已经被作为历史数据清理掉了。
- 数据不一致 通常缓存都会设定一个失效时间,如果在失效时间内数据已经被变更了,导致应用读取到失效的数据。
- 缓存不可用 如果缓存服务器不可用了,导致数据库压力骤然变大,数据库服务器完全无法承受,进而导致整个网站服务器的崩溃。
- 缓存穿透 如果因为业务不当或者人为攻击,持续高并发的请求缓存中不存在的数据,导致所有的请求最终都落到数据库上,进而导致数据库压力太大乃至崩溃。