Redis面试篇2

1、Redis缓存刷新策略有哪些?

  • Redis提供了以下几种缓存刷新策略
    1. 基于过期时间:可以设置key的过期时间,当过期时间到达后,Redis会自动删除该key。
    2. 基于LRU算法:Redis使用LRU算法来淘汰最近最少使用的key,以保留热点数据。
    3. 基于LFU算法:Redis使用LFU算法来淘汰最不经常使用的key,以保留热点数据。
    4. 基于手动刷新:可以手动删除缓存中的key,或者通过发送通知来通知客户端删除key。
    5. 基于定时刷新:可以定时清空缓存,或者定时刷新缓存中的数据,以保持数据的及时性。

2、Redis持久化方式有哪些?有什么区别?

  • Redis提供两种持久化机制:RDB和AOF。
  • RDB(Redis DataBase)持久化:会将Redis在内存中的数据快照保存到磁盘上,形成一个RDB文件,该文件包含了Redis在某个时间点上的数据快照
    • 优点:
      1. 只有一个dump.rdb文件,方便持久化
      2. 容灾性好,一个文件可以保存到安全的磁盘。
      3. 性能最大化,fork子进程来完成写操作,让主进程继续处理命令,I/O最大化
      4. 数据集较大时,比AOF的启动效率更高。
    • 缺点:
      1. 数据安全性较低,RDB是间隔一段时间进行持久化,如果持久化之间Redis发生故障,会发生数据丢失,因此这种方式更适合数据要求不严谨的时候。
  • AOF(Append Only File)持久化:是将Redis写操作记录到一个文件中,每次Redis执行一条写命令,就将该命令写入AOF文件中,这样可以保证每条命令都能被保存下来。AOF文件可以进行追加和重写操作,当文件太大时,Redis会自动进行重写,将多次修改合并成一条,以减少磁盘占用空间。
    • 优点:
      1. 数据安全:AOF持久化可以配置appendfsync属性,它可以指定AOF文件的刷盘策略。默认情况下appendfsync的值为everysec。即每秒中将AOF缓存中的数据写入磁盘一次。但是,用户也可以将appendfsync的值设置为always,这样每次执行写操作都会立即将AOF缓存中的数据写入磁盘。这样即使Redis发生异常情况。只要AOF文件中已经记录了相应的写操作,就可以通过AOF文件来恢复数据。
      2. 数据一致性:AOF持久化是通过append模式写入文件的,即每次写操作都是追加到AOF文件末尾。因此,即使Redis在写入AOF文件的过程中宕机,AOF文件也不会损坏,而是只会丢失一部分的数据。当Redis重新启动是,会通过redis-check-aof工具将AOF文件中不一致的数据进行修复,保证数据的一致性。需要注意的是,使用AOF持久化时,如果Redis频繁执行写操作,那么AOF文件可能会非常大,可能影响性能。因此,用户可以通过配置AOF重写规则,定期对AOF文件进行压缩,以减小文件大小。
    • 缺点:
      1. AOF文件比RDB文件大,且恢复速度慢。
      2. 数据集较大时,比RDB启动效率低。
  • Redis支持同时使用RDB和AOF持久化机制。在使用时,Redis会先尝试使用AOF文件来恢复数据,如果AOF文件不存在或者恢复失败,Redis会尝试使用RDB文件来恢复数据。同时使用两种持久化机制可以在保证数据完整性的同时提高恢复速度。

3、 持久化有两种,那么该怎么选择呢?

  1. 不要仅仅使用RDB,因为那样会导致丢失很多数据。虽然RDB持久化机制的忒但是可以生成数据的快照,这样在恢复数据的时候非常快速。但是RDB持久化只在发生故障时执行,如果Redis崩溃或意外关闭,可能会丢失最近执行的一些命令。因此,建议使用AOF持久化来记录Redis执行的所有写操作,并将RDB持久化用于冷备。
  2. 也不要仅仅使用AOF,虽然AOF持久化机制可以记录Redis执行的所有写操作,因此在数据恢复方面会比RDB更加健壮,但是它也存在一些问题。如果仅使用AOF进行冷备,那么在恢复数据时,它可能会比RDB持久化慢。如果只使用AOF持久化,那么可能会因为AOF文件过大导致性能下降。
  3. Redis支持同时使用AOF和RDB持久化机制。使用AOF持久化可以保证数据不丢失,并作为数据恢复的首选,使用RDB持久化作为冷备,以提供快速数据恢复选项。这种方式可以利用AOF和RDB持久化机制的优点来提高数据安全性和恢复速度。
  4. 如果同时使用RDB和AOF持久化机制,在Redis重启时,会使用AOF来重构数据,因为AOF中的数据更加完整。

