【Java核心能力】饿了么一面:Redis 面试连环炮

news2024/11/19 18:36:50

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

饿了么一面:Redis 面试连环炮

Redis用过吗,和本地缓存有啥区别?

Redis 是 分布式缓存 ,本地缓存是 单机缓存 ,那么在分布式系统中,如果将数据放在本地缓存中,其他节点肯定是无法进行访问了

其次就是 本地缓存相对于 Redis 缓存来说会更快 ,因为去 Redis 中查询数据虽然 Redis 基于内存操作比较快,但是应用还需要和 Redis 发起网络 IO ,而使用本地缓存就不需要网络 IO 了,因此本地缓存更快

Redis 的数据结构

Redis 有 5 种 基本数据结构 :String、List、Hash、Set(无序集合、值唯一)、Zset(有序集合)

我们都知道 Redis 速度是比较快的,因为他是基于 内存 操作,并且利用 IO 多路复用 来提升处理客户端连接上请求的速度,使用 单线程 处理客户端请求,速度很快

其次呢,Redis 对基本数据结构也做了许多优化

  • String 底层的 SDS 数据结构优化

字符串底层封装了 SDS 数据结构来实现,没有使用 C 语言默认的字符数组来实现,SDS 内部直接 存储了字符串的长度 len ,因此获取长度的时间复杂度为 O(1),而 C 语言字符串获取长度需要遍历字符串,时间复杂度为 O(N),并且 C 语言以 \0 表示字符串结尾,因此无法存储二进制数据,SDS 中记录字符串长度就不需要结尾标识符了,因此 可以存储二进制数据

SDS 中还采用了 空间预分配策略 ,在 SDS 进行空间扩展时,会同时分配 所需空间额外的未使用空间 ,以减少内存再分配次数

  • listPack 优化

Redis 7.0 之后,zipList 被废弃,转而使用 listPack 来代替,因为 zipList 中存在 级联更新 的问题:

假如 zipList 中每一个 entry 都是很接近但又不到 254B,此时每个 entry 的 prevlength 使用 1 个字节就可以保存上个节点的长度,但是此时如果向 zipList 中间插入一个新的节点,长度大于 254B,那么新插入节点后边的节点需要把 prevlength 扩展为 5B 来存储新插入节点的长度,那么扩展后该节点长度又大于 254B,因此后边节点需要再次扩展 prevlength 来存储该节点的长度,导致了插入节点后边的所有节点都需要更新 prevlength 的值,这属于是极端情况下才会发生

  • 跳表优化

并且使用 跳表 来优化 Zset 的性能,Zset 底层是通过 压缩列表 + 跳表 来实现的,跳表可以支持平均时间复杂度为 O(logN) 的查询操作

1697874023019

Redis的持久化机制

Redis 持久化机制有 AOF、RDB 和 混合持久化三种方式,这就是常规八股文了

要知道这三种持久化方式的区别:

使用 RDB 会进行全量备份,RDB 持久化文件时压缩后的二进制文件,因此加载 RDB 文件的速度是远超 AOF 的,不过缺点就是持久化不及时,可能丢失数据

RDB 持久化有两种方式 save 和 bgsave,save 会导致 Redis 阻塞,bgsave 会利用子进程对数据进行持久化,利用到了 写时复制技术 ,写时复制的优点就是利用单独子进程持久化,不会阻塞

AOF 会进行实时备份,AOF 文件中存储的是 RESP 协议数据格式,会存储 Redis 执行的每一条命令,因此实时性比较强,缺点就是速度比较慢(因为需要将命令刷入磁盘中),AOF 肯定不会对每一条命令都写入到磁盘中,而是会先写入到内存中,再统一刷入到磁盘中,刷盘策略分为三种:always(每条命令都立即刷入磁盘)、everysec( 默认 ,每秒同步一次)、no(Redis 不调用文件同步,而是交给操作系统自己判断同步时机)

AOF 文件过大的话,会进行 重写(Rewrite) 压缩体积,使用重写之后,就会将最新数据记录到 AOF 文件中,比如之前对于 name 属性设置了好多次,AOF 文件中记录了 set name n1,set name n2 …,那么在 重写 之后,AOF 文件中就直接记录了 set name nn,nn 就是 name 的最新值,通过这样来减小 AOF 文件体积是

混合持久化 (Redis4.0 提出)的话,结合了 RDB 和 AOF,既保证了 Redis 性能,又降低了数据丢失的风险,缺点就是 AOF 文件中包含了 RDB 格式的数据,可读性较差

Redis的内存如果满了,会发生什么?

