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

相关推荐
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 法院信访投诉平台为例,包含答辩的问题和答案
java·eclipse
毕设源码-邱学长1 天前
【开题答辩全过程】以 “万家电器”仓库管理系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
毕设源码-朱学姐3 天前
【开题答辩全过程】以 广州网红点打卡介绍网站为例,包含答辩的问题和答案
java·eclipse
百锦再3 天前
金仓数据库提出“三低一平”的迁移理念
开发语言·数据库·后端·python·rust·eclipse·pygame
数据牧羊人的成长笔记3 天前
Hadoop 分布式计算MapReduce和资源管理Yarn
hadoop·eclipse·mapreduce
百锦再4 天前
第5章 所有权系统
运维·git·python·eclipse·go·github·负载均衡
毕设源码-赖学姐5 天前
【开题答辩全过程】以 二手交易系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
百锦再6 天前
第2章 第一个Rust程序
java·开发语言·后端·rust·eclipse·tomcat·hibernate
安冬的码畜日常7 天前
【JUnit实战3_21】第十二章:JUnit 5 与主流 IDE 的集成 + 第十三章:用 JUnit 5 做持续集成(上):在本地安装 Jenkins
junit·eclipse·jenkins·intellij idea·持续集成·junit5·netbeans
毕设源码-郭学长8 天前
【开题答辩全过程】以 常二社区线上养老院管理系统为例,包含答辩的问题和答案
java·eclipse