缓存一致性

当数据实时性要求很高时,需要保证缓存中的数据与数据库中的数据一致,缓存节点与副本中的数据一致,不能出现差异现象,这就比较依赖缓存的过期和更新策略了。一般会在数据发生更改的时候,主动跟新缓存中的数据或者移除对应的缓存,这时可能会出现缓存一致性的问题。

现象一:更新数据库成功,更新缓存失败,数据不一致。

现象二:更新缓存成功,更新数据库失败,数据不一致。

现象三:更新数据库成功,淘汰缓存失败,数据不一致。

现象四:淘汰缓存成功,更新数据库失败,查询缓存miss。

缓存并发问题

缓存过期后将尝试从后端的数据库获取数据,这时一个看似合理的流程,但是在高并发场景下,有可能有多个请求从数据库中请求数据,对后端数据库造成极大的冲击,甚至导致雪崩现象。此外当某个缓存的Key被更新时,同时也可能被大量请求获取,这也会导致一致性的问题。如何避免类似的问题?可以通过锁的机制来避免。在缓存更新或更新的情况下,先尝试获取锁,当更新或者从数据库获取数据完成后,在释放锁。其他请求只要牺牲一定的等待时间就可以从缓存中继续获取数据。

缓存穿透问题

在高并发场景下,如果某个Key被高并发访问,没有被命中,出于对容错性的考虑,会尝试从后端数据库中获取,从而导致大量的请求达到数据库,而该Key对应的数据本身就是空的情况下,就导致了数据库中并发的去执行了很多不必要的查询操作,从而导致了巨大的冲击和压力。这种情况下可以通过以下几种方式来避免缓存穿透问题:

  1. 缓存空对象:对查询结果为空的对象,也进行缓存,如果是集合的话,可以缓存一个空集合
  2. 单独过滤处理:对所有可能数据为空的Key,进行统一的存放。在请求前做拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂。比较适合命中不高但是更新频繁的数据

缓存的雪崩现象

请求都到后台数据库导致系统崩溃

java高并发(二十一)高并发场景下缓存常见问题相关推荐

  1. 读数据库遇到空就进行不下去_如何解决高并发场景下缓存+数据库双写不一致问题?...

    推荐阅读: 一只Tom猫:手撕分布式技术:限流.通讯.缓存,全部一锅端走送给你!​zhuanlan.zhihu.com 一只Tom猫:MySQL复习:20道常见面试题(含答案)+21条MySQL性能调 ...

  2. 【高并发】亿级流量场景下如何实现分布式限流?看完我彻底懂了!!(文末有福利)

    写在前面 在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一.京东618.秒杀.抢购促销等,这些都是典型的大流量高并发场景.关于秒杀,小伙伴们可以参见我的另一篇 ...

  3. Java架构-每秒上千订单场景下的分布式锁高并发优化实践!

    "上一篇文章我们聊了聊Redisson这个开源框架对Redis分布式锁的实现原理,如果有不了解的兄弟可以看一下:<拜托,面试请不要再问我Redis分布式锁实现原理>. 今天就给大 ...

  4. 「高并发」亿级流量场景下如何实现分布式限流?

    分布式限流的关键就是需要将限流服务做成全局的,统一的.可以采用Redis+Lua技术实现,通过这种技术可以实现高并发和高性能的限流. Lua是一种轻量小巧的脚本编程语言,用标准的C语言编写的开源脚本, ...

  5. 高并发场景下缓存的常见问题

    作者介绍: 丁浪,非著名架构师.关注高并发.高可用的架构设计,对系统服务化.分库分表.性能调优等方面有深入研究和丰富实践经验.热衷于技术研究和分享. 声明:版权归丁浪作者本人所有,转载请联系作者本人 ...

  6. 本地缓存需要高时效性怎么办_缓存在高并发场景下的常见问题

    缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...

  7. 缓存在高并发场景下的常见问题

    缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象.这就比较依赖缓存的过期和更新策略.一般会在数据发生更改 ...

  8. Java 编程问题:十一、并发-深入探索

    原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括涉及 Java 并发的 ...

  9. 队列处理高并发_高并发场景下缓存处理的一些思路

    在实际的开发当中,我们经常需要进行磁盘数据的读取和搜索,因此经常会有出现从数据库读取数据的场景出现. 但是当数据访问量次数增大的时候,过多的磁盘读取可能会最终成为整个系统的性能瓶颈,甚至是压垮整个数据 ...

最新文章

  1. Java 必须掌握的 20+ 种 Spring 常用注解
  2. mysql授权其他用户导出数据_mysql创建账号、授权、数据导出、导入
  3. 【React、Vue 、 Angular 共分天下,2018首将会是谁?】
  4. Linux编译动态链接库
  5. initWithCoder: 与initWithFrame:
  6. Mantis-如何自定义流程状态
  7. 32年寻获上帝粒子,华人女学者自述高能人生故事
  8. IE、Chrome、Firefox 三大浏览器对比
  9. linux信号量配合共享内存应用分析(详解)
  10. 用友T3 反结账反记账
  11. Linux聊天服务器
  12. 航信税控系统 - 安装分析(一)
  13. 自定义fingerprint特征
  14. mysql未开启binlog恢复数据_MYSQL bin_log 开启及数据恢复
  15. 30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)(转)
  16. ROS综合学习记录(一)---cmd_vel转换为阿克曼模型的速度变换
  17. 我的GH60 - 极客定制GK61XS : eclipse软件开发常用快捷键新增绑定 (亦适用于不使用方向键/HOME/END情况的大牛)
  18. 图形化开放式生信分析系统开发 - 7 分析报告的模板定制与自动生成
  19. 为程序选择在哪个cpu上跑
  20. 各种塑料材质说明,哪些可以加热,哪些可以放入微波炉

热门文章

  1. 使用Gridview绑定数据库中的图片
  2. ASP.NET配置错误页面浅析
  3. mysql主从同步从库上Slave_IO_Running: Connecting问题
  4. TP查看已部署的TP框架的版本
  5. 预处理器命令必须作为第一个非空白空间启动_第三章 图形处理器(上)
  6. CentOs7 无可用“Chinese Support“
  7. linux的无密码登录,linux 无密码登录
  8. oracle子查询子查询,Oracle 单行子查询和多行子查询
  9. 清空mysql一个库中的所有表_mysql怎样清空一个数据库中的所有表_MySQL
  10. mvn项目Quartz简单上手