互联网项目中各节点缓存的使用总结

在Web和App项目中,缓存的使用无处不在。它的使用,无非就是为了缓解两大耗时黑户对用户体验的影响,同时尽量地减少服务器的负担:
  • 对磁盘的访问
  • 网络访问
(原创文章,转载请注明转自Clement-Xu的csdn博客。)
 
所以,缓存的引入一般都是为了减少这两个访问的次数。由于互联网项目节点繁多,每个节点都会考虑自己的缓存方案,不同节点之间也需要建立相应的协议来充分地利用缓存。
 
对缓存的选择和使用一般需要考虑下面几个方面:
  • 存储方式:包括:本地缓存(非共享)、服务器缓存(共享)、分布式、非持久化、可持久化、等等
  • 失效机制:包括:自动定时失效、条件触发失效、手动失效、等等。
 
一个互联网应用的典型网络架构如下:
 
其中,每一个节点都可以使用缓存以提高整个网络的服务效率。
 
浏览器缓存:
 
一般有两种:
 
失效机制:下次请求页面/文件的时候,由服务器返回状态码304表示该页面或文件没有更新,可以使用缓存中的内容;否则的话就不使用缓存。数据的缓存由自定义的协议协商失效时机,比如可以利用某个cookie的失效来判断数据的失效、或者浏览器关闭时失效。
 
APP缓存:
 
一般有两种方式缓存数据:
  • 数据库(SQLite)缓存方式
  • 文件缓存方式
 
失效机制:一般需要和API服务器协商何时失效。一种做法是:每次需要展示数据之前,向API服务器请求最新的数据(带上本地缓存数据更新的时间戳作为请求参数),服务器判断缓存的时间戳和服务器数据的时间戳,如果数据库的数据比APP缓存的数据新,就返回数据,否则返回一个数据无更新的标志(类似于HTTP协议中的304/307状态码)。还可以结合APP自己决定在一段时间内(比如一个小时内)不再调用API接口请求最新数据,进一步减少网络交互。
 
代理服务器缓存:
 
一般是对页面(包括静态页面和动态页面)和文件(图片、mp3、视频、等等)进行缓存。比如Nginx可以配置对那些页面进行缓存、以及什么情况下失效。
代理服务器缓存对于异地访问很有用,比如web服务器在北京、代理服务器在广州,那么广州的用户通过代理服务器访问时,广州的代理服务器就可以缓存一份数据,这样下一次广州访问就不用去北京拿数据了。
 
Web/API服务器缓存:
由于web/API服务器一般都是多个服务器分布式部署的,需要缓存的数据有两类:
  • 需要共享的数据:比如用户相关的信息:登录后分配的token,手机验证码、session相关的信息、等等。这些数据的缓存需要放在大家都可以访问的缓存服务器中,比如redis。(Redis各种数据结构/类型的简要区别: http://blog.csdn.net/clementad/article/details/46714293)。另外,Spring-Data定义了一些接口、注解和实现对各种缓存的存取,可以很方便的使用。
  • 可以不共享的数据:比如系统配置信息、地区信息、一些基础数据、等等。这些信息一般配置在数据库或文件中,而这些信息一般是很少改动的,所以可以直接存放在web/API服务器的内存中,比如可以用Java的ConcurrentHashMap来存放,或者使用已经封装好的Guava Cache(参考:对Guava Cache的封装和使用: http://blog.csdn.net/clementad/article/details/46491701)。
 
失效机制:一般对缓存的数据都会设置自动失效时间,比如手机验证码设置两分钟自动失效。对于一些配置信息,可以设置长一点的失效时间(比如一天),另外需要提供手动失效的接口,以便需要紧急修改的数据可以马上生效。另外,某些缓存(比如Guava Cache)会设置一个最大存储空间,缓存空间满了之后,会根据一定的淘汰算法(FIFO、LRU、LFU等,参考: http://blog.csdn.net/clementad/article/details/48229243)清除掉一些数据。
 
应用服务器缓存:
一般是缓存系统配置信息,以及一些静态的、不需要经过计算的信息。可以根据是否需要服务器间同步和共享,决定使用缓存服务器(如redis)、或本地缓存(如Guava Cache:http://blog.csdn.net/clementad/article/details/46491701
 
失效机制跟Web/API服务器缓存类似。
 
数据库缓存:
数据库可以把查询语句执行的结果缓存起来,下次收到同样的查询请求时就可以直接从缓存中获取数据。启用查询缓存对性能的提高效果非常明显(参考: http://blog.csdn.net/clementad/article/details/46806469)。
 
失效机制:缓存空间满了之后,会根据一定的算法释放一部分数据;数据库表中某条记录被修改了之后,跟这个记录相关的缓存也会被失效。
 
搜索引擎等其他服务器缓存:
基本上所有的服务器节点都会考虑缓存的使用,比如Solr可以把搜索的结果缓存起来,下次同样的搜索就可以节省系统开销。
 
总的来说,凡是有节点的地方,就可以有缓存的存在。另外,CDN也可以看做是一种缓存,把服务器中的文件缓存到距离用户最近的地方。
 
参考来源:
http://blog.csdn.net/ClementAD/article/details/48246677
posted @ 2017-09-01 22:18  皈依之路  阅读(1078)  评论(0编辑  收藏  举报