当前位置: 首页 > article >正文

Java中Redis面试题集锦(含过期策略详解)

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

      • Java中Redis面试题集锦(含过期策略详解)
        • **一、Redis基础**
        • **二、过期策略详解(重点)**
        • **三、高级特性**
        • **四、Java生态整合**
        • **五、性能优化**
      • 面试回答技巧:过期策略


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

Java中Redis面试题集锦(含过期策略详解)


一、Redis基础
  1. Redis支持哪些数据类型?在Java中如何操作?

    • 数据类型:String、List、Set、SortedSet、Hash、Bitmap等
    • Java操作示例(Jedis):
      Jedis jedis = new Jedis("localhost");
      jedis.set("key", "value");                        // String
      jedis.lpush("list", "item1", "item2");            // List
      jedis.hset("user:1", "name", "Alice");            // Hash
      
  2. Redis单线程为何高性能?

    • 内存操作 + IO多路复用 + 避免上下文切换
    • 单线程处理命令保证原子性

二、过期策略详解(重点)
  1. Redis的键过期删除策略是什么?

    • 惰性删除:访问时检查过期并删除
      // Jedis访问时触发惰性删除
      String value = jedis.get("expired_key"); // 返回null
      
    • 定期删除:周期性随机扫描过期键(默认10次/秒)
      • 每次抽查20个键,删除过期键
      • 若过期键比例>25%,重复扫描
  2. Java中如何设置键过期?

    jedis.setex("temp_session", 300, "data");  // 300秒后过期
    jedis.expire("cache_key", 60);             // 60秒后过期
    jedis.pexpire("key", 10000L);              // 毫秒级过期
    
  3. 内存淘汰策略如何与过期键交互?

    策略是否涉及过期键Java配置示例
    volatile-lru仅淘汰有过期时间的键config.setMaxMemoryPolicy("volatile-lru")
    volatile-ttl优先淘汰TTL最短的键
    allkeys-lru所有键(含无过期时间)
  4. 主从模式下过期键如何处理?

    • 从节点不主动删除,依赖主节点同步DEL命令
    • Java代码需确保在主节点操作过期键

三、高级特性
  1. 如何用Redis实现分布式锁?

    // Redisson实现
    RLock lock = redisson.getLock("order_lock");
    lock.lock(30, TimeUnit.SECONDS); // 设置锁过期时间
    try {// 业务逻辑
    } finally {lock.unlock();
    }
    
  2. 缓存穿透/雪崩/击穿解决方案

    • 穿透:布隆过滤器 + 空值缓存
      if (jedis.get(key) == null) {jedis.setex(key, 300, ""); // 缓存空值
      }
      
    • 雪崩:随机过期时间
      jedis.setex(key, 60 + new Random().nextInt(30), value);
      
    • 击穿:互斥锁
      if (jedis.setnx("lock_key", "1") == 1) {jedis.expire("lock_key", 5); // 获取锁
      }
      

四、Java生态整合
  1. Spring Boot中如何配置Redis过期时间?

    spring:redis:timeout: 5000lettuce:pool:max-active: 8
    
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(30)); // 全局过期时间
    }
    
  2. Redis事务 vs Lua脚本

    • 事务:
      jedis.watch("key");
      Transaction tx = jedis.multi();
      tx.set("key1", "value1");
      tx.expire("key1", 60);
      tx.exec();
      
    • Lua脚本(原子操作):
      String script = "redis.call('SET', KEYS[1], ARGV[1]); " +"redis.call('EXPIRE', KEYS[1], ARGV[2]);";
      jedis.eval(script, 1, "key", "value", "60");
      

五、性能优化
  1. 大Key过期导致阻塞怎么办?

    • 启用异步删除(Redis 6.0+):
      # redis.conf
      lazyfree-lazy-expire yes
      
    • Java拆分大Key:
      // 将大Hash拆分为多个小Key
      for (int i=0; i<100; i++) {jedis.hset("user:1:part" + i, "field", "value");
      }
      
  2. 如何监控过期键?

    // 获取过期键统计
    String info = jedis.info("stats");
    // expired_keys: 累计过期键数量
    // evicted_keys: 内存淘汰键数量
    

