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

欢迎关注公众号(通过文章导读关注:【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.mzph.cn/news/790802.shtml

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

相关文章

AMRT3D数字孪生引擎

产品概述 AMRT3D引擎是由眸瑞网络科技自主研发、拥有完全自主知识产权的一款全球首款轻量化3D图形引擎,引擎以核心的轻量化技术及AMRT轻量格式为支柱,专为数字孪生项目开发打造。 AMRT3D引擎提供一整套完善的数字孪生解决方案,在数据处理方…

PDF编辑和格式转换工具 Cisdem PDFMaster for Mac

Cisdem PDFMaster for Mac是一款功能强大的PDF编辑和格式转换工具。它为用户提供了直观且易于使用的界面,使常用功能触手可及,从而帮助用户轻松管理、编辑和转换PDF文件。 软件下载:Cisdem PDFMaster for Mac v6.0.0激活版下载 作为一款完整的…

自动化测试如何管理测试数据

前段时间,知识星球里有同学问到:自动化case越多,测试数据越多,数据的管理成本也越来越高,是否需要一个数据池来专门管理测试数据?这是一个好问题,也是很多测试同学在自动化测试实践中必须面对的…

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】 题目描述:解题思路一:双向链表,函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。一张图:知识点__slots__ 解题思路二:0解题思路三:0 题目描述&am…

JAVAEE之Spring, Spring Boot 和Spring MVC的关系以及区别

1.Spring, Spring Boot 和Spring MVC的关系以及区别 Spring: 简单来说, Spring 是⼀个开发应⽤框架,什么样的框架呢,有这么⼏个标签:轻量级、⼀ 站式、模块化,其⽬的是⽤于简化企业级应⽤程序开发 Spring的主要功能: 管理对象&am…

园区管理(源码+文档)

园区管理系统(小程序、ios、安卓都可部署) 文件包含内容程序简要说明含有功能项目截图客户端登录页我的退出登录发布详细注意事项公告列表入园记录主页我的资料电梯报修意见反馈客服入园申请注册招商列表 后台管理签到管理公告管理招商管理入园管理反馈报…

大数据毕业设计hadoop+spark旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 计算机毕业设计 机器学习 深度学习 知识图谱

基于hive数据仓库的贵州旅游景点数据分析系统的设计与实现 摘 要 随着旅游业的快速发展和数字化转型,旅游数据的收集和分析变得越来越重要。贵州省作为一个拥有丰富旅游资源的地区,旅游数据的分析对于促进旅游业的发展和提升旅游体验具有重要意义。基…

使用vscode写python项目时的一点小问题

一、工作区怎么切换 首先工作区就是文件夹,所以切换新的工作区就是打开新的文件夹。 方法有二: 1)ctrlk ctrlo 或者用2)文件-打开文件夹(文件在左上角第一个位置) 会出现类似的界面: 现在…

WPS二次开发系列:如何获取应用签名SHA256值

在申请WPS SDK授权版时候需要开发者提供应用包名和签名,应用包名好说,那如何生成符合WPS要求的应用签名(SHA256)呢,经笔者亲测,有如下两种方式可以实现获取第三方应用签名值(SHA256) 1. 方法一&…

Rust---复合数据类型之元组

目录 元组的使用输出结果 元组的使用 fn main() {// 创建一个元组let my_tuple : (i32, &str, f64) (10, "hello", 3.14);// 打印元组中的元素println!("{:?}", my_tuple);// 访问元组中的元素let first_element my_tuple.0; // 访问第一个元素let…

C#/WPF 使用开源Wav2Lip做自己的数字人(无需安装环境)

实现效果 Speaker Wav2Lip概述 2020年,来自印度海德拉巴大学和英国巴斯大学的团队,在ACM MM2020发表了的一篇论文《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild 》,在文章中,他们提出一个叫做Wa…

最优算法100例之26-翻转单词顺序

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句…

全自动封箱机的工作原理:科技与效率的完美结合

随着科技的不断发展,越来越多的自动化设备走进了我们的日常生活和工业生产中。其中,全自动封箱机作为物流包装领域的重要一环,凭借其高效、精准的工作性能,正逐渐成为提升生产效率、降低劳动成本的得力助手。星派就来与大家深入探…

网络原理 - HTTP / HTTPS(2)——http请求

目录 一、认识 “方法”(method) 1、GET方法 2、POST方法 (1)登录 (2)上传 (3)GET和POST使用习惯 3、GET方法和POST方法的区别 正确滴 关于一些网上的说法,错误滴…

Kimi精选提示词,总结PPT内容

大家好,我是子云,最近真是觉得Kimi这个大模型,产品体验很棒,能力也是不错,感觉产品经理用心了。 发现一个Kimi 一个小技巧,可以学习到很多高级提示词。 Kimi输入框可以配置常用提示词,同时也可…

51单片机学习笔记14 LCD1602显示屏使用

51单片机学习笔记14 LCD1602显示屏使用 一、LCD1602介绍1. 简介2. 引脚定义3. DDRAM4. 字模5. 指令(1)清屏指令 0x01(2)光标归位指令 0x02(3)进入模式设置指令 0x06(4)显示开关控制指…

Chatgpt掘金之旅—有爱AI商业实战篇|聊天机器人|(四)

演示站点: https://ai.uaai.cn 对话模块 聊天机器人企业知识库:https://work.jingyuai.com/ 鲸鱼AI知识库 官方论坛: www.jingyuai.com 京娱AI 聊天机器人创建服务,随着企业越来越多地寻求创新的方式与客户互动,聊天机…

Windows下Docker搭建Flink集群

编写docker-compose.yml 参照:https://github.com/docker-flink/examples/blob/master/docker-compose.yml version: "2.1" services:jobmanager:image: flink:1.14.4-scala_2.11expose:- "6123"ports:- "18081:8081"command: jobma…

Linux:logrotate日志轮循分割

比如httpd产生的日志,如果你没做任何设置,他会一直把日志都输出到一个文件中,这个文件会越来越大,httpd就有一个日志切割工具,他可以去分割你的日志,但是无法去轮循日志 日志切割的作用:防止文件…

解锁金融数据中心场景,实现国产化AD替代,宁盾身份域管为信创电脑、应用提供统一管理

随着信创国产化改造持续推进,越来越多的金融机构不断采购信创服务器、PC、办公软件等,其 IT 基础设施逐渐迁移至国产化 IT 架构下。为支撑国产化 IT 基础设施的正常使用和集中管理运维,某金融机构数据中心的微软Active Directory(…