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

相关推荐
深色風信子6 小时前
Eclipse 插件开发 1
java·eclipse·ogsi
深色風信子6 小时前
Eclipse 插件开发 2
java·ide·eclipse
.生产的驴1 天前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
界面开发小八哥5 天前
「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(二)
java·ide·java-ee·eclipse·myeclipse
白鸽(二般)6 天前
eclipse常用快捷键
java·ide·eclipse
寒也6 天前
识别法院PDF文件特定字段并插入数据库【正则表达式+本地化部署】
java·数据库·正则表达式·eclipse·pdf·达梦·ruoyi
spencer_tseng7 天前
IntelliJ IDEA clean git password
java·git·eclipse·intellij-idea
杜清卿11 天前
如何配置环境变量HADOOP_HOMEM、AVEN_HOME?不配置会怎么样
大数据·hadoop·eclipse
睎zyl11 天前
如何配置HADOOP_HOME环境变量
大数据·hadoop·eclipse
向哆哆13 天前
Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路
java·eclipse·intellij-idea