Redis的用法及面试题(删除策略、企业级解决方案)

news2024/11/25 20:45:29

目录

一、Redis删除策略

(1)过期数据

(2)数据删除策略 

1.定时删除 

2.惰性删除

(3)逐出算法

二、企业级解决方案 

(1)缓存预热

(2)缓存雪崩 

(3)缓存击穿 (解决热点key问题)

(4)缓存穿透

三、Redis面试题 

(1)Redis采用单线程,如何保证高并发?

(2) 这样做的好处是什么?

(3)Redis的持久化方案有哪些?

(4)Redis在项目中的哪些地方有用到?

 (5)Redis实现分布式锁

 (6)如何实现数据库与缓存数据一致


一、Redis删除策略

(1)过期数据

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态

XX :具有时效性的数据

-1 :永久有效的数据

-2 :已经过期的数据或被删除的数据或未定义的数据

问:过期的数据真的删除了吗?

答:不是的

(2)数据删除策略 

数据删除策略的目标

在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕 机或内存泄露

删除策略有:

  1. 定时删除
  2. 惰性删除
  3. 定期删除

1.定时删除 

创建一个定时器,到时间立即删除

属于拿时间换空间,对CPU性能要求比较高

2.惰性删除

数据到达过期时间不立即删除,当下次访问的时候才会删除

属于拿空间换时间,对空间的占用比较大

3.定期删除

数据达到过期时间,隔一会儿删除一部分、隔一会儿再删一部分

这样对CPU的性能和空间都会比较友好

定时删除节约内存,无占用不分时段占用CPU资源
惰性删除内存占用严重延时执行,CPU利用率高
定期删除内存定期随机清理每秒花费固定的CPU资源维护内存

(3)逐出算法

当新数据进入redis时,内存不足则就要用到逐出算法了

逐出算法有两种方式:

lru:挑选最近最少使用的数据淘汰

lfu:挑选最近使用次数最少的数据淘汰

二、企业级解决方案 

(1)缓存预热

就服务器重启后请求数据过大,会出现“宕机”问题,就可以使用缓存预热。就是在系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候先查询数据库,然后再将数据缓存的问题。

(2)缓存雪崩 

指在同一时间段大量的缓存key同时失效,或Redis服务宕机,导致大量请求到达数据库带来大量压力。

解决方案: 

  1. 给不同的key的TTL添加随机值
  2. 利用Redis集群提高服务的可用性
  3. 给缓存业务添加降级限流策略
  4. 给业务添加多级缓存

(3)缓存击穿 (解决热点key问题)

就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

解决方案: 

  1. 互斥锁
    1. 因为锁能实现互斥性。假设线程过来,只能一个人一个人的来访问数据库,从而避免对于数据库访问压 力过大,但这也会影响查询的性能,因为此时会让查询的性能从并行变成了串行,我们可以采用tryLock方法 + double check来解决这样的问题。

  2. 逻辑过期
    1. 我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我 们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据不就一直占用我们 内存了吗,我们可以采用逻辑过期方案。我们把过期时间设置在 redis的value中,注意:这个过期时间并不会直接作用于redis,而是我们后续 通过逻辑去处理。假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1去获得互斥锁,那么其他线程会进行阻塞,获得了锁的线程他会开启一个 线程去进行 以前的重构数据 的逻辑,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访 问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把 重建数据构建完后,其他线程才能走返回正确的数据。 这种方案巧妙在于,异步的构建缓存,缺点在于在构建完缓存之前,返回的都是脏数据。

(4)缓存穿透

客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

如图所示请求先在Redis中查找,找不到就会穿透缓存,进入到数据库中去 ,这样就会导致资源的浪费;而且我们知道数据库能够承载的并发不如redis那么高,如果有大量的请求同时来访问这种不存在的数据,就有可能会出现错误。

解决方案: 

  1. 缓存空对象

缓存空对象就是哪怕这个数据在数据库中不存在,我们也把 这个数据存入到redis中去,这样下次用户来访问这个不存在的数据,那么在Redis中也能找到这个数据,就不会进入到数据库中去了,如图所示:

  • 优点:实现简单,维护方便
  • 缺点
  1. 额外的内存消耗
  2. 可能造成短期不一致

        2.布隆过滤 