4、怎么使用Redis实现消息队列?

  • Redis可以使用list结构作为队列来实现消息队列,使用rpush生产消息,使用lpop消费消息。当lpop没有消息的时候,需要适当的sleep一会儿再重试。但是也可以使用blpop命令来阻塞住,直到消息到来,避免了sleep操作。
  • 如果需要实现生产一次消费多次的场景,可以使用pub/sub主题订阅者模式,实现1:N的消息队列。
  • 但是pub/sub的缺点是在消费者下线的情况下,生产的消息会丢失。因此,如果需要更可靠的消息队列,需要使用专业的消息队列,例如RabbitMQ。
  • 此外,Redis还可以使用sortedset结构来实现延时队列。使用时间戳作为score,消息内容作为key,调用zadd来生产消息。消费者可以使用zrangebyscore指令获取N秒之前的数据,然后轮询进行处理。

5、说说你对Redis事务的理解

  • 什么是Redis事务?
    • Redis中的事务是一组命令的集合,是Redis的最小执行单位。它可以保证一次执行多个命令,每个事务是一个单独的隔离操作,事务中的所有命令都会被序列化、按顺序地执行,服务端在执行事务的过程中,不会被其他客户端发送来的命令请求打断。Redis事务通过MULTI、EXEC、DISCARD、WATCH等命令来实现的。
命令作用
MULTI开启一个事务
EXEC提交事务,从命令队列中取出提交的操作命令,进行实际执行
DISCARD放弃一个事务,清空命令队列
WATCH检测一个或多个键的值在事务执行期间是否发生变化,如果发生变化,那么当前事务放弃执行
  • Redis事务的注意点有哪些?
    1. Redis事务是不支持回滚的。
    2. Redis服务端在执行事务的过程中,不会被其他客户端发送来的命令请求打断,直到事务命令全部执行完毕才会执行其他客户端的命令。
  • Redis事务为什么不支持回滚?
    • Redis的事务不支持回滚,但是执行的命令如果有语法错误,Redis会执行失败,这些问题可以从程序层面捕获并解决。但是如果出现其他问题,则依然会继续执行剩下的命令。这样做的原因是因为回滚需要增加很多工作,而不支持回滚可以保持简单、快速的特性。

6、Redis为什么设计成单线程的?

  • Redis的单线程设计是其高性能的重要原因之一。Redis单线程的设计思想主要是为了避免多线程带来的上下文切换、锁竞争等开销。从而提高Redis的效率和性能。
  • 具体来说,Redis单线程的设计主要有以下几个方面的考虑:
    1. 避免上下文切换:在多线程环境下,线程的切换会涉及到上下文的切换,这个切换本身就就会消耗CPU资源和时间。而Redis单线程的设计可以避免这种上下文切换的开销,从而提高Redis的性能。
    2. 避免锁竞争:在多线程环境下,线程之间共享数据时需要使用锁来保证数据的一致性和可靠性。而所本身也会带来开销和竞争,降低Redis的效率和性能。而Redis单线程的设计可以避免这种锁竞争的开销,从而提高Redis的性能。
    3. 减少内存分配:在多线程环境下,线程之间需要共享内存,而内存共享会涉及到内存分配和管理的开销。而Redis单线程的设计可以避免这种内存分配的开销,从而提高Redis的效率和性能。

7、什么是Bigkey?会存在什么影响

  • Bigkey指的是Redis中的大键,即占用内存较多的键值对。造成的影响如下:
    1. 内存占用:Bigkey会占用大量的内存资源,导致Redis内存不足,从而影响Redis的性能和可用性。
    2. 网络传输:Bigkey会增加网络传输的负担,因为在进行数据备份和复制的时候,需要将Bigkey的数据全部传输,从而增加了网络带宽的使用。
    3. 超时阻塞:由于Bigkey占用的空间较大,所以Redis在对其操作时,可能会消耗过长的时间,导致客户端超时阻塞。因为Redis采用单线程模型,当处理一个大key时,其他请求必须等待该操作完成后才能执行,而这个操作可能会需要较长的时间,从而导致阻塞。为了避免这种情况的发生,可以对bigkey进行拆分或优化。
    4. 内存碎片:Bigkey会导致Redis中出现内存碎片,从而影响Redis的内存使用效率,导致Redis内存占用率上升。

8、 说说Redis哈希槽的概念

  • Redis哈希槽是Redis集群中用来实现数据分片的一种机制,可以将所有的键均匀地分布到多个节点上,以实现高可用和高性能分布式数据存储。
  • 具体来说,Redis集群将整个数据集分为16384个哈希槽,每个节点负责其中的一部分哈希槽,节点之间通过Gossip协议进行通信,维护整个集群的状态。当一个客户端想要访问一个键时,Redis会根据键名计算出该键对应的哈希值,然后找到哈希槽的编号,再根据哈希槽的映射关系,将请求路由到对应节点上。

