Redis 面试题 | 02.精选Redis高频面试题

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 5. Redis的分布式锁实现方式有哪些?
    • 6. Redis的过期键处理机制是怎样的?
    • 7. Redis的LRU算法是如何工作的?
    • 8. Redis的事务是如何实现的?

5. Redis的分布式锁实现方式有哪些?

Redis的分布式锁实现方式有以下几种:

  1. 客户端锁:客户端锁是指在客户端使用Redis的SET命令设置锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。客户端锁适用于简单的场景,如单客户端并发操作。

  2. 服务端锁:服务端锁是指在Redis服务器上使用SET命令设置锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。服务端锁适用于复杂的场景,如多客户端并发操作,可以保证锁的公平性和一致性。

  3. 分布式锁:分布式锁是指在Redis集群中使用SET命令设置锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。分布式锁可以保证锁的公平性和一致性,适用于高并发场景。

  4. 布隆过滤器:布隆过滤器是指使用Redis的布隆过滤器数据结构实现分布式锁,当客户端尝试获取锁时,如果锁已经被其他客户端持有,则返回失败。布隆过滤器可以保证锁的公平性和一致性,适用于高并发场景。

  5. 乐观锁:乐观锁是指在客户端使用Redis的WATCH、MULTI、EXEC等命令实现分布式锁,当客户端尝试获取锁时,如果锁已经被其他客户端更新,则返回失败。乐观锁可以保证锁的公平性和一致性,适用于高并发场景。

  6. 分布式锁服务:分布式锁服务是指使用第三方开源服务,如Redisson、REDIS-CLUSTER等,实现分布式锁。分布式锁服务可以提供高性能、高可用性和可扩展性的分布式锁服务。

6. Redis的过期键处理机制是怎样的?

Redis的过期键处理机制如下:

  1. 设置过期时间:在设置键值对时,可以通过EXPIRE命令设置键的过期时间,单位为秒。例如,SET mykey “Hello, World!” EXPIRE 10。

  2. 自动过期:当键的过期时间到达时,Redis会自动删除该键。

  3. 定期检查过期键:Redis会定期执行TTL命令,检查键的过期时间,如果过期时间到达,则自动删除该键。

  4. 手动删除过期键:可以使用PERSIST命令,将键的过期时间设置为永久,从而避免该键被自动删除。例如,PERSIST mykey。

  5. 过期键的内存占用:Redis会优先删除内存占用较大的过期键,以保证Redis的内存使用效率。

  6. 过期键的过期处理优先级:Redis会优先处理设置的过期时间,其次处理自动过期和定期检查过期的时间。

  7. 过期键的处理方式:Redis会根据键的过期时间、内存占用和处理优先级等条件,决定是否删除过期键。

  8. 过期键的处理策略:Redis提供了多种过期键的处理策略,如定期清理、LRU算法、LFU算法等,可以根据实际需求进行选择。

7. Redis的LRU算法是如何工作的?

Redis的LRU(Least Recently Used,最近最少使用)算法是一种缓存淘汰策略,用于根据键的使用情况决定是否删除缓存。

LRU算法的实现过程如下:

  1. 初始化:当Redis启动时,将所有键的访问时间设置为0,表示未访问。

  2. 访问键:当客户端访问键时,将该键的访问时间设置为当前时间,表示该键被访问。

  3. 淘汰键:当Redis的内存使用达到限制时,会执行LRU算法,选择最近最少使用的键进行淘汰。具体步骤如下:

    a. 计算每个键的访问时间,并将访问时间按照从小到大的顺序进行排序。

    b. 删除访问时间最早的键,即最近最少使用的键。

  4. 访问键:当客户端再次访问该键时,将该键的访问时间设置为当前时间,表示该键被访问。

  5. 更新访问时间:当Redis执行其他操作时,如设置键值对、执行过期处理等,也会更新键的访问时间,从而保证LRU算法的正确性。

  6. 定期检查:Redis会定期执行LRU命令,检查键的访问时间,以确保LRU算法的正确性。

LRU算法的优点是能够根据键的访问情况自动淘汰缓存,从而保证Redis的内存使用效率。但缺点是可能会导致客户端访问某个键时需要等待较长时间,因为该键的访问时间可能会被更新。

8. Redis的事务是如何实现的?

Redis的事务(Transaction)是指一组原子操作,保证整个操作要么全部成功,要么全部失败。Redis的事务实现是基于Redis的WATCH、MULTI、EXEC三个命令。

以下是Redis事务的实现过程:

  1. 客户端发送WATCH命令,指定要监视的键。例如,WATCH mykey1 mykey2。

  2. 客户端执行事务内的操作,例如设置键值对、修改键值等。

  3. 客户端发送MULTI命令,表示事务开始。例如,MULTI。

  4. 客户端执行事务内的操作,例如设置键值对、修改键值等。

  5. 客户端发送EXEC命令,表示事务提交。例如,EXEC。

  6. Redis服务器根据客户端发送的命令执行事务,如果事务执行成功,则返回客户端执行的所有操作的结果;如果事务执行失败,则返回错误信息。

Redis事务的优点是能够保证整个操作的原子性,即要么全部成功,要么全部失败。但缺点是需要客户端与服务器之间同步通信,可能会导致性能下降。

以下是Redis事务的示例:

WATCH mykey
SET mykey "Hello, World!"
MULTI
EXEC

在这个示例中,客户端首先使用WATCH命令监视mykey键,然后使用SET命令设置键的值为"Hello, World!"。接着,客户端使用MULTI命令开始事务,然后使用EXEC命令提交事务。如果mykey键已经被其他客户端修改,则事务执行失败,返回错误信息。如果mykey键未被修改,则事务执行成功,返回设置的键值对。

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

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