Redis 的内存如果达到阈值,就会触发 内存淘汰机制 来选择一些数据进行淘汰,如果淘汰之后还没有内存的话,就会返回写操作 error 提示(Redis 内存阈值通过 redis.conf 的 maxmemory 参数来设置)

Redis 中提供了 8 种内存淘汰策略:

  • noeviction (默认策略):不删除键,返回错误 OOM ,只能读取不能写入

  • volatile-lru :针对设置了过期时间的 key,使用 LRU 算法进行淘汰

  • allkeys-lru :针对所有 key 使用 LRU 算法进行淘汰

  • volatile-lfu :针对设置了过期时间的 key,使用 LFU 算法进行淘汰

  • allkeys-lfu :针对所有 key 使用LFU 算法进行淘汰

  • volatile-random :从设置了过期时间的 key 中随机删除

  • allkeys-random : 从所有 key 中随机删除

  • volatile-ttl :删除生存时间最近的一个键

Redis如何实现事务?

Redis 自身提供了 事务功能 ,但是并没有 回滚机制 ,Redis 的事务可以顺序执行队列中的命令,保证其他客户端提交的命令不会插入到事务执行的命令序列中

Redis 提供了 MULTI、EXEC、DISCARD 和 WATCH 这些命令来支持事务

Redis 事务的缺点:

  • 不保证原子性: 事务执行过程中,如果所有命令入队时未报错,但是在事务提交之后,在执行的时候报错了,此时正确的命令仍然可以正常执行,因此 Redis 事务在该情况下不保证原子性
  • 事务中的每个命令都需要与 Redis 进行网络通信

因此 Redis 自身的事务使用的比较少,而是更多的使用 Lua 脚本 来保证命令执行原子性,使用 Lua 脚本的 好处

  • 减少网络开销: 多个请求以脚本的形式通过一次网络 IO 即可发送到 Redis
  • 原子操作: Redis 会原子性执行整个 Lua 脚本
  • 复用: 客户端的 Lua 脚本会永久存在Redis,之后可以复用

这里 Redis Lua 脚本的原子性指的是保证在执行 Lua 脚本的时候,不会被其他操作打断,从而保证了原子性,但是在 Lua 脚本中如果发生了异常,异常前的命令还是会被正常执行,并且无法进行回滚, 因此要注意 Lua 中保证的原子性是指在 Lua 脚本执行过程中不会被其他操作打断

Lua 脚本在执行过程中不会被打断,因此注意不要在 Lua 脚本中执行比较耗时的操作,导致 Redis 阻塞时间过长!

接下来还问了有 Redis 如何实现滑动窗口限流、常见的限流算法、漏桶和令牌桶限流有什么区别、如何进行选择,这一块限流的内容放在下一篇文章说明!

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

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

相关文章

flink1.18源码本地调试环境

01 源码本地调试环境搭建 1. 从github拉取源码创建本地项⽬ https://github.com/apache/flink.git 可以拉取github上官⽅代码 https://github.com/apache/flink.git GitHub - apache/flink: Apache Flink 2. 配置编译环境 ctrlaltshifts (或菜单)打…

zabbix 7.0 新增功能亮点(一)——T参数

概要: T参数是zabbix7.0新增的一项功能,它支持对配置文件进行可用性验证,即zabbix程序(server/proxy/agent等)修改配置文件后,支持-T或–test-config参数验证配置参数可用性。 T参数主要包含以下三个方面的应用场景: …

SQL语句生成器,支持MSSQL/MYSQL/SQLITE/ACCESS/EXCEL

经过7个月的艰苦开发,SQL语句生成器终于和各位见面了,因为工程量浩大,一度做到崩溃,差点烂尾,好在经过N次激烈思想斗争后还是坚持了下来累累累累累累累 本软件能够自动生成SQL语句及对应的易语言代码,还有相…

如何在Java中,使用jackson实现json缩进美化

导入的maven依赖 <!--json--> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.0</version> </dependency>示例代码 json要是String类型 public…

HarmonyOS NEXT应用开发之MVVM模式

应用通过状态去渲染更新UI是程序设计中相对复杂&#xff0c;但又十分重要的&#xff0c;往往决定了应用程序的性能。程序的状态数据通常包含了数组、对象&#xff0c;或者是嵌套对象组合而成。在这些情况下&#xff0c;ArkUI采取MVVM Model View ViewModel模式&#xff0c;其…

Linux TUN设备实现Tunnel性能分析

一、TUN/TAP设备原理&#xff1a; Linux的TUN/TAP设备是一种可以使得应用层与TCP/IP协议栈交互的驱动模块&#xff0c;通常用于组建虚拟局域网中的点对点隧道&#xff08;Tunnel&#xff09;&#xff0c;可以工作于2层&#xff08;TAP设备&#xff09;和3层&#xff08;TUN设备…

