Redis面试篇

目录

Redis面试篇

1.什么是Redis?作用是什么?

2.什么是缓存穿透、缓存击穿、缓存雪崩

2.1缓存穿透

2.2缓存击穿

2.3缓存雪崩

3.redis如何持久化

1. RDB(快照存储)

2. AOF(追加日志)

4.Redis 的过期策略和内存淘汰策略

4.1 Redis 过期策略(如何删除过期数据)

4.2Redis内存淘汰策略

5.Redis的分布式锁

5.1 为什么需要分布式锁?

5.2 Redis 分布式锁的基本实现

5.3分布式锁的优化


Redis面试篇

1.什么是Redis?作用是什么?

Redis(Remote Dictionary Server)是一个基于内存的高性能 NoSQL 数据库,通常用于缓存分布式存储消息队列。它支持键值(key-value)存储,并且可以存储字符串、哈希、列表、集合、有序集合等多种数据结构

Redis 的主要作用

  1. 缓存(提高系统性能)

    • 存储热点数据,减少数据库访问压力,提高查询速度。

    • 例如:存储用户信息、文章内容、商品信息等,避免每次都查数据库。

  2. 分布式锁(保证并发安全)

    • 在高并发场景下,多个线程/进程可能同时访问一个资源,Redis 的 SETNXRedisson 可以实现分布式锁,防止数据冲突。

    • 例如:限流、秒杀活动、库存扣减。

  3. 计数器和限流(防止系统被滥用)

    • 适用于访问量统计、限流(如接口请求次数限制)。

    • 例如:某接口 1 分钟内最多访问 10 次,超过就返回错误。

  4. Session 共享(解决分布式会话问题)

    • 在分布式系统中,多个服务器需要共享 Session(如用户登录状态),可以使用 Redis 统一存储。

  5. 消息队列(异步处理任务)

    • Redis 的 ListPub/Sub 可用于实现消息队列,提高系统吞吐量。

    • 例如:订单系统消息队列异步处理支付、物流

  6. 排行榜(游戏、社交场景)

    • Redis 的 有序集合(Sorted Set) 可以存储分数排名,如游戏积分榜、热搜榜。

2.什么是缓存穿透、缓存击穿、缓存雪崩

2.1缓存穿透

缓存穿透是指客户端频繁访问一些不存在的缓存数据,由于缓存中没有这些数据的记录,每次请求都直接访问数据库,导致数据库压力增大,但是数据库中也不存在(就是指大量请求不存在的资源,大量请求不存在的资源大概率就是被黑客攻击了......)

如何解决? 缓存空值:当查询一个不存在的key时,先访问缓存,缓存中没有访问数据库,数据库中也没有用的话就用redis做一个空标记 ,将空结果也写入缓存,并设置一个较短的过期时间 。下次再遇到相同的请求时判断是否存在空标记 key,存在这个空标记则直接返回缓存中的空值,避免再次查询数据库。(但这种标记过多的话会消耗资源,不推荐)

使用分布式锁:当请求发现缓存不存在时,可以使用分布式锁机制,避免多个相同的请求同时访问数据库。这样,只让一个请求去加载数据,其他请求等待,从而减轻数据库压力.

布隆过滤器:布隆过滤器是一种数据结构,在查询缓存和数据库之前,利用布隆过滤器来存储这个 key ,判断key是否存在,存在则直接放行.如果该key不存在则直接被拦截返回,不必查询缓存或数据库,节约存储空间。

对疯狂请求不存在数据的ip进行拉黑

缓存穿透无敌解决方法(能用上的方法全用上 ^_^ ) 布隆过滤器+空对象+分布式锁:

1.当缓存不存在时,先通过布隆过滤器进行初步筛选,

2.如果布隆过滤器判定数据可能存在,则检查是否存在空对象缓存。

3.如果空对象缓存不存在,再使用分布式锁防止多个相同请求同时访问数据库。

4.最后,如果数据库查询结果为空,将结果缓存为空对象,以防后续重复查询

2.2缓存击穿

缓存击穿是指某个热点数据在缓存中失效的瞬间有大量的并发请求同时访问该数据,由于该数据在缓存中失效,大量请求同时访问数据库,造成数据库压力骤增。这种情况通常发生在热点数据或访问频繁的数据上。

如何解决? 互斥锁机制:当缓存失效时,通过加锁的方式保证只有一个线程去查询数据库并更新缓存,其他线程等待缓存更新完成后再获取数据。

