如何构建应用级缓存?
什么是应用级缓存?
先说一下缓存,缓存就是一组保存起来以备将来使用的东西,可以加快系统快速相应,例如CPU缓存,指得是位于CPU与内存之间的临时存储器,容量比内存小,但速度要比内存快。应用级缓存需要我们开发者通过代码来实现,那就会涉及到NoSql,现在的Redis、MongoDb、Memcache就是构建应用级缓存的重要技术。
如何构建多级缓存?
我们可以通过Redis集群和其他多种缓存技术实现一个多级缓存,大概处理流程如下。
首先,用户的请求被负载均衡服务分发到Nginx上,接着,Nginx应用服务器读取本地缓存,实现本地缓存的方式可以是Lua Shared Dict,或者面向磁盘或内存的Nginx Proxy Cache,以及本地的Redis实现等,如果本地缓存命中则直接返回。
如果Nginx应用服务器的本地缓存没有命中,就会进一步读取相应的分布式缓存一Redis分布式缓存的集群,可以考虑使用主从架构来提升性能和吞吐量,如果分布式缓存命中则直接返回相应数据,并写入到Nginx应用服务器的本地缓存中。
如果Redis分布式缓存也没有命中,则会回到Tomcat集群。
在Tomcat集群应用中,首先读取本地平台级缓存,如果平台级缓存命中则直接返回数据,并会同步写到主Redis集群,然后再同步到从Redis集群。此处可能存在多个Tomcat实例同时写主Redis集群的情况,可能会造成数据错乱,需要注意缓存的更新机制和原子化操作。
如果所有缓存都没有命中,系统就只能查询数据库或其他数据的提供的地方并返回,
常用的缓存算法
当缓存中没有命中,并且缓存容量已经满了,就会在缓存中去除一条旧数据,去除哪些数据就是由下面这些算法决定的。
-
Least-Recently-Used (LRU)
替换掉最近被请求最少的对象,这种在实际中应用最广。
浏览器一般使用了 LRU作为缓存算法。新的对象会被放在缓存的顶部,当缓存达到了容量极限,底部的对象被去除。 -
Least-Frequently-Used (LFU)
替换掉访问次数最少的缓存,这种策略是保留最常用的、最流行的对象,替换掉很少使用的那些数据。 -
Least Recently Used 2 (LRU2 )
LRU的变种,把被两次访问过的对象放人缓存池,当缓存池满了之后,会把有两次最少使用的缓存对象去除。 -
Two Queues ( 2Q)
Two Queues是LRU的另一.个变种,把被访问的数据放到LRU的缓存中,如果这个对象再一次被访问,就把他转移到第二个、更大的LRU缓存,使用了多级缓存的方式。去除缓存对象是为了保持第一个缓存池 是第二个缓存池的1/3。当缓存的访问负载是固定的时候,把LRU换成LRU2,就比增加缓存的容量更好。 -
SIZE
替换占用空间最大的对象,这种策略通过淘汰 一个大对象而不是多个小对象来提高命中率。不过,可能有些进人缓存的小对象永远不会再被访问。SIZE 策略没有提供淘汰这类对象的机制,也会导致“缓存污染”。 -
LRU-Threshold
不缓存超过某一size的对象,其他与LRU相同。
本文地址:https://blog.csdn.net/HouXinLin_CSDN/article/details/107364585