【Redis】Redis 高并发常见问题

这篇具有很好参考价值的文章主要介绍了【Redis】Redis 高并发常见问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目前市场上许多软件产品,其内部都采用 Redis 作为数据缓存的主要解决方案。随着业务的不断发展,在高并发场景里,Redis 常常会出现一些问题,网络上也有很多文章对其做出了总结。这里主要针对 缓存穿透、缓存雪崩、缓存击穿 这几类场景进行分析,并提出可能的处理方案。需要强调的是,以下的分析仅供参考,具体决策和实现效果必须要结合具体的业务场景,实事求是地进行应用

缓存穿透

缓存穿透指的是客户端向服务端请求 Redis 缓存和数据库中不存在的数据,导致所有的请求都穿透缓存处理阶段,直接打到数据库上。如果短时间内请求非常很多,数据库就会承受极大的压力。

发生 Redis 缓存穿透的场景可能会有以下几种:

  • 热点数据采用懒加载。用户正常发起请求,但由于缓存中没有数据,而数据库中有数据,导致短时间内大量请求同时访问数据库,造成数据库压力过大。

  • 数据库中有数据,且数据已经被缓存起来。用户正常发起请求,但恰好缓存中的数据过期了,从而导致大量请求同时访问数据库,造成数据库压力过大

  • 用户恶意发起大量请求,查询缓存和数据库中都不存在的数据,导致每次请求都要到数据库中查询,造成数据库压力过大。

针对上述情况,有以下解决方法可供参考:

  1. 参数校验。

    后端开发独立服务接口时,需要基于服务本身,对接口的请求入参做严格的校验和准入控制。对于不合理的请求参数,可适当 return null 或者空对象结束当前流程。对于后端来说,要有互不信任原则,毕竟无法确保用户或对接的业务方一定会严格按照接口设计传入安全的参数。

  2. 临时缓存。
    对于数据不存在的请求参数,也将其 key 与结果短暂缓存起来,这样能避免大量相同请求瞬间打到数据库上,减轻压力。但这种方式也只是缓解请求压力而已,之后还是要从根本上分析解决问题。如果是存在恶意访问的用户特征,则可以在网关层限制这些用户的请求。

  3. 热加载缓存。

    采用数据预热的方式。在可预见的大量请求到来之前,我们可以通过手动或者定时任务的方式,将相关的数据批量写入到 Redis 缓存中,这样就可以避免大量的基础数据请求直接打到数据库上,从而减轻数据库的读写压力,间接保护了数据库。

  4. 拦截请求。

    可使用 Redis 自带的布隆过滤器,让它维护所有合法的 key,多次接收到不合理的请求时,则主动拦截请求。这种方案有一定的误差,但在大量的请求中,能有效地过滤掉绝大多数异常的请求。关于布隆过滤器的介绍,可以参考这篇文章:布隆过滤器(Bloom Filter)原理解析

对于临时缓存空数据以及布隆过滤器两种方案的对比,可以参考这篇文章:【Redis】Redis 高并发处理策略

缓存雪崩

缓存雪崩是指缓存数据的过期时间过于集中,在缓存同一时间大面积失效的情况下,大量请求涌入数据库,导致数据库无法承受而崩溃的现象。

可采用的解决方案如下:

  1. 给缓存过期时间加随机时间

    在缓存过期时间基础上加上一个随机时间,使缓存过期时间散列开,避免缓存集中失效,有效防止缓存雪崩问题。但是,随机时间的设置需要合理,过长或过短都会对性能和缓存的使用效果产生负面影响。

  2. 加互斥锁

    互斥锁可以保证同一时间只有一个请求可以访问数据库进行数据缓存,避免了大量请求同时访问数据库。但是,这种方法会导致系统的吞吐量明显下降,需要根据实际业务来决定是否使用。

  3. 热点数据不设置过期时间

    热点数据不设置过期,请求可以一直获取到缓存的数据。但在这种情形下,用户请求不能确保获得的结果一定就是与数据库内容完全一致,这就涉及到一个数据一致性的问题。在某些业务场景下,还需要运维人员手动实现数据同步,保证缓存数据的正确性。

