Java学习第七十三部分——Redis
目录
一、前言提要
二、核心特性
三、数据结构
四、应用场景
五、架构模式
六、性能优势
七、客户端库
八、注意事项
九、选择建议
十、使用示例——基于Jedis 和 Lettuce
十一、生态集成——基于Spring Boot
十二、企业级能力
十三、持久化机制
十四、高级使用工具
十五、性能与连接管理
十六、适用情况 vs 不适用情况
十七、总结归纳概述
一、前言提要
Redis(“Re”mote “Di”ctionary “S”erver)是一个开源的内存数据结构存储系统,由Salvatore Sanfilippo于2009年创建。它既可用作高性能的键值数据库、缓存和消息中间件,也支持数据持久化,是NoSQL数据库的代表之一。
二、核心特性
特性 | 说明 |
---|---|
内存存储 | 数据主要存储在内存中,提供 微秒级读写性能(10万+ QPS) |
数据结构丰富 | 支持字符串、哈希、列表、集合、有序集合、位图等 8 种数据结构 |
持久化 | 支持 RDB (快照)和 AOF (日志追加)两种方式,确保数据安全 |
高可用 | 通过 Redis Sentinel 实现故障转移,Redis Cluster 支持分布式集群 |
多功能 | 支持事务、发布订阅、Lua 脚本、流处理、地理空间索引等 |
三、数据结构
类型 | 存储结构 | 典型场景 |
---|---|---|
String | 文本/二进制数据 | 缓存、计数器(INCR ) |
Hash | 字段-值映射表 | 存储对象(如用户属性) |
List | 双向链表 | 消息队列、最新动态列表 |
Set | 无序唯一集合 | 标签系统、共同好友 |
Sorted Set | 带分数的有序集合 | 排行榜、延迟队列 |
Stream | 消息流(类似 Kafka) | 实时日志收集 |
HyperLogLog | 概率型数据结构 | 大规模去重统计(如 UV) |
Bitmap | 位数组 | 用户在线状态、行为标记 |
四、应用场景
1. 缓存
- 减轻数据库压力,加速热点数据访问(如商品详情页)。
2. 会话存储
- 分布式系统中的用户 Session 共享(替代 Cookie)。
3. 排行榜/计数器
- 利用 `ZSET` 实现实时排行榜,`INCR` 实现秒杀计数器。
4. 消息队列
- 通过 `List`(阻塞操作)或 `Stream` 实现异步任务队列。
5. 实时数据处理
- 实时分析用户行为(如点击流)、地理位置计算(`GEO` 命令)。
五、架构模式
模式 | 特点 |
---|---|
单机模式 | 简单部署,适合开发测试,但存在单点故障风险 |
主从复制 | 主节点写,从节点读,实现读写分离 |
Sentinel | 监控主节点故障并自动切换从节点为主节点(高可用) |
Cluster | 数据分片(16384 个槽),支持横向扩展,官方分布式方案 |
六、性能优势
1. 单线程模型
- 避免上下文切换和锁竞争(6.0+ 支持 I/O 多线程提升网络性能)。
2. 纯内存操作
- 数据访问无需磁盘 I/O。
3. 高效数据结构
- 如跳表(`ZSET`)、压缩列表(小数据优化)等。
4. I/O 多路复用
- 基于 epoll/kqueue 处理高并发连接。
七、客户端库
库名 | 特点 |
---|---|
Jedis | 简单轻量、同步阻塞、适合基础操作 |
Lettuce | 官方推荐(Spring Boot 默认)、支持异步/响应式、线程安全、高性能 |
Redisson | 分布式特性和数据结构(锁、队列等) |
Spring Data Redis | 基于 Spring 的抽象层,简化操作 |
八、注意事项
1. 安全:启用 Redis 密码认证,避免暴露在公网
2. 高可用:使用 Redis Sentinel 或 Cluster 模式
3. 监控:通过 `redis-cli monitor` 或 Prometheus + Grafana
4. 内存管理:设置 `maxmemory-policy`(如 `allkeys-lru`)
九、选择建议
> - 简单项目 → Jedis
> - Spring Boot / 高性能需求 → Lettuce
> - 分布式系统 → Redisson
> - 快速开发 → Spring Data Redis
十、使用示例——基于Jedis 和 Lettuce
(1) Jedis 基础操作
import redis.clients.jedis.Jedis;public class JedisDemo {public static void main(String[] args) {// 1. 连接Redis (默认端口6379)try (Jedis jedis = new Jedis("localhost", 6379)) {// 2. 认证(如果设置了密码)// jedis.auth("your-password");// 3. 写入数据jedis.set("app:user:1001", "Alice");// 4. 读取数据String value = jedis.get("app:user:1001");System.out.println(value); // 输出: Alice// 5. 设置过期时间 (10秒)jedis.expire("app:user:1001", 10);} // try-with-resources 自动关闭连接}
}
(2) Lettuce 异步操作
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.async.RedisAsyncCommands;public class LettuceDemo {public static void main(String[] args) {// 1. 创建客户端 (格式: redis://密码@地址:端口)RedisClient client = RedisClient.create("redis://localhost:6379");try (StatefulRedisConnection<String, String> connection = client.connect()) {// 2. 获取异步命令接口RedisAsyncCommands<String, String> commands = connection.async();// 3. 异步写入commands.set("app:config:timeout", "30s").thenAccept(response -> {System.out.println("设置成功: " + response);});// 4. 异步读取commands.get("app:config:timeout").thenAccept(value -> {System.out.println("获取结果: " + value);});// 防止主线程退出(实际生产用CountDownLatch等)Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();} finally {client.shutdown(); // 关闭客户端}}
}
十一、生态集成——基于Spring Boot
(1) 添加依赖 (`pom.xml`)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> <!-- 默认使用Lettuce -->
</dependency>
(2) 配置文件 (`application.yml`)
spring:redis:host: localhostport: 6379password: your-password-if-setdatabase: 0 # 默认DB索引
(3) 使用 `RedisTemplate`
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void saveUserToken(String userId, String token) {// 写入Hash结构redisTemplate.opsForHash().put("user:tokens", userId, token);// 设置过期时间redisTemplate.expire("user:tokens", Duration.ofHours(1));}public String getToken(String userId) {return (String) redisTemplate.opsForHash().get("user:tokens", userId);}
}
十二、企业级能力
- 安全控制:支持密码认证、ACL 权限管理(Redis 6.0+)。
- 扩展模块:通过 Redis Modules 支持全文搜索(RediSearch)、图计算(RedisGraph)等。
- 监控工具:内置 `INFO` 命令,集成 Prometheus/Grafana 可视化监控。
十三、持久化机制
方式 | 原理 | 优点 | 缺点 |
---|---|---|---|
RDB | 定时生成内存快照(二进制文件) | 恢复速度快,文件紧凑 | 可能丢失最后一次快照后的数据 |
AOF | 记录所有写操作命令(追加日志) | 数据安全更高(可配置每秒同步) | 文件较大,恢复较慢 |
混合 | RDB + AOF(Redis 4.0+) | 结合两者优势,推荐生产使用 | 配置较复杂 |
十四、高级使用工具
- 分布式锁:用 `Redisson` 或 `RedisTemplate.execute` + Lua 脚本
- 发布订阅:
redisTemplate.convertAndSend("news-channel", "新消息内容");
- 事务:
redisTemplate.execute(new SessionCallback<>() {public Object execute(RedisOperations operations) {operations.multi(); // 开启事务operations.opsForValue().set("key1", "value1");operations.opsForValue().increment("counter");return operations.exec(); // 提交事务}});
十五、性能与连接管理
- 连接池配置——Lettuce 默认使用 Netty 非阻塞连接,无需连接池
spring:redis:lettuce:pool:max-active: 20 # 最大连接数max-idle: 10 # 最大空闲连接min-idle: 3 # 最小空闲连接
- 序列化优化——避免 Java 原生序列化(性能差),推荐 JSON 或 Kryo
@Beanpublic 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;}
十六、适用情况 vs 不适用情况
适用场景 | 不适用场景 |
---|---|
高频读写的热点数据 | 海量冷数据存储 |
实时计算与分析 | 复杂关系查询(如 JOIN) |
临时数据存储(如会话) | 大规模二进制文件 |
分布式锁/协调 | 替代关系型数据库 |
十七、总结归纳概述
Redis 凭借性能极致、数据结构灵活和功能丰富的特点,已成为现代架构的核心组件。从缓存到实时系统,从微服务到 AI 基础设施,Redis 在互联网、金融、游戏等领域广泛应用,是开发者解决高性能存储问题的首选利器。