缓存不设置过期时间:对于极为重要的热点数据,可以设置其缓存永不过期,同时后台启动线程定期刷新该缓存,但如果重要的热点数据过多,不推荐此方法

监控热门数据,实时调整key的过期时长

2.3缓存雪崩

redis中大量key同时过期,导致大量请求直接访问数据库,瞬间引发数据库压力激增,甚至导致数据库崩溃。

如何解决? 缓存的过期时间使用随机值,这样减少了大量缓存同时过期的情况.

实时调整,监控哪些数据是热门数据,实时的调整key的过期时长.

使用锁机制,未获取锁的请求只能进行等待

3.redis如何持久化

Redis 是基于内存的数据库,但为了防止数据丢失,它提供了两种持久化机制

  1. RDB(Redis Database)—— 快照存储

  2. AOF(Append Only File)—— 追加日志存储

1. RDB(快照存储)

原理:Redis 以二进制快照的形式将数据库的整个数据保存到磁盘文件(.rdb)中,在发生故障时可以恢复。

特点

✅ 适用于大规模数据的定期备份,恢复速度快。 ✅ 占用空间小,存储效率高。 ❌ 如果 Redis 意外崩溃,则最后一次快照之后的数据可能丢失

2. AOF(追加日志)

原理:Redis 记录所有的写操作命令(如 SETDEL),并将它们以日志形式.aof 文件)追加到磁盘,Redis 重启时可重放这些命令恢复数据

特点

数据安全,即使 Redis 意外崩溃AOF 也能最大限度减少数据丢失。 ✅ 适用于高实时性数据(例如:秒杀、交易系统)。 ❌ 日志文件较大,可能会影响 Redis 启动速度。

4.Redis 的过期策略和内存淘汰策略

Redis 作为内存数据库,存储空间是有限的,因此需要过期策略内存淘汰策略来管理数据。

4.1 Redis 过期策略(如何删除过期数据)

Redis 允许设置键的过期时间(TTL),当键过期后,就会被删除。Redis 提供了 三种删除策略

(1)定期删除(默认)

机制:Redis 每 100ms 进行一次过期键的扫描,随机检查一部分过期键,并删除过期的键。

优点:减少了系统负担,不会影响 Redis 性能。 ❌ 缺点:如果过期键过多,可能不会一次性删除完,导致内存占用增加

(2)惰性删除

机制:当客户端访问一个键时,Redis 发现它已经过期,就会立刻删除这个键。

优点:仅在访问时删除,减少 CPU 负担。 ❌ 缺点:如果某些键一直不被访问,它们可能不会被删除,从而占用内存

(3)定期删除 + 惰性删除(默认策略)

Redis 默认使用定期删除 + 惰性删除,既能避免频繁扫描,也能确保访问时自动删除过期键。

4.2Redis内存淘汰策略

如果 Redis 占满了可用内存,就需要删除一些数据来释放空间。Redis 提供了6 种内存淘汰策略

策略名称说明适用场景
noeviction(默认)不删除任何数据,直接报错(写入失败)适合持久化数据,不希望丢失
allkeys-lru删除最久未使用的键(全局 LRU)适用于缓存,需要高命中率
volatile-lru删除设置了过期时间的最久未使用键适用于缓存+持久化混合场景
allkeys-random随机删除任何键适用于无固定热点的场景
volatile-random只随机删除有过期时间的键适用于部分数据需要持久化
volatile-ttl优先删除过期时间最短的键适用于定期更新数据的场景

5.Redis的分布式锁

Redis 的分布式锁是一种基于 Redis 实现的分布式并发控制机制,用于保证多个进程或线程在分布式环境下对共享资源的互斥访问

5.1 为什么需要分布式锁?

分布式系统中,多个应用可能会同时操作同一个资源(如库存、订单等),导致数据不一致,这时就需要分布式锁来保证同一时间只有一个进程能执行操作。

示例问题

  • 秒杀系统:多个用户同时抢购,导致库存超卖。

  • 订单支付:用户 A 和 B 同时支付同一笔订单,可能出现重复扣款

  • 任务调度:多个服务器执行同一任务,可能导致任务被执行多次

5.2 Redis 分布式锁的基本实现

使用 SETNX(SET if Not Exists) 命令创建锁:

SETNX mylock "locked"

锁的基本实现

public boolean tryLock(String lockKey, String requestId, int expireTime) {String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);return "OK".equals(result);
}

