【Redis面试题】Redis常见的一些高频面试题

分享几个Redis入门级常见面试过程中遇到的题目!

你项目中哪里使用到了redis?可以讲一讲嘛

这个题目无论是大公司还是小公司都经常考,建议大家根据自己的项目做总结

redis的几种基础数据结构

redis为什么那么快?

1.基于内存实现:我们都知道内存读写是比磁盘读写快很多的。

2.合理的数据结构,他支持的数据结构如字符串、列表、集合等都是非常接近底层的,这意味着对数据的操作几乎是即时的。

3.redis的读写是单线程的。

4.Redis 使用非阻塞 I/O 模型,即事件驱动模型。这使得 Redis 能高效地处理来自客户端的多个连接和请求,即使在大量连接的情况下也能保持高性能。

从 Redis 6.0 开始,Redis 引入了对多线程的支持,但这种多线程的支持方式与传统的多线程数据库服务器有所不同。在 Redis 6.0 中,多线程主要用于处理网络 I/O,而不是数据的读写操作。

Redis 6.0 的多线程模型是一个有限的多线程模型,专注于优化网络 I/O 处理,而非数据操作。这种设计旨在提高 Redis 在多核 CPU 环境下处理大量并发网络请求的能力,同时保持其单线程执行命令的特性,确保操作的原子性和一致性。因此,尽管 Redis 6.0 支持多线程,但它的核心数据处理逻辑仍然是单线程的。

简述redis哨兵模式,缓存雪崩,缓存穿透,缓存击穿?

Redis 哨兵模式和缓存相关的几个问题(缓存雪崩、缓存穿透和缓存击穿)是分布式系统设计中常见的概念和问题。下面简要介绍每个概念:

Redis 哨兵模式(Sentinel)

Redis 哨兵模式是 Redis 的高可用性解决方案。在这种模式下,有一个或多个哨兵实例对 Redis 服务器(master 以及其 replicas)进行监控。哨兵的主要任务包括:

  1. 监控:哨兵会检测 Redis 主服务器和从服务器是否正常工作。
  2. 通知:当某个 Redis 实例出现问题时,哨兵可以通过 API 向管理员或其他应用程序发送通知。
  3. 自动故障转移:如果主服务器不可用,哨兵会自动将一个从服务器升级为新的主服务器,并让其他从服务器指向新的主服务器。
  4. 配置提供者:客户端可以询问哨兵当前哪个 Redis 实例是主服务器,并进行连接。

缓存雪崩

缓存雪崩是指在某一个时间点,由于大量的缓存同时失效,导致大量的请求直接落到数据库上,造成数据库压力骤增,甚至引发数据库宕机的现象。缓存雪崩可能因为缓存同一时间设置的过期时间导致的。

解决策略

  • 设置不同的过期时间,避免同时大量缓存过期。
  • 使用持久化存储作为备份,如 Redis 的 RDB 或 AOF。
  • 限流降级策略,避免数据库被打垮。

缓存穿透

缓存穿透是指查询一个数据库中不存在的数据。由于缓存是不命中的,每次查询都要到数据库查询,导致数据库压力增大。

解决策略

  • 对查询结果为空的情况也进行缓存,避免对同一数据的重复查询打到数据库上。
  • 使用布隆过滤器,将所有可能查询的数据哈希到一个足够大的位数组中,一个不存在的数据会被这个布隆过滤器拦截掉,从而避免对数据库的查询。

缓存击穿

缓存击穿是指一个热点的 key 在缓存中过期的瞬间,同时有大量的请求查询这个 key。这时,这些请求都会落到数据库上,造成数据库短时间内大量的请求压力。

解决策略

  • 设置热点数据永不过期,或者用互斥锁控制对这个 key 的数据库访问请求,确保即使缓存失效,对数据库的访问也是串行的。
  • 使用更细粒度的锁,例如分布式锁,来控制对这个热点 key 的访问。

理解这些概念和相应的解决策略对于设计高效、可靠的缓存系统至关重要,可以有效地提升应用的性能和稳定性。

Redis的缓存淘汰算法

FIFO(先进先出): 根据缓存被储存的时间,离当前最远的数据优先被淘汰

LRU(最近最少使用): 根据最近被使用的时间,离当前最远的数据优先被淘汰

LFU(最不经常使用): 在一段时间内,缓存数据被使用次数最少的会被淘汰

LRU 缓存实现

如果碰到这种题⽬先不要慌张,现在脑海⾥回忆⼀遍 LRU 的基本概念:LRU(Least Recently Used,最近最少使⽤)是⼀种缓存算法,其核⼼思想是将最近最少使⽤的缓存项移除,以便为更常 ⽤的缓存项腾出空间。

