Java杂谈之缓存

本文探讨了Java缓存中可能遇到的问题,包括缓存穿透、雪崩和击穿。缓存穿透解决方案包括接口校验、使用互斥锁和设置key-value对为key-null。缓存雪崩的解决策略有设置随机失效时间、双缓存机制和使用互斥锁。缓存击穿的处理方法涉及让热点数据不过期和采用互斥锁。

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

0、缓存

最近开发涉及很多缓存的编写,所以聊聊缓存可能会出现的问题

1、缓存处理流程

前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。

2、缓存穿透

请求缓存中不存在的数据,从而去数据库中查,数据库中也没有,所以无法加到缓存,下次还是直接怼到数据库,所以高并发的时候就导致数据库崩了。如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;

  • 利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。

  • 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存雪崩

即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。和缓存击穿不同的是缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  • 给缓存失效时间,加上一个随机值,避免大量缓存集体失效。

  • 双缓存:缓存A和B,比如A的失效时间是20分钟,B不失效。比如从A中没读到,就去B中读,然后异步起一个线程同步到A。

  • 也可以使用互斥锁,但是会影响性能,因为这个是业务场景,不是恶意攻击。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值