相关文章

【Linux】第三十一站:管道的一些应用

文章目录 一、我们之前的|(竖划线)管道二、自定义shell三、使用管道实现一个简易的进程池1.详解2.代码3.一个小bug4.最终代码 一、我们之前的|(竖划线)管道 cat test.txt | head -10 | tail -5如上代码所示,是我们之前所用的管道 我们拿下面这个举个例子 当我们用…

【Linux】安装n卡驱动以及可能遇到的问题

文章目录 1.换源以及更新2.安装依赖3. 安装n卡驱动独显与核显切换nvidia-settings消失忘记安装依赖无法进入图形化界面的急救命令行无响应办法 1.换源以及更新 目前,换源完全只需要鼠标点点点就可以完成了,打开应用列表里的Software & Updates&…

Spring DI

目录 什么是依赖注入 属性注入 构造函数注入 Setter 注入 依赖注入的优势 什么是依赖注入 依赖注入是一种设计模式,它通过外部实体(通常是容器)来注入一个对象的依赖关系,而不是在对象内部创建这些依赖关系。这种方式使得对象…

macOS修改默认时区显示中国时间

默认时区不是中国,显示时间不是中国时间 打开终端 ,删除旧区,并复制新时区到etcreb sudo -rm -rf /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 重启系统后时间显示为中国时间

SQL语句的执行顺序

查询语句语法: SELECT字段列表 FROM表名字段 WHERE条件列表 GROUP BY分组字段列表 HAVING分组后的条件列表 ORDER BY排序字段列表 LIMIT分页参数 执行顺序 #先找到表格 FROM表名字段 WHERE条件列表 GROUP BY分组字段列表 HAVING分组后的条件列表 SELECT字段列表 …

4.C语言——数组

数组 1.什么是数组2.一维数组1.数组定义2.数组赋值3.数组的使用4.数组的存储地址 3.二维数组1.数组定义2.数组赋值3.数组的使用4.数组的存储地址 4.数组名5.数组越界 1.什么是数组 数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量 所有的数组都是由…

【网站项目】329网月科技公司门户网站

🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

正则表达式初版

一、简介 REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通…

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)。 技术架构是对某一技术问题(需求)解决方案的结构化描述,由构成解决方案的组件结构及之间的交互关系构成。广义上的技术架构是一系列涵盖多类技术问题设计方案的统称,例如部署方案、存储方案、缓存…

Arduino开发实例-INA219 电流传感器驱动

INA219 电流传感器驱动 文章目录 INA219 电流传感器驱动1、INA219 电流传感器介绍2、硬件准备及接线3、代码实现1、INA219 电流传感器介绍 INA219 模块用于同时测量电流和电压。 该模块使用 I2C 通信传输电压和电流数据。 其他特性: 测量精度:1%最大测量电压:26V最大测量电…

Spring:StopWatch

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、输出总耗时 二、输出所有任务的耗时和占比 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、输出总耗时 public void stopWatc…

C++---判断闰年

一.闰年的定义 闰年是指在公历中,年份可以被4整除但不能被100整除的年份,或者可以被400整除的年份。简单来说,闰年是一个比平年多出一天的年份,即2月有29天。闰年的目的是校准公历与地球公转周期的差异,确保时间计算的…

自然语言推断:注意力之注意(Attending)

注意(Attending) 第一步是将一个文本序列中的词元与另一个序列中的每个词元对齐。假设前提是“我确实需要睡眠”,假设是“我累了”。由于语义上的相似性,我们不妨将假设中的“我”与前提中的“我”对齐,将假设中的“累…

ARM体系架构

1. 计算机组成 交叉开发: 程序的编写 编译 在 PC机上(宿主机) 但 运行在 开发板(目标机) 嵌入式开的的特点: 开发环境的不同: 交叉开发环境 以应用为中心, 围绕实际功能设计 软件和硬件 量体裁衣 1.1 计算机的基本组成部分: 输入设备 输出设备 存储器 运算器 控制器 总…

为什么 HTTPS 协议能保障数据传输的安全性?

HTTP 协议 在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层。 HTTP 协议是通过客户端和服务器的请求应答来进行通讯,目前协议由之前的 RFC 2616 拆…

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

文章目录 SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例Dubbo定义其核心部分包含: 工作原理为什么要用dubbo各个节点角色说明:调用关系说明: dubbo为什么需要和zookeeper结合使用,zookeeper在dubbo体系中起到什么作用&…

谷歌浏览器通过network模拟HTTP中的GET/POST请求获取response

1、F12打开network选中需要模拟的方法Copy->Copy as fetch 2、通过AI帮你进行转换一下调用格式 原代码 fetch("https://mp.amap.com/api/forward/aggregate?mtop.alsc.kbt.intergration.toolkit.call.queryCallBlockInfo", {"headers": {"acce…

Django开发_14_后台管理及分页器

一、后台管理 (一)登录 http://127.0.0.1:8000/admin/ (二)创建超级用户 manage.py createsuperuser (三)注册模型 admin.py: models [model1,model2,model3 ]ad…

浅析Java中volatile关键字

认识volatile关键字 Java中的volatile关键字用于修饰一个变量,当这个变量被多个线程共享时,这个变量的值如果发生更新,每个线程都能获取到最新的值。volatile关键字在多线程环境下还会禁止指令重排序,确保变量的赋值操作按照代码的…

VS Code + Python + Selenium 自动化测试基础-01

VS Code Python Selenium 自动化测试基础-01 让我们来讲一个故事为什么要写自动化开发前的准备工作牛刀小试开常用的web DriverAPI-定位元素id定位:find_element_by_id()name 定位:find_element_by_name()class 定位:find_element_by_class…