解释

  • lockKey:锁的 key(比如 "order_lock")。

  • requestId:每个锁唯一的 ID,保证同一客户端能释放自己的锁。

  • "NX":只在 key 不存在 时才设置(保证互斥性)。

  • "PX expireTime":自动过期时间(避免死锁)。

  • "OK".equals(result):返回 "OK" 表示加锁成功。

🔴 问题

  1. 锁可能无法释放:如果服务崩溃,锁不会自动释放,导致死锁。

  2. 误删其他线程的锁:如果锁过期后被其他线程重新加锁,当前线程仍然认为自己持有锁,会误删别人的锁。

5.3分布式锁的优化

(1)设置锁的自动过期时间

防止死锁

SET order_lock "locked" NX PX 10000

NX表示key不存在时才创建,保证互斥性

PX 10000 → 10 秒后自动释放锁

(2)使用 Redisson 实现分布式锁

Redisson 是 Redis 官方推荐的 Java 客户端,提供了高效的分布式锁实现:

RLock lock = redissonClient.getLock("order_lock");
try {lock.lock(10, TimeUnit.SECONDS);// 执行业务逻辑
} finally {lock.unlock();//释放锁
}

Redisson 优势

自动续期(Watchdog 机制):如果持有锁的线程还在执行,Redisson 会自动延长锁的过期时间。 避免误删锁:保证释放的是自己的锁。

Redis 分布式锁核心要点

  1. 使用 SETNX + PX 设定锁的过期时间,避免死锁。

  2. 删除锁时使用 Lua 脚本,保证原子性

  3. 使用 Redisson 进行优化,提供自动续期,避免误删锁。

  4. 适用于高并发场景(如秒杀、库存扣减),但可靠性不如 Zookeeper。

Redis 分布式锁虽然高效,但并非绝对可靠,建议使用 RedissonZookeeper 进行优化! 🚀

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

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

相关文章

交互式可视化进阶(Plotly Dash构建疫情仪表盘)

这里写目录标题 交互式可视化进阶(Plotly Dash构建疫情仪表盘)1. 引言2. 项目背景与意义3. 数据集生成与介绍4. GPU加速在数据处理中的应用5. 交互式仪表盘构建与Plotly Dash6. PyQt GUI集成与美化7. 工程整体架构8. 部分代码实现9. 代码自查与BUG排查10. 总结与展望交互式可…

RabbitMQ(补档)

RabbitMQ 是一个开源的消息队列软件(有时也被称为消息代理),它实现了高级消息队列协议(AMQP)。它主要用于应用程序之间,或者软件组件之间的消息通信。通过使用 RabbitMQ,可以实现异步的、可靠的…

平方矩阵问题

Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…

电子电气架构 --- 智能座舱和车载基础软件简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人生是一场骗局,最大的任务根本不是什么买车买房,也不是及时行乐,这就是欲望,不是理想,是把自己对生命的希望寄托在外物上,正确的做法应该是内…

Qt 通过MSVC编译运行项目

第一步下载Qt 把Qt能选的插件都选上&#xff0c;有的是连接数据库必须得插件&#xff0c;有的是做图表必须得插件&#xff0c;有的是运行MSVC必须得插件&#xff0c;能选尽量都选上。 第二步安装VS2017&#xff0c;当然我们安装2017的目的主要是用C的编译器&#xff0c;这里提…

高效手机检测:视觉分析技术的优势

在当今社会&#xff0c;手机已成为人们日常生活和工作中不可或缺的工具。然而&#xff0c;在某些特定场合&#xff0c;如考场、工作场所等&#xff0c;手机的使用却可能带来负面影响。因此&#xff0c;如何有效监测和防止在这些场合偷用手机的行为&#xff0c;成为了一个亟待解…

Gitee重新远程连接仓库(Linux)

Gitee重新远程连接仓库&#xff08;Linux&#xff09; 因为虚拟机重新安装了一回&#xff0c;所以需要重新和远程仓库连接&#xff0c;在网上找了很久没有找到相关操作&#xff0c;自己实操成功&#xff0c;记录下本博客&#xff0c;帮助有需要的人 确保新虚拟机安装Git 在新虚…

【论文笔记】FFA-Net: Feature Fusion Attention Network for Single Image Dehazing

文章目录 1. 研究背景2. FFA - Net网络结构3. 实验结果4. 研究贡献5. 重点详解1. 通道注意力&#xff08;Channel Attention, CA&#xff09;通道注意力的实现步骤&#xff1a; 2. 像素注意力&#xff08;Pixel Attention, PA&#xff09;像素注意力的实现步骤&#xff1a; 3. …

