> 技术文档 > Java学习第七十三部分——Redis

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 文本/二进制数据 缓存、计数器(INCRHash 字段-值映射表 存储对象(如用户属性) 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 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 可视化监控。  

十三、持久化机制

方式 原理 优点 缺点 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

@Bean  public RedisTemplate redisTemplate(RedisConnectionFactory factory) {      RedisTemplate template = new RedisTemplate();      template.setConnectionFactory(factory);      template.setKeySerializer(new StringRedisSerializer());      template.setValueSerializer(new GenericJackson2JsonRedisSerializer());      return template;  }

十六、适用情况 vs 不适用情况 

适用场景 不适用场景 高频读写的热点数据 海量冷数据存储 实时计算与分析 复杂关系查询(如 JOIN) 临时数据存储(如会话) 大规模二进制文件 分布式锁/协调 替代关系型数据库

十七、总结归纳概述

       Redis 凭借性能极致数据结构灵活功能丰富的特点,已成为现代架构的核心组件。从缓存到实时系统,从微服务到 AI 基础设施,Redis 在互联网、金融、游戏等地方广泛应用,是开发者解决高性能存储问题的首选利器。