欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何构建应用级缓存?

程序员文章站 2023-12-23 15:57:10
什么是应用级缓存?先说一下缓存,缓存就是一组保存起来以备将来使用的东西,可以加快系统快速相应,例如CPU缓存,指得是位于CPU与内存之间的临时存储器,容量比内存小,但速度要比内存快。应用级缓存需要我们开发者通过代码来实现,那就会涉及到NoSql,现在的Redis、MongoDb、Memcache就是构建应用级缓存的重要技术。如何构建多级缓存?我们可以通过Redis集群和其他多种缓存技术实现一个多级缓存,大概处理流程如下。首先,用户的请求被负载均衡服务分发到Nginx上,接着,Nginx应用服务器读取...

什么是应用级缓存?

先说一下缓存,缓存就是一组保存起来以备将来使用的东西,可以加快系统快速相应,例如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相同。

本文地址:https://blog.csdn.net/HouXinLin_CSDN/article/details/107364585

相关标签: Java java

上一篇:

下一篇: