【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);
    }
    @Override
    protected 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 实现的问题,如果不限制使⽤特定的数据结构,可以直接采⽤上述⽅案来进 ⾏简单实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于YOLO8学习(三)训练自定义的数据集

前文 关于YOLO8学习&#xff08;一&#xff09;环境搭建&#xff0c;官方检测模型部署到手机 关于YOLO8学习&#xff08;二&#xff09;数据集收集&#xff0c;处理 简介 本文将会讲解&#xff1a; &#xff08;1&#xff09;如何通过PyCharm&#xff0c;进行训练数据&#…

关于Clion开发stm32printf重定向问题简单解决问题方法

title: 关于Clion开发stm32printf重定向问题简单解决问题方法 tags: STM32Clion 参考来源1 这是另一种方法 在printf 重定向的基础上加上 一句 setbuf(stdout,NULL); 参考来源2 自己写的笔记啦

TCP重传机制——快速重传

TCP 有一种快速重传机制&#xff0c;它不以时间为驱动&#xff0c;而是以数据驱动重传。 在上图&#xff0c;发送方发出了 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 份数据&#xff1a; 第一份 Seq1 先送到了&#xff0c;于是就 Ack 回 2&#xff1b;结果 Seq2…

【研发管理】产品经理知识体系-产品创新流程

导读&#xff1a;产品创新流程是一个系统性的过程&#xff0c;旨在通过创造和引入新的产品或改进现有产品来满足市场需求、解决用户问题或实现竞争优势。 目录 1、产品创新引论 2、决策基本框架 3、模糊前端 4、产品创新流程模型概论 5、门径管理流程 6、并行工程和集成产…

AC+AP三层组网实验(华为)

一&#xff0c;技术简介 APAC架构是一种常见的无线局域网&#xff08;WLAN&#xff09;组网方式&#xff0c;主要由接入点&#xff08;Access Point&#xff0c;简称AP&#xff09;和接入控制器&#xff08;Access Controller&#xff0c;简称AC&#xff09;组成。 在APAC架构…

Gitea 上传用户签名

在 Gitea 的用户管理部分&#xff0c;有一个 SSH 和 GPG 的选项。 单击这个选项&#xff0c;可以在选项上添加 Key。 Key 的来源 如是 Windows 的用户&#xff0c;可以选择 Kleopatra 这个软件。 通过这个软件生成的 Key 的界面中有一个导出功能。 单击这个导出&#xff0c;…

【Python可视化】pyecharts

Echarts 是一个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可。而 Python 是一门富有表达力的语言&#xff0c;很适合用于数据处理。当数据分析遇上数据可视化时&#xff0c;pyecharts 诞生了。 需要安…

three.js入门指南

WebGL和Three.js的概念 什么是WebGL WebGL是基于OpenGL ES 2.0的Web标准&#xff0c;可以通过HTML5 Canvas元素作为DOM接口访问。 也就是WebGL是作为OpenGL的网页端入口。它作为一个底层标准&#xff0c;然后我们可以通过JavaScript代码&#xff0c;在网页上实现三维图形的渲…

恶补《操作系统》4_2——王道学习笔记

4.1_5 文件存储空间管理 1、存储空间的划分与初始化 文件卷&#xff08;逻辑卷&#xff09;的概念目录区与文件区 2、几种管理方法 空闲表法&#xff1a;首位置长度&#xff0c;回收时注意修改空闲链表法&#xff08;空闲盘块链、空闲盘区链&#xff09;位示图法 成组链接法…

连接HiveMQ代理器实现MQTT协议传输

先下载MQTTX: MQTTX: Your All-in-one MQTT Client Toolbox 使用线上免费的MQTTX BROKER:The Free Global Public MQTT Broker | Try Now | EMQ 打开MQTTX,创建连接,点击NEW SUBSCRIPTION,创建一个主题,这里使用test/topic,在下面Json中填写配置好的主题,点击发送测试OK。…

Redis-单机安装

试图从官网注册不了我也不知道什么情况。 网盘自取吧&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1KERBQaH9gCT10AGt9z0_jg?pwdyjen 安装比较简单&#xff0c;照着敲就完了每一步都试过了&#xff0c;先单机安装&#xff0c;后面搭建集群。 1.将安装包放到/usr/…

ARP防火墙能够为网络安全贡献什么样的力量

ARP防火墙&#xff08;Address Resolution Protocol Firewall&#xff09;作为网络安全的一环&#xff0c;起到保护网络免受ARP欺骗攻击的关键作用。今天德迅云安全给您介绍ARP防火墙的相关方面&#xff0c;帮助您深入了解和认识这一关键的安全措施。 网络安全对于现代社会的信…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(四)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 当我们牢记登陆账户、…

【简单讲解下npm常用命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《电-氢-混氢天然气耦合的城市综合能源系统低碳优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

政安晨:【Keras机器学习示例演绎】(三十二)—— 在 Vision Transformers 中学习标记化

目录 导言 导入 超参数 加载并准备 CIFAR-10 数据集 数据扩增 位置嵌入模块 变压器的 MLP 模块 令牌学习器模块 变换器组 带有 TokenLearner 模块的 ViT 模型 培训实用程序 使用 TokenLearner 培训和评估 ViT 实验结果 参数数量 最终说明 政安晨的个人主页&…

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

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

政安晨:【Keras机器学习示例演绎】(三十三)—— 知识提炼

目录 设置 构建 Distiller() 类 创建学生和教师模型 准备数据集 培训教师 将教师模型蒸馏给学生模型 从头开始训练学生进行比较 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够…

基于Spring Boot的医疗服务系统设计与实现

基于Spring Boot的医疗服务系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 医疗服务系统首页界面图&#xff0c;公告信息、医疗地图…

快速幂笔记

快速幂即为快速求出一个数的幂&#xff0c;这样可以避免TLE&#xff08;超时&#xff09;的错误。 传送门&#xff1a;快速幂模板 前置知识&#xff1a; 1) 又 2) 代码&#xff1a; #include <bits/stdc.h> using namespace std; int quickPower(int a, int b) {int…