适⽤场景:

  • 频繁访问:LRU 算法适⽤于那些有频繁访问的数据,⽐如缓存、⻚⾯置换等场景。
  • 有局部性:当访问模式具有局部性,即近期访问的数据更可能在未来被再次访问时,LRU 算法 能够有较好的表现。
  • 数据访问分布均匀:如果数据的访问分布较为均匀,没有出现热点数据或周期性访问模式, LRU 算法的命中率较⾼。
  • 缓存容ᰁ适中:LRU 算法适⽤于缓存容ᰁ适中的场景,过⼤的缓存可能导致淘汰开销增⼤,⽽过⼩的缓存则可能导致频繁缓存失效。

在 Java 中,可以使⽤ LinkedHashMap 来实现 LRU 缓存。使⽤LinkedHashMap实现 LRU 缓存可 以极⼤地简化代码,因为LinkedHashMap已经内置了按照访问顺序排序的功能。所以使⽤LinkedHashMap 确实可以避免⼿动实现双向链表和节点的逻辑。

为了使⽤ LinkedHashMap 来实现 LRU 缓存,在创建 LinkedHashMap 对象时设置它的访问顺序为 true,这样元素将按照访问顺序进⾏排序。然后,我们可以重写它的 removeEldestEntry ⽅法来控制 是否移除最⽼的数据。

