首页 > 其他分享 >Caffeine本地缓存和缓存雪崩 缓存击穿 缓存穿透

Caffeine本地缓存和缓存雪崩 缓存击穿 缓存穿透

时间:2024-11-25 20:27:14浏览次数:11  
标签:缓存 请求 过期 系统 业务 Caffeine 键值 雪崩

初次发布于我的个人文档

参考:缓存雪崩,缓存击穿,缓存穿透
Caffeine本地缓存

在一些场景下可以引入缓存加速,利用redis实现缓存通常是一个不错的选择,但有时为了避免系统变得复杂可以使用本地缓存。
Caffeine就是一个高效的本地缓存组件。使用方式如下:

1.安装依赖

        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.9.2</version>
        </dependency>

2.创建用于缓存的key-value键值对

Cache<String, String> answerCacheMap = Caffeine.newBuilder()
            //初始化缓存键值对容量
            .initialCapacity(1024)
            // 设置缓存有效期为一天
            .expireAfterAccess(1L, TimeUnit.DAYS)
            .build();

利用缓存是为了提高速度,但是缓存的数据并不会及时更新,所以需要设置有效期,即
超时是为了保证数据的有效。缓存有效期需要根据业务的不同自行设置。

3.新增和读取缓存

        // 从刚刚的缓存键值对中读取缓存的cacheKey对应的数据
        String cache = answerCacheMap.getIfPresent(cacheKey);
        // 如果没有命中缓存,则取出的cache字符串为空
        if (StringUtils.isEmpty(cache)) {
            // 未命中缓存,走正常的业务逻辑
            cache = work();
            // 缓存结果
            answerCacheMap.put(cacheKey, json);
        }

4.缓存的问题

无论用什么方式实现缓存都需要注意以下几个问题:

  • 缓存击穿

缓存击穿指在某一个时间有大量同一个key对应的缓存键值对过期或redis、caffeine等缓存中间件故障,与此同时客户端直接向业务系统(如数据库)发起请求,从而导致业务系统接着崩溃。

解决方法有:
预防性缓存更新:在热点数据即将过期时,提前异步刷新缓存。通过检测热点数据的访问频率,当即将过期时触发自动更新操作,避免过期瞬间的击穿问题。
双缓存机制:可以采用双层缓存策略:一个主要缓存层负责缓存大部分数据,另一个次缓存层保存上次的缓存数据。在主要缓存失效时,可以直接从次缓存层读取数据,避免直接打到业务系统。
加锁保证同时只有少量请求能够构建缓存和访问业务系统

  • 缓存雪崩

缓存雪崩指在某一个时间有大量不同的key对应的缓存键值对过期或redis、caffeine等缓存中间件故障,与此同时客户端直接向业务系统(如数据库)发起请求,从而导致业务系统接着崩溃。

解决方法有:
将过期时间进行一定范围内的随机化
使用多级缓存
加锁保证同时只有少量请求能够构建缓存和访问业务系统
使用redis高可用集群等确保缓存尽量少得故障。

  • 缓存穿透
    缓存穿透指用户恶意查询业务系统中本不可能存在的key导致每次请求都直接穿过缓存机制访问业务系统,如果恶意用户进行大量这样的查询则会导致业务系统因压力过大而崩溃。

解决方法:
缓存空结果:如果查询的某个键在业务系统中不应该存在,则将该键的查询结果(如 null 或空值)缓存起来,并设定一个较短的过期时间,防止该键反复查询打到业务系统。
阻止非法请求(使用黑名单机制):在查询请求进入业务系统前,进行严格的参数校验和过滤,避免不合法的请求查询业务系统(避免黑名单内的请求进入)。
使用白名单机制:使用布隆过滤器对所有可能存在的数据进行标记(设为白名单),所有请求先经过布隆过滤器进行校验,只有布隆过滤器认为存在的数据(白名单的数据),才会去查询缓存或数据库。这样可以有效拦截掉绝大多数不存在的请求,防止这些请求绕过缓存直接打到数据库。

标签:缓存,请求,过期,系统,业务,Caffeine,键值,雪崩
From: https://www.cnblogs.com/ColaBlack/p/18548498

