Redis相关面试题(二)

一、Bit中不同命令使用的场景

请添加图片描述

二、什么是缓存击穿,缓存穿透,缓存雪崩?

缓存击穿:是指当某一个key的缓存过期时大并发量的请求同时访问key,瞬间击穿服务器直接访问到数据库,使得数据库处于负载情况
缓存穿透:是指缓存服务器中没有缓存数据,数据库中也没用符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去作用
缓存击穿是只击穿服务器端访问数据库,而缓存穿透是服务器端和数据库都没有的情况
缓存雪崩:是指当大量缓存同时过期或者缓存服务宕机,所有请求都直接访问数据库,造成数据高负载,影响性能,甚至数据库宕机

对于缓存击穿可以用异步加载、互斥锁和提前预热的办法解决

对于缓存穿透的防止常用的是布隆过滤器和黑名单的方式
布隆过滤器是一种比较巧妙的概率性数据结构,它可以告诉你数据一定不存在或可能存在,相比Map、Set、List等传统的数据结构,它占用的内存少、结构更高效

对于缓存雪崩的情况可以设置不同的过期时间和集群的方法实现

三、Redis的集群方式是什么?

典型回答

Redis有三种主要的集群模式,用于在分布式环境中实现高可用性和数据复制,模式主要是:主从模式、哨兵模式和Redis Cluster模式

1. 主从模式

主从模式是Redis中最简单的集群模式,这个模式主要是为了解决单点故障的问题,所以将数据复制多个副本中,这样即使有一台服务器出现故障,其他服务器依旧可以继续提供服务。

主从模式中主要包括一个主节点和多个从节点,主节点负责处理所有读和写操作,而从节点则复制主节点的数据,并且只处理读操作,当主节点出现故障时,可以将包含数据较多的从节点升级为主节点,实现故障转移,但是这个步骤需要手动实现

主从模式的优点:简单明了,适用于读多写少的场景
缺点:不具备自动转移功能的能力,没办法容错和恢复

哨兵模式

为了解决主从模式的不能自动容错及恢复的问题,Redis引入了一种哨兵模式的集群架构。

哨兵模式是在主从模式的基础上加入了哨兵节点,哨兵节点是一种特殊的Redis节点,用于监控主节点和从节点的状态。当主节点出现故障时,哨兵节点可以自动进行故障转移,选择一个包含数据较多的从节点升级为主节点,并通知其他节点和应用程序进行更新。

优点:解决了主从模式的不能自动转移故障的问题,提供了自动化监控和故障恢复机制
缺点:虽然可以自动故障转移但是还是不支持自动的数据分区,并且随着节点数量的增加,管理和配置的复杂性会增大

Cluster模式

Redis Cluster模式是Redis中推荐的一种分布式集群解决方案,它将数据自动分片到多个节点上,每个节点负责一部分数据

优点:真正实现了分布式存储,每个节点都可以处理读写请求,具备良好的水平扩展能力,内置数据分割、故障排查、和转移能力
缺点:相比于其他模式,更加复杂,需要更多的网络资源和配置管理,客户端需要支持集群特性,跨slot的数据操作可能涉及多个节点,有一定的复杂度

四、Redis过期键的删除策略?

Redis的Key是可以设置过期时间的,Redis的key有着两种删除策略:1.惰性删除,2.定期删除
** 1. 惰性删除**:当key过期时,先放着不管,当每次从键空间中获取key时,检查取得的键是否已经过期,如果已过期的话,就删除该键,如果没有过期,就返回该键
** 2.定期删除**:每隔一段时间就对数据库进行一次扫描检查,删除里面的过期键,至于要删除多少键,检查多少数据库,要由算法决定

五、Redis的内存删除策略有哪些?

Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
Redis提供了8种数据淘汰策略

LRU全称Least recently used, 淘汰的是最近最少被使用的数据项。(时间概念) 最近最少
LFU全称Least-frequently used,淘汰的是访问频率最低的数据项。 一直最少

  1. 默认策略 noeviction 不淘汰数据,写不进去返回错误
  2. 只针对设置过期的keys
    1. volatile-lru 根据LRU算法挑选数据淘汰
    2. volatile-lfu 根据LFU算法挑选数据淘汰
    3. volatile-random 随机挑选数据淘汰
    4. volatile-ttl 挑选越早过期的数据进行删除
  3. 所有keys
    1. allkeys-lru 根据LRU算法挑选数据淘汰
    2. allkeys-random 随机挑选数据淘汰
    3. allkeys-lfu LFU算法挑选数据淘汰

六、阐述Redis的主从同步机制?

