Java缓存面试题——Redis解决方案

news2025/1/14 1:06:12

文章目录

  • 1、什么是缓存击穿?该如何解决
  • 2、什么是缓存穿透?该如何解决
  • 3、什么是缓存雪崩?该如何解决
  • 4、什么是BigKey?该如何解决
    • bigkey的危害
    • 发现bigkey
    • 解决bigkey
  • 5、redis过期策略都有哪些?
  • 6、讲一讲Redis缓存的数据一致性问题和处理方案

1、什么是缓存击穿?该如何解决

缓存击穿是指一个热点的Key在某个瞬间过期失效了,持续的并发请求在缓存获取不到数据后直接请求数据库的现象。

如何解决

  1. 使用互斥锁
    在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先去设置一个互斥锁(比如Redis的SETNX),当获取到锁再进行load db的操作并回设缓存;否则就重试获取缓存的方法。
    伪代码如下图:

image.png

  1. 永远不过期
  • 不设置过期时间,就保证了不会出现热点key过期问题,也就是“物理”不过期。
  • 我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建。

2、什么是缓存穿透?该如何解决

缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。

造成缓存穿透的基本原因有两个

  1. 自身业务代码或者数据出现问题。
  2. 一些恶意攻击、爬虫等造成大量空命中。

image.png

如何解决

  1. 缓存空对象

当存储层不命中,到数据库查发现也没有命中,那么设置空值到缓存层中。不过空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。

  1. 布隆过滤器拦截

在访问缓存层和存储层之前,将存在的key用布隆过滤器提前保存起来,做第一层拦截。如果布隆过滤器认为该用户id不存在,那么就不会访问存储层,在一定程度保护了存储层。

image.png

这种方法适用于数据命中不高、数据相对固定、实时性低(通常是数据集较大)的应用场景,代码维护较为复杂,但是缓存空间占用少。

3、什么是缓存雪崩?该如何解决

缓存雪崩的英文原意是stampeding herd(奔逃的野牛),指的是缓存层宕掉后,流量会像奔逃的野牛一样,打向存储。
缓存层由于某些原因不能提供服务,比如同一时间缓存数据大面积失效,所有的请求都会达到存储层,存储层的调用量会暴增,造成级联宕机的情况。

如何解决

  1. 保证缓存层服务高可用性。
  2. 依赖隔离组件为后端限流并降级。
  3. 将缓存失效时间分散开,降低缓存过期时间的重复率。

4、什么是BigKey?该如何解决

bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。

bigkey的危害

  1. 内存空间不均匀:在Redis Cluster中,bigkey 会造成节点的内存空间使用不均匀。
  2. 超时阻塞:由于Redis单线程的特性,操作bigkey比较耗时,也就意味着阻塞Redis可能性增大。
  3. 网络拥塞:每次获取bigkey产生的网络流量较大

假设一个bigkey为1MB,每秒访问量为1000,那么每秒产生1000MB 的流量,对于普通的千兆网卡(按照字节算是128MB/s)的服务器来说简直是灭顶之灾。

发现bigkey

redis-cli --bigkeys可以命令统计bigkey的分布。

image.png

但是在生产环境中,开发和运维人员更希望自己可以定义bigkey的大小,而且更希望找到真正的bigkey都有哪些,这样才可以去定位、解决、优化问题。

判断一个key是否为bigkey,只需要执行debug object key查看serializedlength属性即可,它表示 key对应的value序列化之后的字节数。

image.png

解决bigkey

主要思路为拆分,对 big key 存储的数据 (big value)进行拆分,变成value1,value2… valueN等等。

例如big value 是个大list,可以拆成将list拆成。= list_1, list_2, list3, …listN

5、redis过期策略都有哪些?

当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。

在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。

当实际内存超出 maxmemory 时,Redis 提供了几种可选策略(maxmemory-policy) 来让用户自己决定该如何腾出新的空间以继续提供读写服务。

image.png

image.png

noeviction : 不会继续服务写请求,DEL请求可以继续服务,读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。

volatile-lru : 淘汰设置了过期时间的key,最少使用的key优先被淘汰。

volatile-ttl : 淘汰设置了过期时间的key,过期时间最接近的key优先被淘汰。

