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

news2025/1/13 7:37:51

分享几个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 实现的问题,如果不限制使⽤特定的数据结构,可以直接采⽤上述⽅案来进 ⾏简单实现。

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

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

相关文章

50个前端实战项目之04:隐藏的搜索小组件

大家好&#xff0c;我是宝哥。 今天讲50个前端实战项目之04&#xff1a;隐藏的搜索小组件。 源码下载地址 https://github.com/bradtraversy/50projects50days/tree/master/hidden-search 前端实战项目系列正在更新&#xff1a;04/50 01&#xff1a;可展开卡片02&#xff1a;进…

Springboot+Vue项目-基于Java+MySQL的图书商城管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

中国各省地图(高清晰一亿像素)

hello&#xff0c;我是小索奇 不知道大家有没有使用地图的习惯&#xff0c;反正小索奇去一个地方&#xff0c;就会使用地图&#xff0c;也会经常看世界地图&#xff0c;因为地理学得不好&#xff0c;有时候也记不住部分省份在哪里。所以会经常使用到地图 但去百度搜索里面寻找…

windows驱动开发-PNP管理器

PNP技术是由Microsoft提出的&#xff0c;英文Plug and play的缩写&#xff0c;中译即插即用&#xff0c;意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序&#xff0c;做到插上就能用&#xff0c;无须人工干预&#xff0c;是Windows自带的一项技术。所谓即插即用是指将…

阿里云API网关 产品的使用笔记

阿里云的产品虽多&#xff0c;还是一如既往的一用一个看不懂&#xff0c;该模块的文档依旧保持“稳定”发挥&#xff0c;磕了半天才全部跑通。 用阿里云API网关的原因是&#xff0c;在Agent中写插件调用API的时候&#xff0c;需要使用Https协议&#xff0c;又嫌搞备案、证书等事…

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

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 简介 本文将会讲解: (1)如何通过PyCharm,进行训练数据,实现人脸检测 开发环境 win10、python 3.11、cmake、pytorch2.0.1+cu117、pycharm、ultralytics==8.0.134 要特…

解决layui的bug 在layui tree 组件中 禁用选中父节点后自动选中子节点功能

最近做权限管理后台&#xff0c;用了layui tree 组件&#xff0c;发现选中了父节点后&#xff0c;自动选中了子节点。不满足现实业务需求。所以微调了下源代码。 在用树形组件中&#xff0c;在用文档中 tree.setChecked(demoId, [2, 3]); //批量勾选 id 为 2、3 的节点 用这句…

Python 贪吃蛇

文章目录 效果图&#xff1a;项目目录结构main.pygame/apple.pygame/base.pygame/snake.pyconstant.py 效果图&#xff1a; 项目目录结构 main.py from snake.game.apple import Apple # 导入苹果类 from snake.game.base import * # 导入游戏基类 from snake.game.snake im…

基于SpringBoot的饭店外卖平台的设计与实现

项目描述 这是一款基于SpringBoot的饭店外卖平台的系统 模块描述 用户端 登录 首页 商家信息 点餐 菜品列表 下单 订单列表 账号下单列表 个人中心 个人资料 修改信息 评论管理 评论菜品 查看评论 打赏骑手 打赏骑手 管理员 登录 菜品管理 修改 下架 订单列表 下单记录 菜品管理…

Json数据概念及C# 环境下的序列化、反序列化操作

什么是Json&#xff1f; JSON的全称是JavaScript Object Notation&#xff0c;是一种轻量级的数据交换格式&#xff0c;主要用于数据的序列化和交互。常用于Web中&#xff0c;其他领域也经常出现JSON的身影。 与xml相比&#xff0c;更快&#xff0c;更小&#xff0c;更容易解析…

银河麒麟桌面版开机后网络无法自动链接 麒麟系统开机没有连接ens33

1.每次虚拟机开机启动麒麟操作系统&#xff0c;都要输入账号&#xff0c;密码。 进入点击这个ens33 内网才连接 2. 如何开机就脸上呢&#xff1f; 2.1. 进入 cd /etc/sysconfig/network-scripts 2.2 修改参数 onbootyes 改为yes 2.3 重启即可 a. 直接重启机器查看是否正常&…

搜好货API接口:快速获取商品列表的利器

搜好货商品列表API接口允许开发者根据关键字搜索并获取相关的商品列表数据。接口支持多种参数配置&#xff0c;可以根据需求灵活调整搜索条件和结果返回格式。 点击获取key和secret API接口请求说明 请求地址&#xff1a;https://api.souhaohuo.com/goods/search请求方法&…

第四篇:记忆的迷宫:探索计算机存储结构的奥秘与创新

记忆的迷宫&#xff1a;探索计算机存储结构的奥秘与创新 1 引言 1.1 计算机存储系统的发展与重要性 在现代计算技术中&#xff0c;存储系统承担着非常关键的角色&#xff0c;它不仅负责信息的持久保存&#xff0c;同时确保高效的数据访问速度&#xff0c;影响着整体系统性能的…

C++奇迹之旅:C++初阶模版

文章目录 &#x1f4dd;泛型编程&#x1f320; 函数模板&#x1f309;函数模板概念&#x1f309;函数模板格式&#x1f309;函数模板的原理 &#x1f320;函数模板的实例化&#x1f309;模板参数的匹配原则 &#x1f320;类模板&#x1f309; 类模板的定义格式&#x1f309;类模…

用vim或gvim编辑程序

vim其实不难使用&#xff0c;学习一下就好了。简单功能很快学会。它有三种模式&#xff1a;命令模式&#xff0c;编辑模式&#xff0c;视模式。打开时在命令模式。在命令模式下按 i 进入编辑模式&#xff0c;在编辑模式下按<Esc>键退出编辑模式。在命令模式按 :wq 保存文…

STM32入门学习之DMA

1.直接存储访问DMA(Direct Memory Access)&#xff1a;DMA传输不需要CPU的参与&#xff0c;直接在内存和I/O设备间开辟了一条新的数据传输通道&#xff0c;不仅提高数据传输的速率&#xff0c;还因为不需要CPU的干预&#xff0c;从而提高了CPU的利用率。(注&#xff1a;文中的资…

从永远到永远-和弦-挂留和弦

挂留和弦 1.概念2.指型1.Xsus2和弦2.Xsus4和弦 3.应用 1.概念 该篇说下和弦中的“渣男”、“绿茶”&#xff0c;挂留和弦。 挂留&#xff08;suspended&#xff09;和弦是将三和弦的三音替换成大二度或纯四度音形成的&#xff0c;包括挂留二和弦、挂留四和弦两种。 三音是一个…

【Android学习】简易计算器的实现

1.项目基础目录 新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。 另外 themes.xml中原来的 <style name"Theme.Learn" parent"Theme.MaterialComponents.DayNight.DarkActionBar">变为了&#xff0c;加上后可针对button中增加图片…

【nature review】用于非易失性射频开关技术的新兴存储电子器件

这篇文章是一篇关于非挥发性射频&#xff08;RF&#xff09;开关技术的综述文章&#xff0c;发表在《Nature Reviews Electrical Engineering》2024年1月的期刊上。文章详细介绍了新兴的基于记忆电子技术的RF开关技术&#xff0c;特别是在二维&#xff08;2D&#xff09;材料方…

Oracle23ai来了,23爱,全能、超级巨兽...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…