首页 > 其他分享 >缓存击穿、缓存穿透、缓存雪崩等并发问题的解决思路

缓存击穿、缓存穿透、缓存雪崩等并发问题的解决思路

时间:2023-09-24 23:46:05浏览次数:34  
标签:缓存 数据库 Redis 并发 雪崩 读写

在微服务应用中,每个细微的问题都可能由于并发被无限放大。

并发场景下,比较常见的有:秒杀活动中的商品超卖问题数据冷热分离处理缓存/数据库双写一致性问题缓存击穿缓存穿透缓存雪崩问题等。

在Java基础中,解决并发的思路就是锁,而锁的本质就是将并发执行串行化,在微服务应用中,synchronized关键字、ReentrantLock类提供的各种lock方法均已失效,因为这些锁的作用域是一个服务的单个节点,对其他节点则无法生效。

单机锁不够用了,大佬们就弄了个分布式锁——Redisson/Zookeeper等框架。Redisson选择了AP、Zookeeper选择了CP,因此Redisson性能相对更快,Zookeeper则有效地保证了数据一致性。

用分布式锁,锁住商品id,每个商品则只会被售卖一次,避免商品超卖

用Redis缓存热门数据,并发请求会先去缓存中查询,未查询到再查询数据库,实现数据冷热分离

保证缓存/数据库双写一致性,则是将数据库读+写入缓存这两个操作加上读写锁中的读锁,修改操作加上读写锁中的写锁。读写锁是一种并发控制机制,同时支持读和写操作。在读写锁中,读操作可以并发进行,而写操作会独占锁。读锁也称为共享锁,是一种允许多个线程同时读取数据的锁。

缓存数据的有效时间增加随机偏移量,避免缓存数据同时过期引发缓存击穿带来的数据库压力。

缓存穿透则是频发查询缓存和数据库不存在的数据,这种情况往往伴随着恶意攻击,可以采取Bloom filter 等技术快速判断一些非法请求、增加参数校验、在缓存中设一个空置返回。

缓存雪崩则是Redis扛不住压力的请求量并发访问造成Redis崩溃,进而引起整个系统的大面积功能瘫痪,这种可以采取Redis Cluster集群+Sentinel控流降级应对。

 

标签:缓存,数据库,Redis,并发,雪崩,读写
From: https://www.cnblogs.com/ashet/p/17726955.html

相关文章

  • 【技术研究】并行和并发
    突然由TEB转向并行和并发是因为在研究线程和进程的时候,在研究切换线程的问题的时候,不明白在计算机当中,是怎么样在同样进程的不同线程,不同进程的不同线程当中切换的,特此再学习并行和并发。我的定义:并发:一个CPU在面对多个任务的时候,将任务分成多个碎块,给每个碎块一定的时间,然后执......
  • LRU缓存实现
    一.LRU缓存实现使用双向链表保证O(1)的优先度更改,同时当做优先队列维护插入顺序同时这里要结合哈希表,保证更改想要的节点/*定义Node双向链表节点定义remove进行删除节点(只删除节点在链表中的关系)定义update更新指定节点的优先度定义insert插入新的节点*/classLR......
  • 12张图一次性搞懂高性能并发容器ConcurrentLinkedQueue
    12张图一次性搞懂高性能并发容器ConcurrentLinkedQueue前言上篇文章聊到并发集合CopyOnWeiteArrayList的实现与特点,其不足之处是不适合写多的场景也不适合并发量大的场景本篇文章来聊聊并发场景下高性能的ConcurrentLinkedQueue阅读本文大概需要10分钟在阅读本文前,需要理解CAS......
  • 深入探讨Spring Boot中的Redis缓存
    介绍Redis是一种高性能的内存数据库,常用于缓存和消息队列等场景。在SpringBoot中,我们可以通过集成Redis来实现缓存功能。本文将深入探讨SpringBoot中的Redis缓存。集成Redis在SpringBoot中,我们可以通过添加以下依赖来集成Redis:<dependency><groupId>org.springframewor......
  • 力扣---146. LRU 缓存
    请你设计并实现一个满足  LRU(最近最少使用)缓存 约束的数据结构。实现 LRUCache 类:LRUCache(intcapacity) 以 正整数 作为容量 capacity 初始化LRU缓存intget(intkey) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。voidput(intkey,......
  • 呕血回顾一次提高接口并发的经历,很实用
    最近在开发一个打卡接口,其实只需要做些判断,保存一下打卡结果即可,预计同时段1000多人在线打卡,但是第一次写完之后,压测效果非常糟糕,可以看到只有十几的并发,喝下的水都要喷出来了,那么简单的接口都能耗时那么久的吗,我预估100ms以内准可以的,那还有上百的并发才对。于是开始了我的优化之......
  • 记一次缓存一致性中延迟双删的使用场景
    1、背景: 前边写了个这样的业务需求:从算法服务那边会不断的发送过来一些预警的数据和预警恢复的数据,当有新预警数据过来时,会进行数据库记录和redis缓存,当有该预警的恢复过来时会将数据库状态修改并清除缓存,我的做法是使用了缓存双删的策略,即先删缓存,再更新数据库,再删缓存。但是......
  • UE4之DDC缓存
    什么是DDC(DerivedDataCache)?简单来说,是一些缓存文件。在使用Editor的过程中,有可能会在编辑某些文件,或者使用某些文件的时候产生额外的数据。为了避免每次都需要重新产生一次数据,所以第一次产生完数据之后,会将数据序列化,并以缓存的形式保存下来。DerivedDataCache目录包含了为引用......
  • springboot项目可以是那些缓存技术
    SpringBoot项目可以使用多种缓存技术,下面列举了一些常见的缓存技术以及它们的优缺点:Redis:优点:Redis是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。其读写速度非常快,因为数据存储在内存中。Redis支持丰富的数据类型,如字符串、列表、集合、哈希、有序集合等,可以满足不同......
  • 三大缓存问题
    三大缓存问题缓存穿透什么是缓存穿透?怎么解决?缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数......