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

相关推荐
okra-2 天前
文件测试测试用例
java·服务器·eclipse
攻心的子乐3 天前
北京 旅游攻略 颐和园 圆明园(第一天下午逛) 长城最后一天早上逛 如果到北京早 也可以第一天长城
eclipse
悟能不能悟12 天前
eclipse中web项目编译后的lib里面jar为空问题处理
eclipse·jar
扯淡的闲人12 天前
多语言编码Agent解决方案(4)-Eclipse插件实现
java·ide·eclipse
sheji341614 天前
【开题答辩全过程】以 12306候补购票服务系统为例,包含答辩的问题和答案
java·eclipse
毕设源码-邱学长14 天前
【开题答辩全过程】以 博物馆参观预约管理系统为例,包含答辩的问题和答案
java·eclipse
Leslie_Lei14 天前
【Eclipse】eclipse打开git拉取的项目
java·git·eclipse
lichong95115 天前
API开发工具postman、国内xxapi和SmartApi的性能对比
eclipse·intellij-idea·api·postman·visual studio·apipost·apifox
BillKu16 天前
推荐 Eclipse Temurin 的 OpenJDK
java·ide·eclipse
悟能不能悟16 天前
eclipse怎么把项目设为web
java·eclipse