我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java高并发场景下的缓存常见的问题有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java高并发场景下的缓存常见的问题有哪些

这篇文章主要讲解了“Java高并发场景下的缓存常见的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java高并发场景下的缓存常见的问题有哪些”吧!

一、缓存一致性问题

当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。

这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。

Java高并发场景下的缓存常见的问题有哪些

二、缓存并发问题

缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。

此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题。那如何避免类似问题呢?

我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据。

Java高并发场景下的缓存常见的问题有哪些

三、缓存穿透问题

缓存穿透在有些地方也称为“击穿”。很多朋友对缓存穿透的理解是:由于缓存故障或者缓存过期导致大量请求穿透到后端数据库服务器,从而对数据库造成巨大冲击。

这其实是一种误解。真正的缓存穿透应该是这样的:

在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。

可以通过下面的几种常用方式来避免缓存传统问题:

1、缓存空对象

对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。

同时,也需要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。

2、单独过滤处理

对所有可能对应数据为空的key进行统一的存放,并在请求前做拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂,比较适合命中不高,但是更新不频繁的数据。

Java高并发场景下的缓存常见的问题有哪些

四、缓存颠簸问题

缓存的颠簸问题,有些地方可能被成为“缓存抖动”,可以看做是一种比“雪崩”更轻微的故障,但是也会在一段时间内对系统造成冲击和性能影响。一般是由于缓存节点故障导致。业内推荐的做法是通过一致性Hash算法来解决。

五、缓存的雪崩现象

缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。

导致这种现象的原因有很多种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实都可能会导致缓存雪崩现象发生。这些问题也可能会被恶意攻击者所利用。

还有一种情况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会导致雪崩。为了避免这种周期性失效,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。

从应用架构角度,我们可以通过限流、降级、熔断等手段来降低影响,也可以通过多级缓存来避免这种灾难。

此外,从整个研发体系流程的角度,应该加强压力测试,尽量模拟真实场景,尽早的暴露问题从而防范。

Java高并发场景下的缓存常见的问题有哪些

六、缓存无底洞现象

该问题由 facebook 的工作人员提出的, facebook 在 2010 年左右,memcached 节点就已经达3000 个,缓存数千 G 内容。

他们发现了一个问题---memcached 连接频率,效率下降了,于是加 memcached 节点,添加了后,发现因为连接频率导致的问题,仍然存在,并没有好转,称之为”无底洞现象”。 

Java高并发场景下的缓存常见的问题有哪些

目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来满足“高性能、高并发、高可用、可扩展”等要求。

有些是在client端通过Hash取模(或一致性Hash)将值映射到不同的实例上,有些是在client端通过范围取值的方式映射的。当然,也有些是在服务端进行的。

但是,每一次操作都可能需要和不同节点进行网络通信来完成,实例节点越多,则开销会越大,对性能影响就越大。

主要可以从如下几个方面避免和优化:

1、数据分布方式

有些业务数据可能适合Hash分布,而有些业务适合采用范围分布,这样能够从一定程度避免网络IO的开销。

2、IO优化

可以充分利用连接池,NIO等技术来尽可能降低连接开销,增强并发连接能力。

3、数据访问方式

一次性获取大的数据集,会比分多次去获取小数据集的网络IO开销更小。

当然,缓存无底洞现象并不常见。在绝大多数的公司里可能根本不会遇到。

感谢各位的阅读,以上就是“Java高并发场景下的缓存常见的问题有哪些”的内容了,经过本文的学习后,相信大家对Java高并发场景下的缓存常见的问题有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java高并发场景下的缓存常见的问题有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java高并发场景下的缓存常见的问题有哪些

这篇文章主要讲解了“Java高并发场景下的缓存常见的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java高并发场景下的缓存常见的问题有哪些”吧!一、缓存一致性问题当数据时效性要求
2023-06-05

Java缓存架构设计常见问题有哪些

本篇内容主要讲解“Java缓存架构设计常见问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java缓存架构设计常见问题有哪些”吧!1 分层缓存架构设计2 缓存带来的复杂度问题常见的问题主
2023-06-02