面试回答技巧:过期策略

当被问到Redis过期策略时,按层次回答:

  1. 核心机制:惰性删除 + 定期删除
  2. 存储结构:过期字典(Expires Dictionary)
  3. 持久化影响
    • RDB:持久化时不保存过期键
    • AOF:记录DEL命令
  4. 集群特性:主节点控制删除,从节点被动同步
  5. Java实践
    • 合理设置TTL避免堆积
    • 监控expired_keys指标
    • 大Key使用异步删除

示例回答
“Redis采用惰性删除和定期删除组合策略。当访问键时会触发惰性删除,同时Redis每秒10次随机扫描过期键。在Java中,我们通过setex()设置过期,结合volatile-ttl策略优化内存。对于大Key,建议启用Redis 6.0的异步删除避免阻塞主线程。”


通过这些问题,面试官可以全面考察你对Redis在Java中的应用能力,特别是对过期机制的深入理解。



📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

相关文章:

Java中Redis面试题集锦(含过期策略详解)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Java中Redis面试题集锦&#xff08;含过期策…...

Maven 安装与配置指南(适用于 Windows、Linux 和 macOS)

Apache Maven 是一款广泛应用于 Java 项目的项目管理和构建工具。 本文提供在 Windows、Linux 和 macOS 系统上安装与配置 Maven 的详细步骤&#xff0c;旨在帮助开发者快速搭建高效的构建环境。 一、前置条件&#xff1a;安装 Java Development Kit (JDK) Maven 依赖于 Java …...

android 媒体框架之MediaCodec

一、MediaCodec 整体架构与设计思想 MediaCodec 是 Android 底层多媒体框架的核心组件&#xff0c;负责高效处理音视频编解码任务。其架构采用 生产者-消费者模型&#xff0c;通过双缓冲区队列&#xff08;输入/输出&#xff09;实现异步数据处理&#xff1a; 输入缓冲区队列…...

堆与堆排序及 Top-K 问题解析:从原理到实践

一、堆的本质与核心特性 堆是一种基于完全二叉树的数据结构&#xff0c;其核心特性为父节点与子节点的数值关系&#xff0c;分为大堆和小堆两类&#xff1a; 大堆&#xff1a;每个父节点的值均大于或等于其子节点的值&#xff0c;堆顶元素为最大值。如: 小堆&#xff1a;每个…...

Linux中检查当前用户是不是root

Linux中检查当前用户是不是root 检查当前用户是否为root用户。如果是root用户&#xff0c;输出“当前用户是root”&#xff1b;否则&#xff0c;输出“当前用户不是root”。 创建一个 aaa.sh脚本文件 写入如下内容 #!/bin/bash# 检查当前用户的UID是否为0&#xff08;root用…...

软件锁:守护隐私,安心无忧

数字化时代&#xff0c;手机已成为我们生活中不可或缺的一部分&#xff0c;它不仅存储着我们的个人信息、照片、聊天记录等重要数据&#xff0c;还承载着我们的社交、娱乐和工作等多种功能。然而&#xff0c;这也意味着手机上的隐私信息面临着诸多泄露风险。无论是家人、朋友还…...

无人机桥梁3D建模、巡检、检测的航线规划

无人机桥梁3D建模、巡检、检测的航线规划 无人机在3D建模、巡检和检测任务中的航线规划存在显著差异&#xff0c;主要体现在飞行高度、航线模式、精度要求和传感器配置等方面。以下是三者的详细对比分析&#xff1a; 1. 核心目标差异 任务类型主要目标典型应用场景3D建模 生成…...

项目:贪吃蛇实现

头文件 snake.h #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<locale.h> #include<stdbool.h> #include<time.h>#define POS_X 24#define POS_Y 5 #define BODY L● #define FOOD L★ #define KEY_PRESS(VK) ((…...

【Java基础05】面向对象01