import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {private int capacity;    public LRUCache(int capacity) {super(capacity, 0.75f, true);this.capacity = capacity;}public int get(int key) {return super.getOrDefault(key, -1);}public void put(int key, int value) {super.put(key, value);}@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {// 当缓存元素个数超过容ᰁ时,移除最⽼的元素return size() > capacity;}public static void main(String[] args) {// 创建⼀个容ᰁ为3的LRU缓存LRUCache<Integer, String> lruCache = new LRUCache<>(3);// 添加数据lruCache.put(1, "One");lruCache.put(2, "Two");lruCache.put(3, "Three");// 此时缓存为:{1=One, 2=Two, 3=Three}// 访问某个元素,使其成为最近访问的元素String value = lruCache.get(2);// 此时缓存为:{1=One, 3=Three, 2=Two}// 添加新的数据,触发淘汰lruCache.put(4, "Four");// 此时缓存为:{3=Three, 2=Two, 4=Four}// 元素1被淘汰,因为它是最近最少访问的元素}
}

在上⾯的代码中, removeEldestEntry ⽅法是⽤于控制是否移除最⽼的数据。当缓存⼤⼩超过指定容 ᰁ时, removeEldestEntry 会返回 true,表示需要移除最⽼的数据。这样,通过 LinkedHashMap 和 重写 removeEldestEntry ⽅法,实现了⼀个简单的 LRU 缓存。

对于⾯试时遇到 LRU 实现的问题,如果不限制使⽤特定的数据结构,可以直接采⽤上述⽅案来进 ⾏简单实现。

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

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

相关文章

【neteq】tgcall的调用、neteq的创建及接收侧统计

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

STM32单片机实战开发笔记-EXIT外部中断检测

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab EXIT模块测试 功能描述 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型&a…

【C++】学习笔记——string_5

文章目录 六、string类7. string类的模拟实现8. string类的模拟实现的完整代码string.h头文件test.c源文件 9. string收尾写时拷贝 未完待续 六、string类 7. string类的模拟实现 我们之前讲了实现 insert &#xff0c;但是那个插入函数仅仅是在 pos 位置插入一个字符而且&am…

二、nodejs连接数据库实现登录功能

// 数据库下载可以用这个 DBeaver安装与使用教程&#xff08;超详细安装与使用教程&#xff09;&#xff0c;好用免费的数据库管理工具_dbeaver使用教程-CSDN博客 模块化 &#xff08;1&#xff09;新建一个叫Dao的文件夹&#xff0c;存接数据库代码 // 参考数据库 &#xf…

自动驾驶-第02课软件环境基础(ROSCMake)

1. 什么是ros 2. 为什么使用ros 3. ROS通信 3.1 Catkin编译系统

prometheus的安装与部署及其有点

一、Prometheus 的优点 1、非常少的外部依赖&#xff0c;安装使用超简单&#xff1b; 2、已经有非常多的系统集成 例如&#xff1a;docker HAProxy Nginx JMX等等&#xff1b; 3、服务自动化发现&#xff1b; 4、直接集成到代码&#xff1b; 5、设计思想是按照分布式、微服…

Flutter笔记:Widgets Easier组件库(10)快速处理承若型对话

Flutter笔记 使用Widgets Easier组件库快速处理承若型对话 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…

小程序账号设置以及request请求的封装

一般开发在小程序时&#xff0c;都会有测试版和正式版&#xff0c;这样在开发时会比较方便。 在开发时。产品经理都会给到测试账号和正式账号&#xff0c;后端给的接口也都会有测试环境用到的接口和正式环境用到的接口。 这里讲一讲我这边如何去做的。 1.在更目录随便命名一…

一机游领航旅游智慧化浪潮:借助前沿智能设备,革新旅游服务效率,构建高效便捷、生态友好的旅游服务新纪元,开启智慧旅游新时代

目录 一、引言 二、一机游的定义与特点 &#xff08;一&#xff09;一机游的定义 &#xff08;二&#xff09;一机游的特点 三、智能设备在旅游服务中的应用 &#xff08;一&#xff09;旅游前的信息查询与预订支付 &#xff08;二&#xff09;旅游中的导航导览与互动体…

MATLAB中功率谱密度计算pwelch函数使用详解

MATLAB中功率谱密度计算pwelch函数使用详解 目录 前言 一、pwelch函数简介 二、pwelch函数参数说明 三、pxx pwelch(x)示例 四、[pxx,f]pwelch(x,window,noverlap,nfft,fs)示例 四、[pxx,f] pwelch(x,window,noverlap,nfft,fs,freqrange,spectrumtype)示例 五、多通道功…

Springboot(SSM)项目实现数据脱敏

目录 一、引入hutool的依赖 二、sql脚本 三、自定义注解代码 3.1 自定义注解 3.2 自定义一个枚举,用于定义脱敏的类型 3.3 序列化 四、使用脱敏注解 4.1 Person.java 4.2 controller 4.3 dao 五、源代码参考 一、引入hutool的依赖 <dependency><groupId>…

FIFO Generate IP核使用——Native读写接口信号详解

Native FIFO接口信号是用于FIFO IP核与外部电路进行通信的信号。当FIFO支持独立的写和读时钟时&#xff0c;这些信号可以包括标准端口和可选端口。 1 当FIFO具有独立时钟时的接口信号 当FIFO具有独立的时钟时&#xff0c;其接口信号会相应地有所变化。特别是关于复位信号rst…

计算机等级考试2级(Python)知识点整理

计算机等级考试2级&#xff08;Python&#xff09;知识点整理 1.基础知识点&#xff08;记忆、理解&#xff09; 第1讲Python概述 01. 源代码 02. 目标代码 03. 编译和解释 04. 程序的基本编写方法 第2讲 Python语言基础&#xff08;一&#xff09; 01. 用缩进表示代码…

[数据结构]——非比较排序—计数排序

该篇文章 所涉及代码收录仓库&#xff1a;登录 - Gitee.com 目录 1.非比较排序——计数排序 2.最终实现 1.解析 2.以int a[] { 1,3,9,1,5,1,2,3,-5,-5,-2 };为例&#xff0c;手撕分析 3.代码实现 4.计数排序具有以下主要特性&#xff1a; 1.非比较排序——计数排序 思想…

Linux IP Forwarding路由转发实验

linux 路由转发功能 Linux 操作系统具备路由转发功能&#xff0c;路由功能是指 Linux 操作系统提供的路由管理和转发功能&#xff0c;它允许 Linux 主机在网络中正确地转发数据包&#xff0c;并确保数据包能够达到其目的地。 出于安全考虑&#xff0c;Linux系统默认是禁止数据…

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门 1、 for i in range(4):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(6)Dev.turnRight()3、 for i in range(3):Dev.turnRight()Dev.step(2)Dev.turnLeft()Dev.step(-3)4、 for i in range(4):Dev…

数字旅游以科技创新为核心竞争力:推动旅游服务的智能化、高效化,满足游客日益增长的旅游需求

一、引言 随着科技的飞速发展&#xff0c;数字旅游作为旅游业与信息技术结合的产物&#xff0c;正以其独特的魅力改变着传统旅游业的格局。科技创新作为数字旅游的核心竞争力&#xff0c;不仅推动了旅游服务的智能化、高效化&#xff0c;更满足了游客日益增长的旅游需求。本文…

香港理工大学内地事务总监陆海天教授确认出席“边缘智能2024 - AI开发者峰会”并发表主题演讲

隨著AI技術的日新月異&#xff0c;我們正步入一個邊緣計算智能化與分布式AI相互融合的新紀元。這一變革不僅推動了分布式智能創新應用的飛速發展&#xff0c;還使得邊緣智能——這一結合邊緣計算和智能技術的新興領域&#xff0c;逐漸成為引領AI發展的重要力量。通過其分布式和…

clang:在 Win10 上编译 MIDI 音乐程序(二)

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 访问 Swift.org - Download Swift 找到 Windows 10&#xff1a;x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ &#xff0c;安装后大约占…

走进香港美食宛如走进香港电影

&#xff08;1&#xff09; 过去蔡澜有个节目&#xff0c;专门介绍香港美食&#xff0c;身边美女相伴、眼里美景相随。 过去离香港海关近&#xff0c;有时候散步都能走到那里&#xff0c;打车时车都不蹦字儿。那时候精神头儿真好&#xff0c;周六一早6点就起来拖着大箱子过关&a…