专栏首页我要变牛Java杂谈之缓存

Java杂谈之缓存


0、缓存

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

1、缓存处理流程

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

2、缓存穿透

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

解决方案:

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  • 利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。
  • 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存雪崩

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

解决方案:

  • 给缓存失效时间,加上一个随机值,避免大量缓存集体失效。
  • 双缓存:缓存A和B,比如A的失效时间是20分钟,B不失效。比如从A中没读到,就去B中读,然后异步起一个线程同步到A。
  • 也可以使用互斥锁,但是会影响性能,因为这个是业务场景,不是恶意攻击。
  • 设置热点数据永远不过期

缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),是指一个key非常热点(类似于爆款),在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:

  • 设置热点数据永远不过期。
  • 加互斥锁,互斥锁,通过互斥所使一个线程去查数据库后把数据再放到缓存。

本文分享自微信公众号 - 你呀不牛(notNiu),作者:stevenniu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java杂谈之BOM谜题

    开发中做了一个导出CSV功能,本地通过wps测试都没有问题,但是测试人员测试的时候发现用excel打开中文表头会出现乱码现象,很奇怪的现象,用nodePad工具...

    你呀不牛
  • Java杂谈之线程池

    受限于硬件、内存和性能,我们不可能无限制的创建任意数量的线程,因为每一台机器允许的最大线程是一个有界值。线程池就是用这些有限个数的线程,去执行提交的任务。然而对...

    你呀不牛
  • java杂谈之各种锁

    悲观锁和乐观锁并不是某个具体的锁而是一种并发编程的基本概念。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入。

    你呀不牛
  • java之mybatis之缓存

    2.一级缓存为 session 缓存,在一个 session中 ,一个查询的 select 语句只会执行一次,根据 <select></select>语句的i...

    Vincent-yuan
  • 谈一谈缓存

    “ 在计算机世界里,缓存可以说无处不在,无论是硬件,还是软件,缓存都是一种最使用的优化手段,可以在操作系统读取磁盘数据时、也可以在应用访问数据库数据时,还可以是...

    搬砖俱乐部
  • 漫谈缓存更新之道

    许多人在更新缓存时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载入缓存中。

    JavaEdge
  • java杂谈之并发容器

    前几天和同事xhf、zm走查代码,功能是为了减少频繁你创建FTP开销用线程notify和wait实现了一个FTP池子,当时提的建议就是用java自带的线程集合实...

    你呀不牛
  • Java杂谈之synchronized锁升级

    本来计划一个月更新一到两篇技术文章,由于最近生病只能在家吃饭和多次复查,原本一些的空闲时间被辗转于医院和做饭占用,生病后才能更深刻体会健康的重要性。

    你呀不牛
  • 杂谈Java内存Webshell的攻与防

    这篇文章主要以Tomcat为例子记录了一些关于Java内存Webshell利用与检测以及相关的思考。

    用户2202688
  • java之hibernate之hibernate缓存

    3.Hibernate提供了缓存来提高效率。hibernate缓存分为:一级缓存,二级缓存,查询缓存。

    Vincent-yuan
  • 谈谈缓存更新

    看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作...

    Java架构
  • Java杂谈之行为参数化

    在软件工程中,一个众所周知的问题就是,不管做什么,用户的需求肯定会变。比方说,有个应用程序是帮助农民了解自己的库存的。这位农民可能想有一个查找库存中所有绿色苹果...

    你呀不牛
  • Java杂谈之Java8重构指南

    新的语言特性常常让现存的编程模式或设计黯然失色。比如Java 5中引入了for-each循环,由于它的稳健性和简洁性,已经替代了很多显式使用迭代器的情形。Jav...

    你呀不牛
  • java之缓存的使用

    说起缓存,首先映入我们脑海的好像有很多种,比如说java自带的map,业界流行的分布式缓存服务器redis,其实还有mc了,但是mc很少用到,至少自己从未用到过...

    码农王同学
  • HBase缓存漫谈

    上一次重度使用HBase已经是两年前了。HBase能够满足上面五个要求,所以用HBase作为画像体系的主要存储引擎便水到渠成。

    用户2936994
  • 浅谈Nginx缓存

    在了解Nginx缓存前 先了解Nginx的一般是作为反向代理服务器以及负载均衡服务器的.

    Criss@陈磊
  • 浅谈Web缓存

    在前端开发中,性能一直都是被大家所重视的一点,然而判断一个网站的性能最直观的就是看网页打开的速度。其中提高网页反应速度的一个方式就是使用缓存。一个优秀的缓存策略...

    李维亮
  • Java高并发缓存架构,缓存雪崩、缓存穿透之谜

    了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?

    李红
  • Java杂谈之Arrays.asList()最理想假设

    由于Arrays.asList()方法会对所产生的List的类型做出最理想的假设, 也就是说,从继承树角度看,出入多个参数时,参数的类型的最近共同 父类(包括本...

    你呀不牛

扫码关注云+社区

领取腾讯云代金券