9、 Redis常见性能问题和解决方案有哪些?

  1. 网络延迟:Redis的性能很大程度上受限于网络延迟,因此需要尽可能减少网络传输次数和数据量,避免过多的网络IO操作
    • 解决方案:可以使用Redis的Pipline特性,将多个请求打包发送,减少网络传输的次数;也可以使用Redis的批量操作命令,将多个数据一次性提交,减少网络传输的数据量。
  2. 大量的数据读写:Redis的单线程模型会在高并发读写的情况下出现性能瓶颈,导致响应时间变长。
    • 解决方案:可以使用Redis的主从复制和集群特性,将数据分布在多个节点上,增加系统的读写并发能力。
  3. 慢查询:当Redis中存在大量慢查询操作时,会影响Redis的整体性能。
    • 解决方案:可以使用Redis的slowlog功能,记录Redis的慢查询操作,并使用Redis的监控工具进行监控,及时发现慢查询问题。
  4. 内存使用过多:Redis需要将所有的数据存储在内存中,当数据量过大时,会占用大量的内存资源,导致Redis的性能下降。
    • 解决方案:可以使用Redis的持久化功能,将数据写入磁盘中,以释放内存空间;也可以使用Redis的内存优化技巧,如删除不必要的数据、合理使用Redis的数据结构等。
  5. 阻塞操作:当Redis执行某些操作时,会阻塞其他操作的执行,从而影响Redis的整体性能。
    • 解决方案:可以使用Redis的异步操作特性,将阻塞操作转化为异步操作,以提高Redis的性能和吞吐量。

10、 如果Redis中有1亿个key,其中有10W个key是以某个固定的已知前缀开头的,如何将它们全部找出来?

  • 我们可以使用keys命令或scan命令,然而在数据量庞大的环境下,不推荐使用keys命令。
    1. keys命令是遍历查询的,时间复杂度为O(n),数据量越大查询时间越长,且Redis是单线程的,使用keys命令会导致线程阻塞一段时间,从而导致Redis会出现假死问题,直到keys命令执行完毕才能恢复,这在生产环境下是不可接受的。此外,keys命令没有分页功能,会一次性查询出所有符合条件的key值,输出的信息非常多。
    2. 相对来说,scan命令比keys命令更适合生产环境。sacn命令可以实现和keys命令相同的匹配功能,但是在执行过程中不会阻塞线程,并且查询的数据可能存在重复,需要客户端去重。因为scan命令是通过游标方式查询的,所以不会导致Redis出现假死问题。Redis在查询过程中会把游标返回给客户端,单词返回控制且游标不为0,则说明遍历还没有结束,客户端继续遍历查询。但是,scan命令在检索的过程中,被删除的元素是不会被查询出来的,如果在迭代过程中有元素被修改,scan命令也不能保证查询出对应的元素。相对来说,scan命令查找花费的时间会比keys命令长。
  • 补充:假死问题
    • Redis假死问题是指当Redis实例在进行某些耗时操作时(例如遍历所有key),由于Redis是单线程的,所以这个操作会导致Redis线程被阻塞,从而导致Redis无法处理其他请求,造成Redis服务不可用的状态。在这种情况下,Redis似乎已经死了,但其实Redis线程仍在执行操作,只是无法处理其他请求而已。因此,这种状态被称为Redis假死问题。避免Redis假死问题的常见方法是使用Redis提供的异步命令和管道技术,以避免在生产环境中会使用遍历所有key的操作。

11、如果有大量的key需要设置同一时间过期,一般需要注意什么?

  • 如果大量缓存同时失效,会导致大量的请求直接访问数据库,容易造成数据库崩溃或者降低数据库的性能,进而影响整个系统的稳定性。
  • 为了预防这种情况的发生,我们最好在设计数据过期时间的时候,都加上一个随机值,让过期时间更加分散,从而尽量避免大量的key在同一时刻失效。

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

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

相关文章

内部类基础

成员内部类 // 外部类 public class OuterClass { private String outerVar "Outer Variable"; // 成员内部类 public class MemberInnerClass { private String innerVar "Inner Variable"; // 内部类的方法,可以访问外部类的成员变…

案例:问题处理与原因分析报告的模板

系统上线后暴露的问题也是一种财富,我们需要从中吸收经验教训,规避其他类似的问题。对于上线后的问题如何进行原因分析,我提供两个分析报告的模板,供大家参考。 模板案例1:共性现象的原因分析报告 模板案例二&#xf…