Redis的主从同步机制是一种特别重要的特性,它允许数据从一个Redis主服务器复制到一个或多个从服务器。这种机制不仅可以提高系统的读取性能,还可以用于数据备份和高可用架构的设计
主要步骤:
第1-4步属于全量,第5步属于增量

  1. 从服务器向主服务器发送同步命令:sync
  2. 主服务器接收到同步命令后,会执行bgsave命令,在后台生成一个rdb文件,并使用一个缓冲区记录从现在开始执行的所有写命令
  3. 当主服务器执行完bgsave命令后,主服务器会将bgsave命令生成的rdb文件发送给从服务器
  4. 从服务器接收到这个rdb文件,然后加载到内存;之后主服务器会把刚刚在缓存区的命令同步过来,从服务器就会执行这些命令
  5. 以上处理完之后,主数据库每执行一个写命令,都将写命令发送给从数据库

七、Redis和Mysql数据库数据如何保持一致性?

我们在实际项目中经常使用到Redis缓存用来缓解数据库压力,但是当更新数据库时,我们一般采用延时双删策略。目前常用的做法是查询一个接口,先查询Redis,如果不存在则查询数据库,并将结果放入到Rdis中。

7.1 常见的更新策略

  1. 先删缓存,再更新数据库
  2. 先更新数据库,再删缓存
  3. 普通双删
  4. 延时双删

7.1.1 先删缓存,再更新数据库

在这里插入图片描述

  1. 线程A删除缓存数据,此时还没有更新数据库
  2. 线程B 查询缓存没有数据,查询数据库还是旧数据,放入缓存
  3. 线程C以及其他线程使用旧缓存数据,缓存和数据库不一致

7.1.2 先更新数据库,再删除缓存请添加图片描述

  1. 线程A更新数据库,此时还没有删除缓存
  2. 线程B以及其他线程此时还是使用的旧缓存数据,和数据库不一致

7.1.3 普通双删

请添加图片描述

  1. 线程A先删除缓存,再更新数据库,然后再删除一次缓存
  2. 线程B查询缓存时没有数据,在线程A更新数据库之前,查询到旧数据,此时系统时间切换到线程A执行删除缓存,然后又到线程B放入缓存旧数据
  3. 线程C针对线程A,查询到缓存没有数据,查询数据库的旧数据,然后将旧数据放入到缓存中
    这些都不能满足缓存和数据一致性

7.1.4 延时双删

请添加图片描述

  1. 线程A先删除缓存,之后再更新数据库
  2. 线程B和线程C查询数据时,才发现缓存中没有数据,就去查询数据库,线程B查询到的是旧数据,线程C查询到的是新数据,之后都放入到缓存中。
  3. 线程A延时3-5秒(时间一般要大于SQL执行时间+线程切换时间)后,再将缓存删除。之后其他线程再次查询缓存,发现没有数据,再去查询数据库并且放入缓存都是新数据
  4. 极端情况下,就是如线程D,延时时间超过线程A的延时时间后,再次将旧数据放入到缓存中,这时缓存和数据库的数据还不是一致的,所以延时双删也不是一定能够保证缓存和数据保持一致的

7.2 建议的解决方案

  1. 当发现缓存没有数据后,在执行查询数据库前,对该key进行加锁,查询数据库并放入缓存后再解锁,这样可以避免缓存击穿问题,当某个redis数据不存在时,大量线程并发查询数据库。
  2. 在需要执行双删前,对该Key进行加锁,之后执行删除缓存,更新数据库,放入新数据到缓存,在解锁。保证缓存和数据一致性。
  3. 加锁的Key都需要设置过期时间,避免因为宕机造成死锁。

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

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

相关文章

mysql8.4.2数据库做主从复制

linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包-CSDN博客文章浏览阅读472次,点赞7次,收藏4次。linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包https://blog.csdn.net/xikui1551/article/de…

C++的深拷贝和浅拷贝

浅拷贝是一种简单的拷贝方式,仅仅是复制对象的基本类型成员和指针成员的值,而不复制指针所指向的内存。这可能会导致两个对象共享相同的资源,从而引发潜在的问题,如内存泄漏、意外修改共享资源等。一般来说编译器默认帮我们实现的…

Openwrt配置ZeroTier,实现公网访问内网中服务器

ZeroTier注册&Openwrt初始配置 首先来到Openwrt的VPN→ZeroTier页面,进行一个很简单的注册 注册后去zerotier的网页管理页面进行一个很简单的创建网络 复制网络ID备用 在openwrt填写网络ID并启用。如果你需要访问内网主机勾上 自动客户端NAT 在zerotier网络管理…

十一、vector 类

Ⅰ . vector 的介绍和使用 01 vector 的介绍 vector 的文档介绍:vector ① vector 是表示可变大小数组的序列容器,既像数组,又不像数组 像体现在:同样采用连续存储空间存储元素,可以使用下标访问元素 不像体现在&…

大模型笔记5 Extractive QA任务评估

目录 Extractive QA任务评估 Extractive QA评测指标 precision, recall, f1 ROUGE 划分训练与评估数据集 token位置评估 单个token位置评估 输入label的token位置 预测token位置 评估 Wandb 共享机器同时登录 样本类别平衡 标记token label时对窗口进行筛选 训练…

IT运维岗适用的6本证书