下载与安装Latex(windows简洁板)

总共要安装两个软件&#xff1a;TeX Live与TeX Studio 下载与安装TeX Live 下载 下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/ 点击&#xff1a; texlive2024.iso 文件很大&#xff0c;可能会慢点 2. 安装 下载好了iso文件&…

redis事务(redis features)

redis支持事务&#xff0c;也就是可以在一次请求中执行多个命令。redis中的事务主要是通过MULTI和EXEC这两个命令来实现的。 MULTI命令用来开启一个事务&#xff0c;事务开启之后&#xff0c;所有的命令就都会被放入到一个队列中&#xff0c;最后通过一个EXEC命令来执行事务中…

【项目新功能开发篇】开发编码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

C++ //练习 11.9 定义一个map,将单词与一个行号的list关联,list中保存的是单词所出现的行号。

C Primer&#xff08;第5版&#xff09; 练习 11.9 练习 11.9 定义一个map&#xff0c;将单词与一个行号的list关联&#xff0c;list中保存的是单词所出现的行号。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /***********…

c++20协程详解(三)

前言 前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程&#xff0c;于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识&#xff0c;主要包括&#xff08;模板偏特化&#xff0c;模板参数列表传值&#xff0c;模板函数…

Bat初級

目录 一、編碼發展史 二、Bat運行順序 1、Bat是從上到下逐句運行的。 三、一些Bat元素 1、和echo off 2、注釋 3、pause 4、errorlevel 5、title 6、COLOR 7、GOTO label 和 :label 8、FIND 9、START 目录 一、編碼發展史 二、Bat運行順序 1、Bat是從上到下逐句運行的。 三…

三维VR虚拟展馆打破传统展览的时间与空间限制

探索绿色未来&#xff0c;见证生态转型——这是长江经济带在国家发展蓝图中的承诺。如今&#xff0c;通过线上长江经济带发展阶段性成效展厅&#xff0c;这一承诺正以创新的互动体验呈现给公众&#xff0c;彰显了环境保护与经济增长的和谐统一。 深圳VR公司华锐视点精心策划的长…

学术前沿|通研院提出首个“对称现实”框架,探索智能时代人机共生新范式

人类正在迈入智能时代&#xff0c;其中一个显著特征是大量智能体的涌现。无论生物人、数字人和机器人&#xff0c;都是智能体的不同具身形式。为实现多种智能体在跨虚实空间的共存协作&#xff0c;探索人机共生的新范式&#xff0c;北京通用人工智能研究院&#xff08;简称通研…

Jenkins详细教程(下载安装、构建部署到Linux)

目录 第一章、快速了解Jenkins1.1&#xff09;Jenkins中一些概念介绍1.2&#xff09;Jenkins和maven用途上的区别1.3&#xff09;为什么使用Jenkins 第二章、Winodws下载安装Jenkins2.1&#xff09;安装之前的准备2.2&#xff09;Windows中Jenkins下载安装教程2.3&#xff09;J…

百度行驶证C++离线SDK V1.1 C#接入

百度行驶证C离线SDK V1.1 C#接入 目录 说明 效果 项目 代码 下载 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 SDK包结构 效果 项目 代码 using Newtonsoft.Json; using System; using System.Drawing; using System.Runtime.InteropServices; using System…

【Android、 kotlin】kotlin学习笔记

基本语法 fun main(){val a2var b "Hello"println("$ (a - 1} $b Kotlin!")} Variables 只赋值一次用val read-only variables with val 赋值多次用var mutable variables with var Standard output printin() and print() functions String templ…

蓝凌OA单点登录实现方案:以统一身份管理提升效率与安全新举措

蓝凌OA的优势与挑战 在数字化浪潮的推动下&#xff0c;企业对于高效、安全的身份管理需求愈发迫切。蓝凌OA系统&#xff0c;以其出色的流程管理和协同办公能力&#xff0c;已经成为众多企业实现数字化转型的重要工具。然而&#xff0c;随着企业信息化建设的不断深入&#xff0…

2024最新AI创作系统ChatGPT源码+Ai绘画网站源码,GPTs应用、AI换脸、插件系统、GPT文档分析、GPT语音对话一站式解决方案

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

微信小程序怎么制作?制作一个微信小程序需要多少钱?

随着移动互联网的快速发展&#xff0c;微信小程序已成为连接用户与服务的重要桥梁。它以其便捷性和易用性&#xff0c;为各类企业和个人提供了一个全新的展示和交易平台。那么&#xff0c;如何制作一个微信小程序&#xff1f;又需要投入多少资金呢&#xff1f;本文将为您提供全…