volatile-random : 淘汰设置了过期时间的key,随机选择一个key。

allkeys-lru : 所有的 key 中,最少使用的key优先被淘汰。

allkeys-random :所有的 key 中,淘汰随机的 key。

6、讲一讲Redis缓存的数据一致性问题和处理方案

只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。通常有以下几种同步方法:

  1. 先更新缓存,再更新数据库
    这个方案我们一般不考虑。这种方案如果不处理好,比如更新数据库失败之后没有回滚缓存,就会拿到错误的值。
    image.png

  2. 先更新数据库,再更新缓存
    这个方案也我们一般不考虑,原因跟第一个一样,数据库更新成功了,缓存更新失败,同样会出现数据不一致问题。同时还有以下问题:

    • 并发问题:同时有请求A和请求B进行更新操作,那么可能会出现:
      (1)线程A更新了数据库
      (2) 线程B更新了数据库
      (3) 线程B更新了缓存
      (4) 线程A更新了缓存

      这样会因为缓存更新顺序问题造成脏数据的产生。

    • 业务场景问题:如果是一个写数据库场景比较多,而读数据场景比较少的业务需求,采用这种方案就会导致:数据压根还没读到,缓存就被频繁的更新,浪费性能。

  3. 先删除缓存,后更新数据库
    该方案也会出问题,具体出现的原因如下。
    在这里插入图片描述
    (1)此时来了两个请求,请求 A(更新操作) 和请求 B(查询操作)
    (2) 请求 A 会先删除 Redis 中的数据,然后去数据库进行更新操作
    (3)此时请求 B 看到 Redis 中的数据时空的,会去数据库中查询该值,但是此时请求 A 并没有更新成功,得到旧值补录到 Redis 中

    利用延时双删策略解决这一问题,是在更新数据库后睡眠一会,将B写的脏数据再次删除,伪代码如下:

    			redis.delKey(X)
    			db.update(X)
    			Thread.sleep(N)
    			redis.delKey(X)
    
  4. 先更新数据库,后删除缓存
    这种方式,被称为Cache Aside Pattern,读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。

一般情况下我们可能会先用先更新DB,后删除缓存的操作。因为这种情况下缓存不一致性的情况只有可能是查询比删除慢的情况,而这种情况相对来说会少很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FL Studio 21 中文正式版发布支持多种超个性化主题

万众期待的 FL Studio 21 版本正式发布上线,目前在紧锣密鼓的安排上线中,届时所有购买正版 FL Studio 的用户,都可以免费升级到21版! 按照惯例,本次新版也会增加全新插件,来帮助大家更好地创作。今天先给大…

利用 NVIDIATAO 和 WeightBias 加速AI开发

利用 NVIDIATAO 和 Weight&Bias 加速AI开发 利用图像分类、对象检测、自动语音识别 (ASR) 和其他形式的 AI 可以推动公司和商业部门内部的大规模转型。 然而,从头开始构建人工智能和深度学习模型是一项艰巨的任务。 构建这些模型的一个共同先决条件是拥有大量高…

Java枚举详解

一.枚举 1.为什么有枚举? 如果我们的程序需要表示固定的几个值: 比如季节:spring (春),summer(夏),autumn(秋),winter(冬) 用常量表示: public static final int SEASON_SPRING 1;public st…

机械键盘不只有轴体的区别!键帽高度也有些学问

键盘键帽的学问有很多,上篇文章中,笔者和大家聊了键帽的材质和耐油污的问题。 除此之外,键帽的高度和字符的印刷方式也有不同,对于多数机械键盘来说,会发现每一列键帽的倾斜角度都略有不同,使用起来可以减少…

vue在history模式下打包部署问题解决

引言 项目使用的模板是element-template,由于业务需要,我将路由的hash模式更改为了history模式,然后在打包部署项目时就出现了问题 个人发现是资源的访问路径有问题,在部署之后发现每次访问的js资源路径前都会自动携带上我路由的…

如何使用SpringBoot ⽇志?

Spring Boot自定义日志的打印:在一个类中先获取到打印日志对象(日志框架提供的日志对象,而日志框架默认已经集成到Spring Boot里了,springboot默认使用 slf4jlogback);注意:得到日志对象Logger ->来自于slf4j2、使用目志对象提…