作为IT从业人员,不断提升自身的专业技能和知识是提升职场竞争力、助力升职加薪的重要途径。特别是在运维领域,虽然工作看似简单,但实际上需要掌握的技术知识却相当全面。为了全面提升自己的技术能力,并证明自己的专业能力&#xf…

2024 年 7 月区块链游戏研报:市场波动与数据分化的挑战与机遇

作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 游戏研究页面 7 月份,加密货币市场波动显著,价格表现各异。比特币和 Solana 表现抢眼,与此同时,以太坊在美国市场推出现货以太坊…

Python酷库之旅-第三方库Pandas(073)

目录 一、用法精讲 296、pandas.Series.dt.as_unit方法 296-1、语法 296-2、参数 296-3、功能 296-4、返回值 296-5、说明 296-6、用法 296-6-1、数据准备 296-6-2、代码示例 296-6-3、结果输出 297、pandas.Series.dt.days属性 297-1、语法 297-2、参数 297-3、…

零售企业中 SRM 系统与开源 AI 智能名片商城系统的协同作用

摘要:本文深入探讨了 SRM 系统在零售企业与上游供应商关系管理中的关键作用,并引入开源 AI 智能名片商城系统,细致分析了两者如何协同助力零售企业优化供应链、提升竞争力。通过阐述 SRM 系统的功能模块及其对零售企业的多方面积极影响&#…

WEB渗透未授权访问篇-Redis

测试 redis-cli redis-cli -h 127.0.0.1 flunshall 192.168.0.110:6379>ping PONG 存在未授权访问 JS打内网 var cmd new XMLHttpRequest(); cmd.open("POST", "http://127.0.0.1:6379"); cmd.send(flushall\r\n); var c…

8月6日笔记

8月6日 红日靶场打靶继续 SHOW VARIABLES #用于显示服务器运行时的各种系统变量的当前设置。这些变量可以控制服务器的行为在 MySQL 中,general_log 和 general_log_file 是两个与“general”相关的系统变量,它们控制着服务器是否启用一般查询日志以及…

重庆市合川区第二届网络安全“钓鱼城“杯部分题解

MISC 下载文件后,进行分析 往下划看见smb 最开始以为是通过smb协议下载的文件 找半天没发现,往前翻了翻,看见了flag 存储为原始数据 通过上述分析发现开头是pk,保存为zip压缩包 发现需要密码 感觉是伪加密 使用工具一把梭 再…

鸿蒙AI功能开发【hiai引擎框架-人脸识别】 基础视觉服务-人脸检查

介绍 本示例展示了使用hiai引擎框架提供的人脸识别能力。 本示例模拟了在应用里,选择一张图片,识别其多个人脸信息并展示出来。包括人脸框、五官点位、置信度、人脸朝向(欧拉角) 需要使用hiai引擎框架通用文字识别接口hms.ai.f…

vue前端自适应布局,一步到位所有自适应

页面展示 实现内容 1,左右布局 左侧固定宽带,右侧自适应剩余的宽度。中间一条分割线,可以拖拉,自适应调整左右侧的宽度。左侧的高度超长自动出现横向滚动条,左侧宽度超长,自动出现竖向滚动条。 2&#x…

媒体资讯视频数据采集-lux的使用

lux(annie)是个github上的一个开源项目,可以使用他来下载网上各个平台的视频、音频、图片。 支持的站点也不少**(ps: 对于一些反爬机制较好的网站可能不能下载,比如抖音、快手)** ​ github使用说明页面提供windows、linux、M…

SpringMVC (发送请求——>参数传递—— >响应数据)

设置请求访问路径 RequestMapper:将请求访问路径和我们业务层的方法联系起来 ResponseBody:将我们业务层方法的返回值转化为json,xml或其他格式的数据返回给页面 两种请求 get请求 post请求 测试案例 RequestMapping("/getNameAndAge&…

可观测性(observability)

一、定义 wiki百科的定义 In software engineering, more specifically in distributed computing, observability is the ability to collect data about programs’ execution, modules’ internal states, and the communication among components.[1][2] To improve obser…

Linux 快速构建LAMP环境

目录 部署方式: 基础环境准备: 1.安装Apache服务 (1)安装Apache (2)安装一些Apache的扩展包 2.安装PHP语言 (1)下载php软件仓库 (2)指定php安装版本…

HAProxy七层负载均衡配置方案

HAProxy 一、准备二、配置HAProxy服务器1. 下载HAProxy2. 编写配置文件3. 启动HAProxy服务 三、配置后端服务①配置web服务器②配置php服务器 四、测试 一、准备 准备5台CentOS7服务器,IP地址如下: HAProxy 192.168.152.71web1 192.168.152.72web2 192.…

第九届世界3D渲染大赛火热报名中

世界渲染大赛是一个汇聚世界顶尖CG艺术家的大赛,目前已经成功举办了八届,神仙打架般的作品让众多3D艺术家们直呼过瘾,如今第九届也在火热进行中,快来与众多世界顶尖艺术家们一决高下吧!下面给大家介绍一下第九届的赛事…