Java 之Redis

一、Redis核心概念与特性

  1. Redis是什么?

    Redis是基于内存的键值型NoSQL数据库,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),常用于缓存、分布式锁、消息队列等场景。其核心优势在于内存存储带来的高性能(可达10万+ QPS)和单线程模型避免并发冲突。

  2. Redis为什么快?

    • 内存存储,读写无磁盘I/O瓶颈
    • 单线程模型避免上下文切换
    • I/O多路复用(如epoll)高效处理网络请求
    • 优化的数据结构(如跳跃表、压缩列表)

二、数据结构与使用场景

数据结构 典型场景 Java代码示例(Spring Data Redis)
String 缓存、计数器、分布式Session redisTemplate.opsForValue().set("key", value)
Hash 存储对象属性(如用户信息) redisTemplate.opsForHash().put("user:1", "name", "Alice")
List 消息队列、最新消息列表 redisTemplate.opsForList().leftPush("queue", msg)
Set 标签、共同好友 redisTemplate.opsForSet().add("tags", "Java")
ZSet 排行榜、延迟队列 redisTemplate.opsForZSet().add("rank", "userA", 100)

三、持久化与高可用

  1. 持久化机制

    • RDB:定时快照,文件紧凑但可能丢失数据(适合备份)
    • AOF:记录写命令,数据更安全但文件较大
    • 混合持久化(Redis 4.0+):结合RDB快照与增量AOF日志,提升恢复效率
  2. 高可用方案

    • 主从复制 :一主多从实现读写分离,通过REPLICAOF命令配置
    • 哨兵模式:自动监控故障转移,解决主节点单点问题
    • Cluster集群:数据分片存储,支持横向扩展(官方推荐方案)

四、Java集成与实战

  1. Spring Boot整合

    复制代码
    复制代码
    @Configuration @EnableCaching public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } 

    使用@Cacheable注解实现声明式缓存。

  2. 分布式锁实现

    复制代码
    复制代码
    // 加锁(SETNX + 过期时间) Boolean locked = redisTemplate.opsForValue().setIfAbsent("lock:order", "req123", 30, TimeUnit.SECONDS); // 解锁(Lua脚本保证原子性) String script = "if redis.call('get', KEYS[1](@ref) == ARGV[1] then return redis.call('del', KEYS[1](@ref) else return 0 end"; redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Collections.singletonList("lock:order"), "req123"); 

    需注意锁续期问题(推荐Redisson的WatchDog机制)。


五、高频面试题解析

  1. 缓存穿透/击穿/雪崩

    • 穿透:缓存与数据库均无数据 → 布隆过滤器拦截非法请求
    • 击穿:热点key过期 → 互斥锁重建缓存
    • 雪崩:大量key同时过期 → 随机过期时间 + 集群部署
  2. 内存淘汰策略

    当内存达到maxmemory阈值时触发淘汰,策略包括:

    • volatile-lru(默认):淘汰最近最少使用的过期键
    • allkeys-lfu:淘汰全库最不经常使用的键
    • noeviction:禁止淘汰,直接报错(需谨慎选择)
  3. 延时任务实现误区

    • 避免使用Key过期监听:Redis过期事件存在延迟且不保证可靠
    • 推荐方案 :Redisson的DelayedQueue或RocketMQ定时消息

六、优化与陷阱

  • 大Key治理:单个Value不超过1MB,集合元素控制在1万以内
  • Pipeline批量操作:减少网络往返耗时
  • 熔断降级:Hystrix+Fallback防止Redis宕机导致服务雪崩
  • 缓存一致性:采用Cache-Aside模式,更新时先更新DB再删缓存(双删策略)

相关推荐
DIY源码阁7 天前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse
2601_961875247 天前
花生十三公考课程|网课|视频
数据库·windows·git·svn·eclipse·github
2601_961875247 天前
花生十三资料网盘|百度云|下载
数据库·windows·git·svn·eclipse·github
2601_961875248 天前
法考备考计划表|学习计划|资料已整理
java·开发语言·学习·eclipse·tomcat·c#·hibernate
2601_9618752410 天前
法考资料2026|全套|资料已整理
数据结构·算法·链表·贪心算法·eclipse·线性回归·动态规划
DIY源码阁11 天前
JavaSwing酒店管理系统 - MySQL版
java·mysql·eclipse
AI行业学习12 天前
CC-Switch v3.16.1 官方下载 | 安装配置详细教程【2026.6.10】
java·开发语言·vue.js·python·mysql·eclipse·html
2601_9618454213 天前
2026四级作文预测26年|英语四级写作范文+模板PDF
java·数据库·spring·eclipse·pdf·tomcat·hibernate
2601_9611940214 天前
考研资料电子版|下载|pdf
java·python·考研·eclipse·django·pdf·pygame
2601_9611940217 天前
2026六级词汇PDF下载|大学英语六级单词表+音频PDF
windows·git·eclipse·pdf·github