Operator-sdk 在 KaiwuDB 容器云中的使用

一、使用背景KaiwuDB Operator 是一个自动运维部署工具,可以在 Kubernetes 环境上部署 KaiwuDB集群,借助 Operator 可实现无缝运行在公有云厂商提供的 Kubernetes 平台上,让 KaiwuDB 成为真正的 Cloud-Native 数据库。使用传统的自动化工具会…

深度学习之 imgaug (图像增强)学习笔记

深度学习之 imgaug (图像增强)前言1\. 安装和卸载2\. 示例2.1 基本使用2.2 包含常用的变换示例3 Augmenters常用函数3.1 iaa.Sequential()3.2 iaa.someOf()3.3 iaa.OneOf()3.4 iaa.Sometimes()3.5 iaa.WithColorspace()3.6 iaa.WithChannels()3.7 iaa.No…

KingbaseES V8R3 表加密

前言 透明加密是指将数据库page加密后写入磁盘,当需要读取对应page时进行加密读取。此过程对于用户是透明, 用户无需干预。 该文档进行数据库V8R3版本测试透明加密功能,需要说明,该版本发布时间早于V8R6,所以只能进行表…

我带过的一名C++实习生——Z同学

刚开始带Z同学,吃饭聊天时,我顺便了解了下他的擅长:linux平台下C、C网络编程。 接下来的实习,主要分为两个阶段:小组公共培训和项目实训。 小组公共培训为期2周,主要学习和了解公司文化制度,讲师…

【项目设计】高并发内存池(三)[CentralCache的实现]

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

脏牛复现(CVE2016-5195)

nmap扫描全网段,发现存货主机,ip为192.168.85.141nmap 192.168.85.0/24nmap 扫描端口,发现80端口,访问该网站nmap -p1-65535 192.168.85.141扫描该网站目录,什么也没扫出来 ,dirb扫描目录的字典在usr/share…

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件,在leanback的依赖库中,这里介绍一些常用的组件,使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…

RocketMQ的一些使用理解

1.RocketMQ的生产者生产负载策略(3种) (1)SelectMessageQueueByHash (一致性hash) (2)SelectMessageQueueByMachineRoom (机器随机) (3)SelectMessageQueueByRandom (随机) 第1种一…

字符流定义及如何深入理解字符流的编码

IputSrem类和OupuSrem类在读写文件时操作的都是字节,如果希望在程序中操作字符,使用这两个类就不太方便,为此JDK提供了字符流。同字节流样,字符流也有两个抽象的顶级父类,分别是Reader和Writer其中,Reader是…

Nvidia jetson nano硬件架构

资料来源 官方文档中心 https://developer.nvidia.com/embedded/downloads -> 选jetson -> Jetson Nano Product Design Guide //产品设计指导(入口) //-> 1.1 References 列出了相关的文档 -> Jetson Nano Developer Kit Carrier Board Specification //板子标注…

MySQL实战之深入浅出索引(下)

1.前言 在上一篇文章中,我们介绍了InnoDB索引的数据结构模型,今天我们再继续聊一下跟MySQL索引有关的概念。 在介绍之前,我们先看一个问题: 表初始化语句 mysql> create table T ( ID int primary key, k int NOT NULL DEFA…

LeetCode 1237. Find Positive Integer Solution for a Given Equation【双指针,二分,交互】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

Linux学习--重定向

重定向的意思是&#xff0c;将数据传到其他地方。 符号解释>输出覆盖重定向>>输出追加重定向<或<<标准输入重定向 1、读取文件内容且写入到另一个文件中&#xff0c;覆盖写入文件内容 cat haha.txt > xixi.txt2、追加写入文件内容 cat haha.txt >&g…

2023,年轻人不想买钻石了?

【潮汐商业评论/ 原创】“钻石恒久远&#xff0c;一颗永流传。”很明显&#xff0c;Lily就是这句话的“受害者”。临近婚期的她&#xff0c;在婚戒的选择上犯起了愁&#xff0c;“我现在想到买钻戒&#xff0c;我就头大。买小的凑合一下&#xff0c;耳边传来的都是‘别买一克拉…