计算机视觉cv2入门之图像的读取,显示,与保存

在计算机视觉领域&#xff0c;Python的cv2库是一个不可或缺的工具&#xff0c;它提供了丰富的图像处理功能。作为OpenCV的Python接口&#xff0c;cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV 图像格式 BMP格式 …

深度学习中的向量的样子-DCN

深度学习中向量都是 竖着的&#xff0c;譬如 DCN中的计算逻辑

OBS推WebRTC流,并添加毫秒级时间显示

作者在用OBS推WebRTC流&#xff0c;并用浏览器观看推送的实时流。另外就是想看一下延迟有多少。采用一台电脑&#xff0c;流媒体服务器为SRS&#xff0c;相关配置比较简单&#xff0c;可以自行搜索。 推送的流 http://localhost:1985/rtc/v1/whip/?applive&streamlivestr…

【MySQL】多表操作 —— 外键约束

目录 多表关系一对一关系一对多/多对一关系多对多关系 外键约束基本概念一对多/多对一创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多对多创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多表关系 MySQL 多表之间的关系可以概括为&#…

82.HarmonyOS NEXT 性能优化指南:从理论到实践

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 性能优化指南&#xff1a;从理论到实践 文章目录 HarmonyOS NEXT 性能优化指南&#xff1a;从理论到实践1. 性能优化概述1.1 性能指…

树莓派急速安装ubuntu;映射磁盘与储存磁盘文件;ubuntu映射整个工程;保存系统工作状态

一、用途 在使用树莓派上下载ubuntu时&#xff0c;需要一张sd卡&#xff0c;当你需要给这张卡做备份的时候&#xff0c;可以是使用磁盘映射软件&#xff0c;从而达到备份的目的 同时有一些大佬发布了ubuntu的映射文件&#xff0c;可以直接使用该文件&#xff0c;然后还原他的整…

Qt 控件概述 QPushButton 与 QRadioButton

目录 QPushButton setIcon 设置图标 setShortCut 设置快捷键 setAutoRepeat : 设置是否连发 ​编辑RadioButton 槽函数 单选按钮的分组排异 QPushButton QPushButtoon继承于QAbstractButton(抽象类)&#xff1b; QAbstract中与QPushButton关联性极大的属性 ​ setIcon…

HR9110 玩具单通道直流电机驱动器

1、描述 HR9110是应用于直流电机方案的单通道H桥驱动器芯片。HR9110的H桥驱动部分采用低导通电阻的PMOS和NMOS功率管。低导通电阻保证芯片低的功率损耗&#xff0c;使得芯片安全工作更长时间。此 外HR9110拥有低待机电流、低静态工作电流。这些性能使能HR9110易用于玩具方案。…

Mac 使用 Crossover 加载 Windows Steam 游戏库,实现 Windows/Mac 共享移动硬盘

Mac 使用 Crossover 加载 Windows Steam 游戏库&#xff0c;实现 Windows/Mac 共享移动硬盘 1. 在Crossover上安装Steam2. Steam容器加载移动硬盘3. 配置Steam库 前言&#xff1a;本文介绍了如何在Crossover上安装Steam并加载外接移动硬盘&#xff0c;实现在Window上下载的游戏…

ubuntu 24 安装 python3.x 教程

目录 注意事项 一、安装不同 Python 版本 1. 安装依赖 2. 下载 Python 源码 3. 解压并编译安装 二、管理多个 Python 版本 1. 查看已安装的 Python 版本 2. 配置环境变量 3. 使用 update-alternatives​ 管理 Python 版本 三、使用虚拟环境为项目指定特定 Python 版本…

沐数科技数据开发岗笔试题2025

描述性统计 标准差 答案: A 解析: 标准差 衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值&#xff08;均值&#xff09;之间的偏离程度。标准差越大&#xff0c;表明数据的分布越分散&#xff1b;标准差越小&#xff0c;表明数据…

ChatGPT-4

第一章&#xff1a;ChatGPT-4的技术背景与核心架构 1.1 生成式AI的发展脉络 生成式人工智能&#xff08;Generative AI&#xff09;的演进历程可追溯至20世纪50年代的早期自然语言处理研究。从基于规则的ELIZA系统到统计语言模型&#xff0c;再到深度学习的革命性突破&#x…