如上图所示, 布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思 想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数 据后,再将其放入到redis中, 假设布隆过滤器判断这个数据不存在,则直接返回。

  • 优点:内存占用较少,没有多余key
  • 缺点:实现复杂,存在误判可能

三、Redis面试题 

(1)Redis采用单线程,如何保证高并发?

Redis快的主要原因是:

  1. 完全基于内存
  2. 数据结构简单,对数据操作也简单
  3. 使用多路 I/O 复用模型,充分利用CPU资源

(2) 这样做的好处是什么?

单线程优势有下面几点:

  • 代码更清晰,处理逻辑更简单
  • 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为锁而导致的性能消耗
  • 不存在多进程或者多线程导致的CPU切换,充分利用CPU资源

(3)Redis的持久化方案有哪些?

(4)Redis在项目中的哪些地方有用到?

 (5)Redis实现分布式锁

为了避免“超卖“”问题与并发问题,我们引入了分布式锁

分布式锁是一种多节点共享的同步机制,通过在多个节点之间协调访问资源,确保在同一时间只有一个节点能够获取锁并执行关键操作。在电商网站中,可以将每个商品的库存作为共享资源,使用分布式锁来控制并发访问

分布式锁的目的是保证在分布式部署的应用集群中,多个服务在请求同一个方法或者同一个业务操作的情况下,对应业务逻辑只能被一台机器上的一个线程执行,避免出现并发问题 。

分布式锁要满足的条件:

  • 多进程互斥:同一时刻,只有一个进程可以获取锁
  • 保证锁可以释放:任务结束或出现异常,锁一定要释放,避免死锁
  • 阻塞锁(可选):获取锁失败时可否重试
  • 重入锁(可选):获取锁的代码递归调用时,依然可以获取锁

 (6)如何实现数据库与缓存数据一致

实现方案有下面几种:

  • 本地缓存同步:当前微服务的数据库数据与缓存数据同步,可以直接在数据库修改时加入对Redis的修改逻辑,保证一致。
  • 跨服务缓存同步:服务A调用了服务B,并对查询结果缓存。服务B数据库修改,可以通过MQ通知服务A,服务A修改Redis缓存数据
  • 通用方案:使用Canal框架,伪装成MySQL的salve节点,监听MySQL的binLog变化,然后修改Redis缓存数据(主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费)

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

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

相关文章

【Spring面试】八、事务相关

文章目录 Q1、事务的四大特性是什么?Q2、Spring支持的事务管理类型有哪些?Spring事务实现方式有哪些?Q3、说一下Spring的事务传播行为Q4、说一下Spring的事务隔离Q5、Spring事务的实现原理Q6、Spring事务传播行为的实现原理是什么&#xff1f…

神经网络 07(正则化)

一、正则化 在设计机器学习算法时不仅要求在训练集上误差小,而且希望在新样本上的泛化能力强。许多机器学习算法都采用相关的策略来减小测试误差,这些策略被统称为正则化。因为神经网络的强大的表示能力经常遇到过拟合,所以需要使用不同形式的…

第4章_freeRTOS入门与工程实践之开发板使用

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id724601559592 配套资料获取:https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

Charles的Map Remote功能

1、charles的Map Remote功能(指定的网络请求重定向到另一个网址),说白了就是你本来要请求A接口拿数据,重定向后,你实际请求的是B接口,拿到的是B接口返回的数据。 入口Tools->Map Remote 本次测试过程中…

【教程】IDEA操作GIT

不小心推送代码之后 进行回退 1 找到需要回退的记录 比如要回退13分钟之前提交的代码 选中 右键还原提交 最后再重新推送被还原的提交 就可以了

78基于matlab的BiLSTM分类算法,输出迭代曲线,测试集和训练集分类结果和混淆矩阵,程序有详细注释,数据可更换自己的,程序已调通,可直接运行。

基于matlab的BiLSTM分类算法,输出迭代曲线,测试集和训练集分类结果和混淆矩阵,程序有详细注释,数据可更换自己的,程序已调通,可直接运行。 78 matlabBiLSTM模式识别混淆矩阵 (xiaohongshu.com)https://www.…

