缓存原理与设计之缓存基本思想及分类
在MyBatis功能点一应用:二级缓存整合redis - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,MyBatis使用第三方缓存Redis将查询数据保存。实际上除了Redis还可以使用其他的第三方缓存也可以,只要实现了JDK提供的Cache接口即可。
这个接口就是缓存设计浓缩的精华之一。那么究竟为什么要使用缓存,其原理是什么以及为什么JDK要这样设计呢?
一、缓存的使用场景(为什么要使用缓存)
1、就数据库而言,DB缓存,减轻DB服务器压力。
一般情况下数据存在数据库中,应用程序直接操作数据库。当访问量上万,数据库压力增大,可以采取的方案有:读写分离,分库分表;当访问量达到10万、百万,就需要引入缓存。将已经访问过的内容或数据存储起来,当再次访问时先找缓存,缓存命中返回数据。不命中再找数据库,并回填缓存。
2、提高系统响应
数据库的数据是存在文件里,也就是硬盘。与内存做交换(swap)在大量瞬间访问时(高并发)MySQL单机会因为频繁IO而造成无法响应。MySQL的InnoDB是有行锁将数据缓存在Redis中,也就是存在了内存中。内存天然支持高并发访问,可以瞬间处理大量请求。
3、做Session分离
传统的session是由tomcat自己进行维护和管理。集群或分布式环境,不同的tomcat管理各自的session。只能在各个tomcat之间,通过网络和Io进行session的复制,极大的影响了系统的性能:
1)各个Tomcat间复制session,性能损耗
2)不能保证各个Tomcat的Session数据同步
将登录成功后的Session信息,存放在Redis中,这样多个服务器(Tomcat)可以共享Session信息。Redis的作用是数据的临时存储,可参考nginx负载均衡中利用redis解决session一致性问题 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)。
还有其他使用场景,比如做分布式锁,乐观锁等不赘述。
二、缓存的定义
什么是缓存?缓存原指CPU上的一种高速存储器,它先于内存与CPU交换数据,速度很快;现在泛指存储在计算机上的原始数据的复制集,便于快速访问。
在互联网技术中,缓存是系统快速响应的关键技术之一,以空间换时间的一种技术(艺术)。在大型网站中从浏览器到网络,再到应用服务器,再到数据库,通过在各个层面应用缓存技术,大大提升了系统性能和用户体验。
三、缓存分类
1、客户端缓存
传统互联网:页面缓存和浏览器缓存
页面缓存:页面自身对某些元素或全部元素进行存储,并保存成文件。
html5:Cookie、WebStorage(SessionStorage和LocalStorage)、WebSql、indexDB、Application Cache等
开启步骤:
1)设置manifest描述文件
2)html关联manifest属性:<html lang="en" manifest="demo.appcache">
使用LocalStorage进行本地的数据存储,示例代码:
浏览器缓存
当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。
浏览器缓存可分为强制缓存和协商缓存。
强制缓存:直接使用浏览器的缓存数据
条件:Cache-Control的max-age没有过期或者Expires的缓存时间没有过期。
协商缓存:服务器资源未修改,使用浏览器的缓存(304);反之,使用服务器资源(200)。
移动互联网:APP缓存
APP缓存:原生APP中把数据缓存在内存、文件或本地数据库(SQLite)中。比如图片文件等。
2、网络端缓存
通过代理的方式响应客户端请求,对重复的请求返回缓存中的数据资源。
Web代理缓存:可以缓存原生服务器的静态资源,比如样式、图片等。常见的反向代理服务器比如大名鼎鼎的Nginx。
3、服务端缓存
服务器端缓存是整个缓存体系的核心。包括数据库级缓存、平台级缓存和应用级缓存。
数据库级缓存:数据库是用来存储和管理数据的。MySQL在Server层使用查询缓存机制。将查询后的数据缓存起来。
K-V结构,Key:select语句的hash值,Value:查询结果
InnoDB存储引擎中的buffer-pool用于缓存InnoDB索引及数据块。
平台级缓存:平台级缓存指的是带有缓存特性的应用框架。比如:GuavaCache 、EhCache(二级缓存,硬盘)、OSCache(页面缓存)等。部署在应用服务器上,也称为服务器本地缓存。
应用级缓存:具有缓存功能的中间件:Redis、Memcached、EVCache(AWS)、Tair(阿里 、美团)等。采用K-V形式存储。利用集群支持高可用、高性能、高并发、高扩展的分布式缓存
设计自己产品的时候,大有作为的缓存在应用级缓存,这也是探究缓存的重点区域。