相关文章

  • java操作邮箱 - 邮箱发送验证码 -redis分布式缓存 -redisson分布式缓存
    初次发布于我的个人文档参考:java操作163邮箱本文以163邮箱为例,介绍如何用java发送邮箱。1.获取邮箱授权码进入163邮箱-设置-POP3/SMTP/IMAP-开启POP3/SMTP服务记录得到的授权码2.安装依赖//https://mvnrepository.com/artifact/jakarta.activation/jakarta.activation-ap......
  • Linux之CPU缓存
    CPU缓存系统中最快的存储是处理器中的寄存器。但寄存器由于造价比较昂贵,提供的空间也非常有限。因此系统中必须使用存储量大但速度慢的主存(内存)。高速缓存的速度都比主存快。主存的访问时间是8纳秒以上,而缓存的访问时间只有几个CPU时钟周期。在标准的X86平台下,一般有L1L2L3......
  • 内存与缓存区别
    缓存用途:缓存的主要目的是为了减少对内存或更慢的存储设备的访问次数,将频繁访问的数据暂存起来,以便下次使用时能够更快地获取,从而提升系统的整体性能。内存用途:内存主要用于存储正在运行的程序和数据,为CPU提供快速的数据访问,以保证程序的正常运行。区别解释一内存是计算机......
  • [20241123]PLSQL语句代码执行几次会缓存.txt
    [20241123]PLSQL语句代码执行几次会缓存.txt--//测试看看PLSQL语句代码执行几次会缓存。1.环境:SCOTT@book>@ver1PORT_STRING                   VERSION       BANNER-------------------------------------------------------------------------......
  • 第三章 分布式缓存Redis
    1.Redis持久化1.1RDB持久化RedisDatabaseBackend备份机制,也叫Redis快照。在Redis中,fork用于创建子进程来进行数据持久化操作,这样可以避免阻塞主进程,从而提高性能。1.1.1RDB方式bgsave的基本流程?1.fork主进程得到一个子进程,共享内存空间2.子进程读取内存数据并写入......
  • 分布式缓存的基本概念入门以及如何保证数据一致性
    一、分布式缓存基本概念和常见技术框架JavaWeb中的分布式缓存是指在多台服务器之间共享缓存数据的技术。在分布式系统中,单个应用实例通常不会运行在一个单一的服务器上,而是部署在多个节点上以实现负载均衡和高可用性。为了在这些节点之间共享数据,就需要使用分布式缓存技术......
  • 记录Redis+MQ延迟双删保证缓存一致性
    场景描述在博客系统中,用户可以给博客点赞或者评论,这些操作需要更新数据库中的数据,同时要保证缓存中的博客信息与数据库保持一致。为了提高性能,博客数据会存放在Redis缓存中。但当有大量用户同事点赞或是评论时,缓存和数据库中的数据可能出现不一致。何谓延迟双删?延迟双删......
  • 缓存穿透/击穿/雪崩(附生产BUG)
    优质博文:IT-BLOG-CN一、背景为什么要写这篇文章?生产缓存生成服务转java时,需要通过配置文件进行流量切换。开发人员同时打开了两个配置页面。原配置信息=ABCDEF。在第一个配置页面进行缓存切换,添加G业务缓存,配置信息=ABCDEFG。随后H业务也需要进行缓存切换,但开发人员在第......
  • Springboot缓存+定时提交优化频繁数据库表修改
    缘起最近在弄一个答题小程序,当用户选择的时候需要把用户选择的选项提交到服务器上,然后整个字段是个json格式的,更新的方法也就是解析json后添加选项进入json中。于是其中就涉及到频繁的数据库修改,因为用户答题速度根据题目不同嘛,所以我就寻思这样频繁的修改,数据量上来速度就会受......
  • 常见的缓存淘汰算法
    应用场景:缓存淘汰算法可以广泛应用于任何有缓存淘汰需求的场景,并不仅限于某个特定的插件或工具。许多软件和系统,如数据库(Redis、Memcached)、Web服务器(Nginx、Varnish)、内容分发网络(CDN)、浏览器缓存、甚至操作系统的内存管理,都会使用这些算法来决定在缓存空间满时该移除哪些数据......