PAT(Advanced Level) Practice(with python)——1118 Birds in Forest

code N int(input())birds [[] for i in range(10001)] vis [0 for i in range(10001)] max_bird 0 tree_id 0# 染色问题,并查集,如果没染色,深度搜索并染色 def dfs(cur):vis[cur] tree_idfor b in birds[cur]:if vis[b]0:dfs(b)for …

kubernetes进阶 (三) 基础练习

前两天朋友给了我几道题,看着挺简单的,但实际做的时候发现坑不少,这里做下笔记 一、镜像构建部署lnmp 1、构建镜像 nginx、php、mysql 要求使用centos7作为基础镜像 2、使用deployment部署上面的容器,要求3个服务要放到一个pod中(虽然这样是…

基于STM32CUBEMX驱动TOF模块VL53l0x(2)----修改设备地址

基于STM32CUBEMX驱动TOF模块VL53l0x----2.修改设备地址 概述视频教学样品申请修改设备地址主程序测试结果 概述 本章主要介绍如何修改VL53L0X传感器的I2C地址,并成功驱动设备以使用新的地址。VL53L0X是一种多功能、高性能的接近和环境光传感器,常用于测…

UMA 2 - 创建自己的UMA模型⭐二.给模型绑定骨骼 , 并建立符合UMA的骨骼结构

文章目录 🟥 寻找或者制作合适果模🟧 使用ActorCore AccuRig🟩 替换骨骼名称🟦 增加Global骨骼🟪 增加Position骨骼🟫 设置骨骼结构⬛ 删除无用骨骼⬜最终骨骼效果🟥 寻找或者制作合适果模 找到一个果模,需要导出fbx格式. 🟧 使用ActorCore AccuRig 将fbx导…

JVM 虚拟机 ----> Java 内存模型(JMM)

文章目录 Java 内存模型(JMM)一、运行时数据区域划分二、程序计数器(Program Counter Register)计数器的作用 三、Java 虚拟机栈(VM Stack)四、本地方法栈(Native Method Stack)五、…

fcpx视频编辑处理 Final Cut Pro for Mac

Final Cut Pro是一款专业的视频剪辑软件,适用于Mac操作系统。Final Cut Pro X版本在视频剪辑方面进行了大规模的更新和改进,下面将介绍Final Cut Pro X中的一些主要功能和特性: Magnetic Timeline。这个新功能使得多条剪辑片段如同磁铁般吸合…

Databend 开源周报第 110 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 使用 BendSQL 管…

班主任须知,查询发布技巧

Hey,亲爱的班主任们!今天小红书博主要跟你们分享一个超级实用的技巧,让你们的查询发布变得轻松又高效!它能帮你们把查询结果变成在线查询,让家长们随时随地都能轻松查询各种信息,简直就是教师“神器”。 通…

Fiddler抓包工具(详细讲解)

序章 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。也可以用来检测网络安全。反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的小功能用了之后就忘记了&…

SQL11 高级操作符练习(1)

描述 题目:现在运营想要找到男性且GPA在3.5以上(不包括3.5)的用户进行调研,请你取出相关数据。 示例:user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.036543female20北京大学3.242315female23浙…

《TCP/IP网络编程》阅读笔记--标准I/O和I/O流分离

目录 1--标准I/O 1-1--标准I/O的优缺点 1-2--FILE 指针和文件描述符的转换 1-3--基于Socket的标准I/O函数使用 2--I/O流分离 2-1--文件描述符的复制和半关闭 2-2--复制文件描述符实现 I/O 流的分离 1--标准I/O 1-1--标准I/O的优缺点 标准 I/O 函数的优点: ①…

基于SSM的农产品仓库管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Windows 安装 Nacos

1. 安装包下载: 2. 目录文件说明: 将下载好后的安装包进行解压: 3. 修改端口: 在Nacos的安装目录下,找到conf目录,然后打开nacos-server.properties文件,在配置文件中找到以下两个属性&#xff…

临沂大学图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

临沂大学图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书