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再删缓存(双删策略)

相关推荐
月亮不月亮19 小时前
月亮商场购物打折Java
java·eclipse
Littlewith3 天前
Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器
java·开发语言·spring boot·spring·java-ee·eclipse·tomcat
Warren984 天前
Redis 八股面试题
java·数据库·redis·spring·缓存·面试·eclipse
界面开发小八哥8 天前
「Java EE开发指南」如何用MyEclipse创建企业应用项目?(一)
java·ide·java-ee·eclipse·myeclipse
万能小锦鲤10 天前
《大数据技术原理与应用》实验报告三 熟悉HBase常用操作
java·hadoop·eclipse·hbase·shell·vmware·实验报告
hqxstudying11 天前
Java行为型模式---命令模式
java·开发语言·后端·eclipse·命令模式
万能小锦鲤12 天前
《大数据技术原理与应用》实验报告五 熟悉 Hive 的基本操作
hive·hadoop·ubuntu·eclipse·vmware·实验报告·hiveql
旷世奇才李先生15 天前
Eclipse 安装使用教程
java·ide·eclipse
万能小锦鲤16 天前
《Java Web程序设计》实验报告四 Java Script前端应用和表单验证
eclipse·jquery·java web·表单验证·实验报告·java script·java web程序设计