PHP 函数中引发警告的常见场景有哪些?

在 php 函数中,警告通常发生在以下场景:变量未定义。函数未定义。无效的函数参数。重复的函数参数。打开文件失败。PHP 函数中引发警告的常见场景PHP 函数中的警告是一种非致命错误,它指出运行时发生了一件不期望的事情,但不会阻止脚本的执
PHP 函数中引发警告的常见场景有哪些?
2024-04-27

Java面试题中常见的问题有哪些

本篇内容主要讲解“Java面试题中常见的问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java面试题中常见的问题有哪些”吧!  1、java 中会存在内存泄漏吗,请简单描述。  答:会
2023-06-02

JAVA编程中的常见问题有哪些

本篇内容主要讲解“JAVA编程中的常见问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA编程中的常见问题有哪些”吧!问题一:编译器找不到类。解决方法:确保你已经导入了类或者它的包。
2023-06-17

Golang常见的应用场景在软件开发中有哪些?

Golang作为一种开发语言,具有简洁高效、并发性能强等特点,因而在软件开发中有着广泛的应用场景。下面将介绍一些常见的应用场景。网络编程Golang在网络编程方面表现出色,特别适合构建高并发、高性能的服务器。它提供了丰富的网络库,开发人员可
Golang常见的应用场景在软件开发中有哪些?
2023-12-28

Go语言的高并发场景中如何实现有效的缓存策略?

在 go 语言的高并发场景中,有效缓存策略可显著提升性能并降低数据库负载。具体实施方法如下:利用内置的并发安全哈希表 sync.map 实现简单缓存;对于大规模缓存,可与分布式缓存系统 memcached 交互,例如使用 memcache
Go语言的高并发场景中如何实现有效的缓存策略?
2024-05-10

Java编程中常见的问题有哪些

本篇内容介绍了“Java编程中常见的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!字符串连接误用错误的写法:String s =
2023-06-17

常见的Java多线程问题有哪些

这篇文章主要介绍常见的Java多线程问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓
2023-06-02

android开发遇到的常见问题有哪些

1. 兼容性问题:由于Android设备的碎片化,不同设备的硬件和软件规格不同,开发者需要对不同设备进行适配和测试,以确保应用在各种设备上正常运行。2. 性能问题:Android设备资源有限,应用的性能优化是一个重要问题。开发者需要确保应用
2023-08-15

如何使用php函数解决高并发场景下的性能问题?

高并发场景是指系统在同一时间段内接收到大量的请求。在这种情况下,系统的性能会受到很大的挑战,因为处理大量请求可能会导致服务器响应时间过长,甚至造成系统崩溃。为了解决高并发场景下的性能问题,PHP提供了一些函数和技巧。下面将介绍一些常见的方法
2023-10-21

Java Interface常量存放的问题有哪些

这篇文章主要讲解了“Java Interface常量存放的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Interface常量存放的问题有哪些”吧!由于java inte
2023-06-03

HBuilderX开发小程序的常见问题有哪些

这篇文章给大家分享的是有关HBuilderX开发小程序的常见问题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第一步:你要有一个微信小程序,在微信开发者平台上至于怎样申请微信开发者appid和微信开发者平台
2023-06-29

Java中static关键字的常见问题有哪些

本文小编为大家详细介绍“Java中static关键字的常见问题有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中static关键字的常见问题有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、s
2023-06-29

微信小程序开发有哪些常见的问题

这篇文章主要介绍了微信小程序开发有哪些常见的问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序开发有哪些常见的问题文章都会有所收获,下面我们一起来看看吧。1.小你程序到底是什么?小程序是无需下载和安装
2023-06-27

微信小程序开发常见的问题有哪些

这篇文章主要介绍微信小程序开发常见的问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、什么是小程序? 和公众号类似,企业可自行认证申请发布,免费获取微信流量。但小程序比公众号的内容形式更丰富,兼顾网站、Ap
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录