Java后端面试很水的,7天就能搞定!

随着Java的越来越卷,面试也直接上难度了,从以前的八股文到场景题了,尤其是有经验的去面试,场景题都是会问的,近期面试过的应该都深有体会! 场景题230道: 1.分布式锁加锁失败后的等待逻辑是如何…

人脸表情行为识别系统源码分享

人脸表情行为识别系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Webstorm 中对 Node.js 后端项目进行断点调试

首先,肯定需要有一个启动服务器的命令脚本。 然后,写一个 debug 的配置: 然后,debug 模式 启动项目和 启动调试服务: 最后,发送请求,即可调试: 这几个关键按钮含义: 重启…

基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采样DHT11温湿度传感器检测温湿度,通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值,温度大于阈值则开启水泵,湿度大于阈值则开启风扇…

Golang 服务器虚拟化应用案例

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…

关于PPT生成的开源大模型总结

目前需要开源的PPT生成模型,在这里对github上的一些模型进行筛选 搜索关键词:ppt generate(more starts) williamfzc/chat-gpt-ppt: 支持直接生成PPT支持中英文需要调用ChatGPT(Add your token (official openai api k…

机器学习框架

机器学习框架 机器学习框架是用于开发和部署机器学习模型的软件工具。它们提供了一组API和工具,帮助开发人员在各种计算设备上构建、训练和部署机器学习模型。以下是几个常见的机器学习框架: 1.TensorFlow: TensorFlow是一个开源的人工智能…

【Matlab】Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表

Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表 初始数据 filename C:\Users\jia\Desktop\yadian\data\1Hz 2024_09_12 17_10_06.csv; 代码: clc;clear close all; % 读取Excel文件 filename C:\Users\jia\Desktop\yadian\data\1Hz …

智能手表(Smart Watch)项目

文章目录 前言一、智能手表(Smart Watch)简介二、系统组成三、软件框架四、IAP_F411 App4.1 MDK工程结构4.2 设计思路 五、Smart Watch App5.1 MDK工程结构5.2 片上外设5.3 板载驱动BSP5.4 硬件访问机制-HWDataAccess5.4.1 LVGL仿真和MDK工程的互相移植5…

注意,学会解决路由问题!(未完)

文章目录 Abstract1 Introduction2 相关工作3 注意力模型3.1 编码器3.2 解码器Abstract 最近提出的为组合优化问题学习启发式方法的想法很有前景,因为它可以节省昂贵的开发成本。然而,要将这一想法推向实际应用,我们需要更好的模型和更好的训练方法。我们在这两个方向都做出…

FreeRTOS-事件标志组

FreeRTOS-事件标志组 一、事件标志组简介二、事件标志组API函数三、事件标志组实验 一、事件标志组简介 事件标志位:用一个位来表示事件是否发生,裸机中的中断标志位等等事件标志组:是一组事件标志位的集合,简单认为就是一个整数…

C++ 秋招查缺补漏

结构体和类的区别 C 中 class 和 struct 区别 | 编程指北 (csguide.cn) C 中为了兼容 C 语言而保留了 C 语言的 struct 关键字,并且加以扩充了含义。 在 C 语言中,struct 只能包含成员变量,不能包含成员函数。 而在 C 中,str…

Java_Se 容器2(Set 接口)

Set接口继承自Collection接口,Set接口中没有新增方法,它和Collection接口保持完全一致。我们在前面学习List接口的使用方式,在Set中仍然适用。因此,学习Set的使用将没有任何难度。Set接口特点Set特点:无序、不可重复。…

国庆作业

day1 1.开发环境 Linux系统GCCFDBmakefilesqlite3 2.功能描述 项目功能: 服务器:处理客户端的请求,并将数据存入数据库中,客户端请求的数据从数据库进行获取,服务器转发给客户端。 用户客户端:实现账号的注册、登…

C++:string (用法篇)

文章目录 前言一、string 是什么?二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1)begin2)end3)使用 2. rbegin 与 r…

计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

yum 源配置

在/etc/yum.repo.d目录下 格式: [repository_name] nameRepository description baseurlhttp://repository_url enabled1 gpgcheck0 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 其中: [repository_name]:源的标识名称,…

数据处理方式,线程与进程,多任务,Spark与MR的区别

目录 数据处理的方式有哪些 单机数据处理 集群数据处理 分布式计算框架 MapReduce ApplicationMaster Spark分布式计算类别 进程与线程的区别 进程是计算时分配资源的最小单位 线程是执行计算任务的最小任务 多进程的执行效率没有多线程的执行效率高 多任务 Spark和M…