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

本文详细介绍了Web和App项目中缓存的应用场景和技术选择,涵盖了浏览器、API服务器、数据库等多个层面的缓存策略,并探讨了不同节点间的缓存同步机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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.youkuaiyun.com/clementad/article/details/46714293)。另外,Spring-Data定义了一些接口、注解和实现对各种缓存的存取,可以很方便的使用。
  • 可以不共享的数据:比如系统配置信息、地区信息、一些基础数据、等等。这些信息一般配置在数据库或文件中,而这些信息一般是很少改动的,所以可以直接存放在web/API服务器的内存中,比如可以用Java的ConcurrentHashMap来存放,或者使用已经封装好的Guava Cache(参考:对Guava Cache的封装和使用: http://blog.youkuaiyun.com/clementad/article/details/46491701)。

失效机制:一般对缓存的数据都会设置自动失效时间,比如手机验证码设置两分钟自动失效。对于一些配置信息,可以设置长一点的失效时间(比如一天),另外需要提供手动失效的接口,以便需要紧急修改的数据可以马上生效。另外,某些缓存(比如Guava Cache)会设置一个最大存储空间,缓存空间满了之后,会根据一定的淘汰算法(FIFO、LRU、LFU等,参考:  http://blog.youkuaiyun.com/clementad/article/details/48229243 )清除掉一些数据。

应用服务器缓存:
一般是缓存系统配置信息,以及一些静态的、不需要经过计算的信息。可以根据是否需要服务器间同步和共享,决定使用缓存服务器(如redis)、或本地缓存(如Guava Cache: http://blog.youkuaiyun.com/clementad/article/details/46491701

失效机制跟Web/API服务器缓存类似。

数据库缓存:
数据库可以把查询语句执行的结果缓存起来,下次收到同样的查询请求时就可以直接从缓存中获取数据。启用查询缓存对性能的提高效果非常明显(参考:  http://blog.youkuaiyun.com/clementad/article/details/46806469 )。

失效机制:缓存空间满了之后,会根据一定的算法释放一部分数据;数据库表中某条记录被修改了之后,跟这个记录相关的缓存也会被失效。

搜索引擎等其他服务器缓存:
基本上所有的服务器节点都会考虑缓存的使用,比如Solr可以把搜索的结果缓存起来,下次同样的搜索就可以节省系统开销。

总的来说,凡是有节点的地方,就可以有缓存的存在。另外,CDN也可以看做是一种缓存,把服务器中的文件缓存到距离用户最近的地方。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值