总而言之,缓存雪崩问题需要根据实际业务进行调整,不同业务的处理方式也不尽相同。在设置缓存过期时间时,需要合理设置随机时间,并根据业务需求来决定是否加入互斥锁。

缓存击穿

缓存击穿是指缓存的热点 key 过期或被删除后,导致线上原本能命中该热点 key 的请求,瞬间大量地打到数据库上,最终导致数据库被击垮。

可能导致缓存击穿的一些原因有:

  1. 热点 key 过期。缓存 key 过期,缓存数据查询失败,请求全都打到数据库上。
  2. 业务误操作。如果应用程序在处理数据时出现了误操作,例如错误地删除了缓存中的数据,就可能导致缓存击穿。
  3. 缓存设置不合理。如果应用程序缓存的数据量过大,或者缓存的数据类型与访问的数据类型不匹配,就可能导致缓存击穿。
  4. 黑客攻击:如果黑客攻击了应用程序的缓存,例如篡改了缓存数据,就可能导致缓存击穿。

应用程序开发人员需要根据实际情况进行排查,找出具体原因,及时进行解决。同时,应用程序开发人员还可以通过优化应用程序算法和缓存策略等方式来预防缓存击穿问题的发生。

可以采取以下防范措施防范缓存击穿问题:

  1. 及时维护缓存 key 和数据:缓存数据过期前及时更新缓存数据以及重置缓存 key 的过期时间,确保线上请求能够命中正确的 key 且拿到正确的数据。
  2. 加强权限管理:对线上请求的权限进行严格审核,避免误操作导致数据库崩溃。
  3. 优化数据结构:对数据结构进行优化,减少数据库被频繁访问的情况,提高缓存的命中率。
  4. 监控和预警:对线上请求和数据库操作进行实时监控和预警,及时发现问题并采取相应的措施,防止故障扩大化。

与缓存击穿相比,缓存雪崩指的是多个缓存失效导致的数据库接收请求过多的场景,而缓存击穿指的是单个缓存失效的场景。两者的处理思路可以互相参考。

Redis 服务可用性

缓存是 Redis 的一种,为了提高 Redis 的可用性,可以采取以下措施:文章来源地址https://www.toymoban.com/news/detail-424073.html

  1. 设置合理的过期时间。设置热点数据的过期时间,确保线上请求能够命中正确的 key。
  2. 加强权限管理。对线上请求的权限进行严格审核,特别是热点数据的访问权限,避免误操作导致数据库崩溃。
  3. 减少对缓存的依赖。对于热度非常大、访问频率非常高的数据,可以考虑在程序中加上本地缓存,比如 HashMap、List 等。
  4. 使用集群架构或主从 + 哨兵,提升保证 Redis 的可用性,如果主从挂了,可以自动将故障转移到备用主机上。
  5. 业务降级。从保护下游(接口或数据库)的角度考虑,针对大流量场景可以进行限流,这样即使缓存崩了,也不至于把下游服务给打挂。
  6. 降级开关和降级逻辑:提前写好降级开关和降级逻辑,关键时候执行降级方案,保证服务的正常进行。

