Rredis缓存常见面试题

文章目录

      • 1.什么是缓存穿透,怎么解决
      • 2.什么是缓存击穿,怎么解决
      • 3.什么是缓存雪崩,怎么解决
      • 4.双写一致性问题
      • 5.redisson添加的排他锁是如何保证读写、读读互斥的
      • 6.为什么不使用延迟双删
      • 7.redis做为缓存,数据的持久化是怎么做的
      • 8.redis的数据过期策略
      • 9.redis的数据淘汰策略

1.什么是缓存穿透,怎么解决

缓存穿透:查询一个不存在的数据,MySQL查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库
解决方案一:缓存空数据
当查询到一个不存在的数据,返回缓存空数据,但是当数据真正有的时候,缓存中还是空数据,就会导致数据不一致
解决方案二:布隆过滤器
在这里插入图片描述

位图的思路:通过hash运算三次得到三个对应的值,如果三个值都为1即存在,如果其中一个不为1即不存在,存在一定的误判率,但完全可以接受

2.什么是缓存击穿,怎么解决

缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间吧DB压垮
解决方案一:互斥锁,强一致,性能差
解决方案二:逻辑过期,高可用,性能优,不能保证数据绝对一致
在这里插入图片描述

3.什么是缓存雪崩,怎么解决

缓存雪崩:同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力
解决方案:
● 给不同的key的TTL添加随机值
● 利用Redis集群提高服务的可用性
● 给缓存业务添加降级限流策略 降级可做为系统的保底策略,适用于穿透、击穿、雪崩
● 给业务添加多级缓存

4.双写一致性问题

采用redisson实现的读写锁,在读的时候添加共享锁,可以保证读读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读读,读写都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一锁才行。
注意:这种情况只有必须保证强一致性的时候才会使用

开发中大部分是允许短暂的不一致的,这个时候采用异步的方案
● 使用MQ中间件,更新数据之后,通知缓存删除
● 利用canal中间件,不需要修改业务代码,伪装为MySQL的一个从节点,canal通过读取binlog数据更新缓存

5.redisson添加的排他锁是如何保证读写、读读互斥的

排他锁底层使用也是setnx,保证了同时只能由一个线程操作锁住的方法

6.为什么不使用延迟双删

延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据,其中这个延时多久不太好确定,在演示的过程中可能会出现脏数据,并不能保证强一致性,所以没有采用

7.redis做为缓存,数据的持久化是怎么做的

有两种方式,一种是RDB,一种是AOF
RDB是一个快照文件,它是把 redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据
AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据
在这里插入图片描述

RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令

8.redis的数据过期策略

第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key
第二种是定期删除,每隔一段时间,我们就对一些Key进行检查,删除里面过期的key
定期清理的两种模式:
● SLOW模式是定时任务,执行频率默认是10HZ,每次不超过25MS,以通过修改配置文件redis.conf的HZ选项来调整这个次数
● FAST模式执行频率不固定,每次时间循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms
Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用

9.redis的数据淘汰策略

  1. Redis提供了8种不同的数据淘汰策略,默认是noeviction不删除任何数据,内存不足直接报错
  2. LRU:最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高
  3. LFU:最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高
    平时开发过程种用的比较多的就是allkeys-lru,挑选最近最少使用的数据淘汰,把一些经常访问的key留在redis中

数据库有1000万数据,Redis只能缓存20W数据,如何保证Redis中的数据都是热点数据
回答:使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LInux脚本学习

1.注释 #单行注释 以 # 字符开头就是单行注释 当然第一行除外,比较特殊 2.多行注释 3.Shell文件的作用 Shell文件就是linux命令集 4.sh脚本的执行方式 bash xxx.sh 5.新建的文件会没有执行权限 #为文件赋予执行权限 chmod ux xxx.sh 6.编写规范 #!/bin/bash #…

Discuz! X3.5苗木_苗木网_苗木价格_苗木求购信息_苗木批发网模板utf-8

适合做苗木行业平台苗木网站、苗木信息网,提供苗木报价、各地苗木求购信息、绿化苗木采购招标、苗木基地展示、苗木百科知识、花木交易及苗木资讯、各地苗木信息网络行情。解压上传到template目录下,后台安装即可,包含PC手机端模板 下载地址:…

容器的底层技术:CGroup和NameSpace

无论是容器,还是虚拟机,都依赖于内核中的技术,虚拟机依赖的是 KVM,容器依赖的是 namespace 和 cgroup 对进程进行隔离和资源限制。 容器实现封闭的环境主要要靠两种技术,一种是看起来是隔离的技术,称为nam…

自然语言处理NLP概述

大家好,自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向,其研究能实现人与 计算机之间用自然语言进行有效通信的各种理论和方法。本文将从自然语言处理的本质、原理和应用三个方面,对其进行概述。 一、NLP的本质 NLP是一…

定时器-间歇函数

1.开启定时器 setInterval(function (){console.log(一秒执行一次)},1000) function fn(){console.log(一秒执行一次) } setInterval(fn,1000) //调用有名的函数,只写函数名 1.函数名字不需要加小括号 2.定时器返回是一个id数字 每个定时器的序号是不一样的 2.关…

Codigger Desktop:开发者的利器,每个人的好帮手(二)

昨日,我们为大家揭开了Codigger Desktop开发者利器的三种特性,展现了其独特的亮点。今日,我们将继续为大家呈现另外三项引人注目的特性,以展现这款工具的全面实力。 一、AI辅助:智能识别Module,环境配置一步…

【JAVASE】学习类与对象的创建和实例化

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 目标: 1. 掌握类的定义方式以及对象的实例化 2. …

鸿蒙OS开发实例:【应用事件打点】

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息。因此,应用开发者需要一种数据打点机制,用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent是在系统层面…

Day18-【Java SE进阶】多线程

一、线程 1. 什么是线程? 线程(Thread)是一个程序内部的一条执行流程。程序中如果只有一条执行流程,那这个程序就是单线程的程序。 2. 多线程 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 3. 如何在程序中创建出多条线程? Ja…

MyBatis动态SQL--if 标签

mybatis动态sql对我们来说是非常常见的,比如在下面这样一个场景中, 我们需要多条件查询,但是查询的条件又不是固定的,是可以动态改变的,那我们就需要用到动态sql去完成。 动态SQL之 if 标签 接下来我们介绍第一个动态…

【fastadmin】脚本模式下,日志钩子函数执行出现死循环,导致内存溢出奔溃

问题出现原因是想对项目中error级别的日志,接入钉钉告警,方便查看 于是使用钩子方法,日志写入完成后,自动调用自定义的告警方法中 1、在application/tags.php 中添加log_write_done > [app\\common\\behavior\\Common, ],2、在…

2024 蓝桥打卡Day31

递归与辗转相除法 递归(Recursion)辗转相除法(Euclidean Algorithm)总结 递归(Recursion) 递归是指一个函数在执行过程中调用自身的过程。在编程中,递归函数在遇到满足某个条件时会停止调用自身…