目錄
一、前言提要
二、核心特性?
三、數據結構??
四、應用場景
五、架構模式?
六、性能優勢??
七、客戶端庫
八、注意事項
九、選擇建議
十、使用示例——基于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 在互聯網、金融、游戲等領域廣泛應用,是開發者解決高性能存儲問題的首選利器。