文章目录 1. 设计对象并使用1.1 类与对象1.2 封装1.2.1 private关键字1.2.2 this关键字成员变量和局部变量的区别 1.2.3 构造方法1.2.4 标准JavaBean类 1.3 对象内存图 本文部分参考这篇博客 1. 设计对象并使用 1.1 类与对象 public class 类名{1、成员变量(代表属性,一般是名…...

设计模式:观察者模式 - 实战

一、观察者模式场景 1.1 什么是观察者模式&#xff1f; 观察者模式&#xff08;Observer Pattern&#xff09;观察者模式是一种行为型设计模式&#xff0c;用于定义一种一对多的依赖关系&#xff0c;当对象的状态发生变化时&#xff0c;所有依赖于它的对象都会自动收到通知并更…...

8.8 Primary ODSA service without ODSA Portal

主要ODSA服务&#xff08;不使用ODSA门户&#xff09; 以下场景描述如下情况&#xff1a; • 主ODSA客户端应用程序被允许用于该类型的主设备&#xff0c;且对终端用户启用&#xff08;已授权&#xff09;。 • 服务提供商&#xff08;SP&#xff09;能够在不涉及ODSA门户Web服…...

YOLOv8 移动端升级:借助 GhostNetv2 主干网络,实现高效特征提取

文章目录 引言GhostNetv2概述GhostNet回顾GhostNetv2创新 YOLOv8主干网络改进原YOLOv8主干分析GhostNetv2主干替换方案整体架构设计关键模块实现 完整主干网络实现YOLOv8集成与训练模型集成训练技巧 性能对比与分析计算复杂度对比优势分析 部署优化建议结论与展望 引言 目标检…...

国产化Word处理控件Spire.Doc教程:在 C# 中打印 Word 文档终极指南

在 C# 中以编程方式打印 Word 文档可以简化业务工作流程、自动化报告和增强文档管理系统。本指南全面探讨如何使用Spire.Doc for .NET打印 Word 文档&#xff0c;涵盖从基本打印到高级自定义技术的所有内容。我们将逐步介绍每种情况下的实际代码示例&#xff0c;确保您能够在实…...

java的vscode扩展插件

在 Visual Studio Code (VSCode) 中&#xff0c;Java 开发可以通过多种方式得到支持&#xff0c;包括安装专门的扩展插件。下面是一些流行的 VSCode 扩展插件&#xff0c;可以帮助你更好地进行 Java 开发&#xff1a; Language Support for Java(TM) by Red Hat 官方支持&…...

谷歌:贝叶斯框架优化LLM推理反思

&#x1f4d6;标题&#xff1a;Beyond Markovian: Reflective Exploration via Bayes-Adaptive RL for LLM Reasoning &#x1f310;来源&#xff1a;arXiv, 2505.20561 &#x1f31f;摘要 通过强化学习 (RL) 训练的大型语言模型 (LLM) 表现出强大的推理能力和紧急反射行为&a…...

Qt SQL模块基础

Qt SQL模块基础 一、Qt SQL模块支持的数据库 官方帮助文档中的Qt支持的数据库驱动如下图&#xff1a; Qt SQL 模块中提供了一些常见的数据库驱动&#xff0c;包括网络型数据库&#xff0c;如Qracle、MS SQL Server、MySQL等&#xff0c;也包括简单的单机型数据库。 Qt SQL支…...

[9-3] 串口发送串口发送+接收 江协科技学习笔记(26个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26中断...

java 微服务中,微服务相互调用 feign 和flux 如何选择

在 Java 微服务中&#xff0c;Feign 和 Flux&#xff08;通过 WebClient 实现&#xff09;是两种不同的服务间调用方式&#xff0c;主要区别体现在编程模型、通信机制和适用场景上。 1. 编程模型 FeignFlux (WebClient)同步阻塞式&#xff1a;基于传统 Servlet 模型&#xff0…...

如何在Qt中绘制一个带有动画的弧形进度条?

如何在Qt中绘制一个弧形的进度条 在图形用户界面开发中&#xff0c;进度指示控件&#xff08;Progress Widget&#xff09;是非常常见且实用的组件。CCArcProgressWidget 是一个继承自 QWidget 的自定义控件&#xff0c;用于绘制圆弧形进度条。当然&#xff0c;笔者看了眼公开…...

参加技术会议,为程序人生的职业生涯成长添砖加瓦

参加技术会议,为程序人生的职业生涯成长添砖加瓦 关键词:技术会议、程序员职业生涯、职业成长、技术交流、人脉拓展、知识体系升级、职业竞争力 摘要:在快速迭代的IT技术领域,参加技术会议已成为程序员突破职业瓶颈、构建核心竞争力的重要途径。本文从技术会议的核心价值出…...

国产三维CAD皇冠CAD(CrownCAD)建模教程:汽车电池

在线解读『汽车电池』的三维建模流程&#xff0c;讲解3D草图、保存实体、拉伸凸台/基体、设置外观等操作技巧&#xff0c;一起和皇冠CAD&#xff08;CrownCAD&#xff09;学习制作步骤吧&#xff01; 汽车电池&#xff08;通常指铅酸蓄电池或锂离子电池&#xff09;是车辆电气系…...

记录算法笔记(2025.5.28)只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff1…...

VMware-workstation安装教程--超详细(附带安装包)附带安装CentOS系统教程

VMware-workstation安装教程--超详细&#xff08;附带安装包&#xff09;附带安装CentOS系统教程 一、下载软件VMwware二、下载需要的镜像三、在VMware上安装系统 一、下载软件VMwware 二、下载需要的镜像 三、在VMware上安装系统 VMware 被 Broadcom&#xff08;博通&#x…...

2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版

1.题目描述 2.思路 输入&#xff1a;旋转后的数组 nums&#xff0c;和一个整数 target 输出&#xff1a;target 在 nums 中的下标&#xff0c;如果不存在&#xff0c;返回 -1 限制&#xff1a;时间复杂度为 O(log n)&#xff0c;所以不能用遍历&#xff0c;必须使用 二分查找…...

3D-激光SLAM笔记

目录 定位方案 编译tbb ros2humble安装 命令 colcon commond not found 栅格地图生成&#xff1a; evo画轨迹曲线 安装gtsam4.0.2 安装ceres-solver1.14.0 定位方案 1 方案一&#xff1a;改动最多 fasterlio 建图&#xff0c;加闭环优化&#xff0c;参考fast-lio增加关…...

Golang 配置国内代理

使用 GOPROXY 临时设置 export GOPROXYhttps://goproxy.cn,direct永久设置 go env -w GOPROXYhttps://goproxy.cn,direct再go get下载...

Android bindservice绑定服务,并同步返回service对象的两个方法

先上一段代码&#xff1a; private IDeviceService deviceService null; private ServiceConnection connnull; private synchronized void bindyourservice() { Intent intent new Intent();intent.setPackage("servicepackagename");intent.setAction("…...

5G 核心网 UE 状态深度剖析:机制、迁移与演进

摘要 本文围绕 5G 核心网中 UE(用户设备)状态展开系统分析,详细阐述了 UE 状态的定义、分类及特点,深入探讨各状态间的迁移流程与关键技术,并结合典型应用场景分析其实际价值。同时,对比 4G 技术剖析 5G 的改进之处,展望 6G 时代 UE 状态管理的演进方向,为 5G 网络优化…...

HomeKit 基本理解

概括 HomeKit 将用户的家庭自动化信息存储在数据库中&#xff0c;该数据库由苹果的内置iOS家庭应用程序、支持HomeKit的应用程序和其他开发人员的应用程序共享。所有这些应用程序都使用HomeKit框架作为对等程序访问数据库. Home 只是相当于 HomeKit 的表现层,其他应用在实现 …...

[SC]SystemC在CPU/GPU验证中的应用(三)

SystemC在CPU/GPU验证中的应用(三) 摘要:下面分享50个逐步升级SystemC编程能力的示例及建议的学习路线图。您可以一次一批地完成它们——从前五个基础的例子开始,然后转向channels, TLM, bus models, simple CPU/GPU kernels等等。在每个阶段掌握之后,再进行下一组…...