如何构建应用级缓存?

什么是应用级缓存?

先说一下缓存,缓存就是一组保存起来以备将来使用的东西,可以加快系统快速相应,例如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集群的情况,可能会造成数据错乱,需要注意缓存的更新机制和原子化操作。

如果所有缓存都没有命中,系统就只能查询数据库或其他数据的提供的地方并返回,

常用的缓存算法

当缓存中没有命中,并且缓存容量已经满了,就会在缓存中去除一条旧数据,去除哪些数据就是由下面这些算法决定的。

  1. Least-Recently-Used (LRU)
    替换掉最近被请求最少的对象,这种在实际中应用最广。
    浏览器一般使用了 LRU作为缓存算法。新的对象会被放在缓存的顶部,当缓存达到了容量极限,底部的对象被去除。

  2. Least-Frequently-Used (LFU)
    替换掉访问次数最少的缓存,这种策略是保留最常用的、最流行的对象,替换掉很少使用的那些数据。

  3. Least Recently Used 2 (LRU2 )
    LRU的变种,把被两次访问过的对象放人缓存池,当缓存池满了之后,会把有两次最少使用的缓存对象去除。

  4. Two Queues ( 2Q)
    Two Queues是LRU的另一.个变种,把被访问的数据放到LRU的缓存中,如果这个对象再一次被访问,就把他转移到第二个、更大的LRU缓存,使用了多级缓存的方式。去除缓存对象是为了保持第一个缓存池 是第二个缓存池的1/3。当缓存的访问负载是固定的时候,把LRU换成LRU2,就比增加缓存的容量更好。

  5. SIZE
    替换占用空间最大的对象,这种策略通过淘汰 一个大对象而不是多个小对象来提高命中率。不过,可能有些进人缓存的小对象永远不会再被访问。SIZE 策略没有提供淘汰这类对象的机制,也会导致“缓存污染”。

  6. LRU-Threshold
    不缓存超过某一size的对象,其他与LRU相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值