JAVA面试题速记-redis知识点

简介: Redis核心简介(240字内): Redis提供5种基础数据结构:String、Hash、List、Set、ZSet,及Geospatial等扩展类型。支持RDB快照与AOF日志双持久化机制,兼顾性能与安全;通过过期策略(定期+惰性+LRU)管理内存。应对缓存击穿/雪崩,采用错峰过期;保障缓存-数据库一致性,推荐异步Binlog监听+可靠MQ删除。分布式锁推荐Redisson(自动续期、原子Lua脚本)。高可用支持哨兵(主从故障转移)与集群(16384槽分片、水平扩展)。BigKey需拆分、异步删除(UNLINK)、lazy-free优化。

redis数据结构
字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(ZSet)
● 字符串 String:redis中最基本的数据类型, 每个键都可以关联一个字符串值
● 哈希 Hash:适合存储对象类型数据
● 列表 List:有序集合,支持 LPUSH/RPUSH 等操作
● 集合 Set:无序集合,去重,支持交并差集。
● 有序集合 ZSet:有序,带权重(分数),支持按分数排序
● 三种特殊数据结构类Geospatial Hyperloglog Bitmap
redis 如何持久化数据
RDB(快照):全量备份模式
● 原理:定时将内存数据以二进制格式保存到磁盘(如save 60 10000表示60秒内10000次修改时触发)。
● 优点:文件紧凑、恢复速度快。缺点:可能丢失最后一次快照后的数据。
AOF(日志):增量备份模式
● 原理:记录所有写操作命令,支持always(每条命令同步)、everysec(每秒同步)、no(操作系统决定)三种策略。
● 优点:数据安全性高,最多丢失1秒数据, 缺点:文件体积大、恢复速度慢。
选择建议:
● 对数据安全性要求高 → AOF(everysec)。
● 允许少量数据丢失,追求恢复速度 → RDB。
● 混合备份:大量数据使用粗粒度(时间上)的rdb快照方式,性能高,恢复时间快。增量数据使用细粒度(时间上)的AOF日志方式,尽量保证数据的不丢失。
如何从持久化文件中恢复数据?
● 停止Redis服务。
● 将备份文件(如dump.rdb或appendonly.aof)放到数据目录(通过dir配置项指定)。
● 启动Redis服务,自动加载文件。
redis 缓存击穿、缓存雪崩如何解决?
● 缓存击穿 | 缓存雪崩:某时刻大规模的key失效,大量的请求打在数据库上,导致数据库压力巨大,在高并发的情况下数据库宕机。即使重启数据库后又会海量请求到数据库
● 设置不同的过期时间和随机值来错开过期时间,避免同一时刻大量缓存失效。
redis 缓存数据的过期策略有哪些?
● 定期删除:定期扫描所有键,删除过期的数据。
● 惰性删除:每次读取数据时检查是否过期。
● LRU 删除:内存满时,删除最久未使用的数据。
redis缓存与数据库如何保证一致性
● 同步策略 先更新数据库、再删除缓存(优选)
同步删除+可靠消息删除: 适用于不强制要求数据一致性的情景 流程:先更新数据库、再删除缓存,如果删除失败就发可靠MQ不断重试删除缓存,直到删除成功或重试5次。问题:MQ多次重试失败,导致长期脏数据。
● 延时双删方案:比同步删除策略一致性更高的方案。
流程:先删除缓存再更新数据库,大约在数据库从库更新后再删一次。问题:时间无法控制,不能保证 在数据库从库更新后删除缓存。如果在从库更新前删除,用户再在更新前查从库又把脏数据写在缓存里了。
● 异步监听+可靠消息删除:很多大厂正在使用的方案。
流程: 更新数据库后不做操作;Canal等组件监听binlog发现有更新时就发可靠MQ删除缓存;如果删 除缓存失败,就基于手动ack、retry等机制,让消息在有限次数之内不断重试。优点:异步删除,性能更 高;可靠消息重试机制,多次删除保证删除成功。问题:要求canal等binlog抓取组件高可用,如果canal故 障,会导致长期脏数据。
redis 如何实现分布式锁?
● 使用 Redis 的 SETNX 命令实现分布式锁。
● 结合过期时间,防止锁死。
redis 的高可用如何实现?讲讲主从复制。
● 主从复制:一个主节点(master),多个从节点(slave),数据同步。
● 读写分离:主节点写,读操作可以通过从节点分担。
● 哨兵 Sentinel:自动故障转移,主节点宕机时,哨兵会选举新的主节点。
什么是 redis 的 bigkey?
一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。
● String 类型的 value 超过 几十或上百 kb 已经算是 bigkey 了
● 复合类型(List、Hash、Set、Sorted Set 等)的 value 包含的元素超过 5 千 到 1 万个
redis的 bigKey如何处理?
● 分割 bigkey:将一个 bigkey 分割为多个小 key。例如上万字段数量的 Hash 按照一定策略(比如二次哈希)拆分为多个小Hash(如user#1、user#2)。
● 手动清理:Redis 4.0+ 可以使用 UNLINK 命令来异步删除一个或多个指定的 key。Redis 4.0 以下可以考虑使用 SCAN 命令结合 DEL 命令来分批次删除。
● 采用合适的数据结构:例如,文件二进制数据不使用 String 保存、用ZSet代替List、采用压缩算法处理。
● 开启 lazy-free(惰性删除/延迟释放):lazy-free 特性是 Redis 4.0 开始引入的,指的是让 Redis 采用异步方式延迟释放 key 使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程。
redis如何实现实现分布式锁?
● 使用SETNX 命令是可以帮助我们实现互斥 , 带来的问题: 不同的服务异常死锁其他服务无法获取锁问题, 若客户端获取锁后崩溃,未释放锁,都将导致其他客户端永远无法获取锁
● 使用 redisson提供的分布式锁服务。RLock是其核心接口,支持公平和非公平锁。加锁和解锁通过Lua脚本在Redis中执行,确保原子性。公平锁利用Redis的List和ZSet实现线程的FIFO等待队列。Redisson通过watchDog机制自动续期锁,防止业务执行超时导致锁过早释放,同时使用Redis的发布订阅功能实现锁的释放通知
● 只要线程一加锁成功,就会启动一个watch dog看门狗的后台线程,会每隔10秒检查一下,如果线程一还持有锁,那么就会不断的延长锁key的生存时间。因此,Redisson就是使用Redisson解决了锁过期释放,业务没执行完问题。
redis的分布式模式有哪些?
哨兵模式和集群模式,核心区别如下:
哨兵模式: 高可用(解决单点故障),单主节点,无法扩展, 监控主从节点,主节点宕机时选举从节点升级为主节点,实现故障转移;
集群模式:水平扩展(解决性能瓶颈),多主节点,水平扩展,有(16384个槽位,节点分槽)将数据分片存储在多个节点,每个节点负责一部分槽位,支持自动故障转移

相关文章
|
4月前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
4460 59
|
2月前
|
安全 Java API
SpringBoot 4 黑科技:接口组 ——10 行代码管理 100+ API 客户端
Spring 7 新增「HTTP接口组」特性,告别重复`@Bean`声明与手动配置。通过`@ImportHttpServices`按业务分组(如github、stackoverflow),支持统一超时、Token、baseUrl等配置,Java代码+YAML双驱动,大幅降低配置冗余,提升可维护性与开发效率。(239字)
279 3
|
2月前
|
前端开发 Java API
Python MyBoot入门:像写SpringBoot 一样写python
MyBoot是Python版Spring Boot,主打“约定优于配置”,支持自动装配、依赖注入与类Spring注解(如@RestController/@service)。内置HTTP/2、Swagger、健康检查等,单文件启动,30秒初始化项目,零样板配置,专为快速开发企业级API而生。
255 2
|
2月前
|
人工智能 安全 应用服务中间件
Docker OpenClaw 生产环境部署指南(单机架构版)
OpenClaw是2026年爆火的开源AI执行引擎,由PSPDFKit创始人Peter Steinberger主导开发。它不是聊天机器人,而是本地运行、可自托管的“数字员工”,支持自然语言指令驱动全流程任务执行,兼容主流大模型与通讯平台,MIT协议开源。
2387 3
|
2月前
|
缓存 安全 算法
JAVA面试题速记-java基础
本文系统梳理Java核心知识点:涵盖8种基本数据类型、String/StringBuffer/Builder区别、final/static作用、==与equals差异、Collection接口与Collections工具类对比;详解List/Set/Map集合特性及线程安全方案;解析反射、异常处理(throw/throws)、线程生命周期、同步机制(synchronized/ReentrantLock)、ThreadLocal原理、序列化等关键概念。(239字)
333 134
|
1月前
|
存储 缓存 NoSQL
Redis 高可用全链路拆解:从主从复制到集群架构的原理与实践
Redis高可用演进:从主从复制(基础读写分离)、哨兵模式(自动故障转移)到Cluster集群(分布式分片+线性扩容),分别解决单点故障、存储/性能瓶颈问题。本文详解原理、部署、Spring Boot整合及优化避坑指南。
234 3
|
2月前
|
安全 Go API
Go1.26新提案:errors.AsType —— 更安全、更简洁的错误类型检查方案
Go 1.26 新增 `errors.AsType[E error](err error) (E, bool)`,以泛型替代反射实现错误类型匹配。相比传统 `errors.As`,它无需预声明变量、避免指针误用、杜绝运行时 panic,支持 `if x, ok := AsType[T](err); ok` 短声明,作用域更安全,性能更高,代码更简洁清晰。(239字)
179 6
|
2月前
|
安全 中间件 Go
Go 语言三大进阶函数技巧
Go函数进阶指南:3个必学技巧——①变长参数(...T)灵活处理任意数量参数;②函数作为一等公民,支持回调与策略模式;③闭包捕获变量,实现状态记忆与配置化。提升代码复用性、安全性和专业度!
154 2
|
2月前
|
安全 Java API
Spring Boot 4 黑科技: 编译期消灭空指针异常!
NPE被称为“幽灵bug”因Java类型系统无法区分可空/非空类型,导致运行时崩溃。Spring Boot 4引入JSpecify标准:`@NullMarked`设包级非空默认,`@Nullable`显式标注例外,配合NullAway在编译期拦截空指针,让NPE从线上事故变为本地错误。(239字)
183 1