到了这里,关于【Redis】Redis 高并发常见问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis缓存更新策略以及常见缓存问题

    缓存就是数据交换的缓冲区(Cache),是存储数据的临时地方,一般读写性能较好,常见缓存: Web应用中缓存有什么作用呢? 降低后端负载 提高读写效率,降低响应时间 缓存的成本: 数据的一致性成本 代码维护成本 运维成本 缓存作用模型: 给一段Redis作为缓存的具体案例代

    2024年02月16日
    浏览(50)
  • redis的配置和使用、redis的数据结构以及缓存遇见的常见问题

    目录 1.缓存 2.redis不仅仅可以做缓存,只不过说他的大部分场景,是做缓存。本地缓存重启后缓存里的东西就没有了,但是redis有。 3.redis有几个特性:查询快,但是是放到内存里的〈断电或者重启,数据就丢了),所以他有特定的持久化机制 4.服务器(centos)安装redis 5. redis在

    2024年02月14日
    浏览(47)
  • docker搭建redis三主三从集群,及其常见问题解决

    每个配置文件都要修改对应的端口 容器内端口不能都是是6379,集群总线接口是端口号+10000 端口号与network_mode: \\\"host\\\"不能一起配置,出现下述问题 “主机”网络模式与端口绑定不兼容 问题,具体看github,有对应解释。 如果一直卡在 Waiting for the cluster to join ,那一般是端口问题

    2024年02月11日
    浏览(56)
  • 【Redis 开发】分布式锁中的常见问题和Lua脚本

    分布式锁中我们设置的过期时间: 如果有一个线程获取锁之后在进行操作时,到达了锁的过期时间,之后就会有别的线程获得锁,如果这时,第一个线程执行完成后释放锁,就会将第二个锁的线程删除 针对这个情况如何改进: 在获取锁时存入线程标示(可以用UUID) 在释放

    2024年04月28日
    浏览(46)
  • 探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

    Redis是一种非常流行的开源缓存系统,用于缓存数据以提高应用程序性能。但是,如果我们不注意一些缓存问题,Redis也可能会导致一些性能问题。在本文中,我们将探讨Redis中的一些常见缓存问题,并提供解决方案。 缓存穿透指的是当一个请求尝试访问一个不存在于缓存中的

    2024年02月03日
    浏览(94)
  • RabbitMQ常见问题以及实际问题解决

    ** ** 消息可靠性问题: 消息从生产者发送到Exchange,再到queue,再到消费者,有哪些导致消息丢失的可能性? 发送时丢失: - 生产者发送的消息为送达exchange - 消息到达exchange后未到达queue MQ宕机,queue将消息丢失 consumer接收到消息后未消费就宕机 ①生产者消息确认 RabbitMQ提供

    2024年02月16日
    浏览(49)
  • Java开发中的常见问题和解决方法:如何解决常见的性能和bug问题

      在Java开发中,我们经常会面临各种各样的问题,包括性能问题和Bug。这些问题可能会导致应用程序的运行变慢、不稳定甚至崩溃。本文将介绍一些常见的Java开发问题,并提供解决这些问题的方法和技巧,帮助开发人员更好地处理性能和Bug问题。 性能问题是Java开发中最常见

    2024年02月09日
    浏览(55)
  • SAP 常见问题大全及问题解决大全

    1.A:在公司代码分配折旧表时报错?     在公司代码分配折旧表时报错,提示是“3000 的公司代码分录不完全-参见长文本”  希望各位大侠帮我看看。 3000 的公司代码分录不完全-参见长文本  R: a.你把零进项税的代码分配给这个公司代码就可以了 .没有指定非税代码,OBCL   

    2024年02月06日
    浏览(46)
  • Git常见问题与使用实际问题记录。

    git stash 是 Git 版本控制系统提供的一个命令,用于临时保存当前工作目录的修改。当您在进行代码开发时,可能会遇到需要暂时切换到其他分支或处理其他任务的情况,但又不想提交当前的修改。这时,您可以使用 git stash 命令来保存这些修改,以便稍后恢复并继续工作。

    2024年02月04日
    浏览(61)
  • SpringBoot常见问题

    告诉idea,这是一个maven项目 1.如果右侧有Maven选项,刷新一下 2.项目右键,添加Maven框架支持 注意事项:创建项目时,右下角会弹窗:load maven project 尽量下载,如果实在下不下来,就直接删掉 使用的是jdk17 springboot超过3.X 默认使用jdk17 修改jdk版本 一共三个地方 ----------------

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包