Java学习第七十三部分——Redis
目录
一、前言提要
二、核心特性
三、数据结构
四、应用场景
五、架构模式
六、性能优势
七、客户端库
八、注意事项
九、选择建议
十、使用示例——基于Jedis 和 Lettuce
十一、生态集成——基于Spring Boot
十二、企业级能力
十三、持久化机制
十四、高级使用工具
十五、性能与连接管理
十六、适用情况 vs 不适用情况
十七、总结归纳概述
一、前言提要
Redis(“Re”mote “Di”ctionary “S”erver)是一个开源的内存数据结构存储系统,由Salvatore Sanfilippo于2009年创建。它既可用作高性能的键值数据库、缓存和消息中间件,也支持数据持久化,是NoSQL数据库的代表之一。
二、核心特性
RDB
(快照)和 AOF
(日志追加)两种方式,确保数据安全三、数据结构
INCR
)四、应用场景
1. 缓存
- 减轻数据库压力,加速热点数据访问(如商品详情页)。
2. 会话存储
- 分布式系统中的用户 Session 共享(替代 Cookie)。
3. 排行榜/计数器
- 利用 `ZSET` 实现实时排行榜,`INCR` 实现秒杀计数器。
4. 消息队列
- 通过 `List`(阻塞操作)或 `Stream` 实现异步任务队列。
5. 实时数据处理
- 实时分析用户行为(如点击流)、地理位置计算(`GEO` 命令)。
五、架构模式
六、性能优势
1. 单线程模型
- 避免上下文切换和锁竞争(6.0+ 支持 I/O 多线程提升网络性能)。
2. 纯内存操作
- 数据访问无需磁盘 I/O。
3. 高效数据结构
- 如跳表(`ZSET`)、压缩列表(小数据优化)等。
4. I/O 多路复用
- 基于 epoll/kqueue 处理高并发连接。
七、客户端库
八、注意事项
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 connection = client.connect()) { // 2. 获取异步命令接口 RedisAsyncCommands 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`)
org.springframework.boot spring-boot-starter-data-redis
(2) 配置文件 (`application.yml`)
spring: redis: host: localhost port: 6379 password: your-password-if-set database: 0 # 默认DB索引
(3) 使用 `RedisTemplate`
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;@Servicepublic class UserService { @Autowired private RedisTemplate 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 可视化监控。
十三、持久化机制
十四、高级使用工具
- 分布式锁:用 `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
@Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; }
十六、适用情况 vs 不适用情况
十七、总结归纳概述
Redis 凭借性能极致、数据结构灵活和功能丰富的特点,已成为现代架构的核心组件。从缓存到实时系统,从微服务到 AI 基础设施,Redis 在互联网、金融、游戏等地方广泛应用,是开发者解决高性能存储问题的首选利器。