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 在互聯網、金融、游戲等領域廣泛應用,是開發者解決高性能存儲問題的首選利器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90624.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(LeetCode 每日一題) 3487. 刪除后的最大子數組元素和 (哈希表)

題目&#xff1a;3487. 刪除后的最大子數組元素和 思路&#xff1a;哈希表&#xff0c;時間復雜度0(n)。 維護數組nums的最大值mx&#xff0c;同時用哈希表mp維護數組中非負數出現的情況&#xff0c;記錄非負數的和sum。如果哈希表mp的大小為0&#xff0c;那么數組nums都是負數…

C 語言輸入輸出 (I/O)

C 語言輸出在C語言編程中&#xff0c;printf()是主要的輸出函數之一。該函數將格式化的輸出發送到屏幕。例如&#xff0c;示例1&#xff1a;C 語言輸出#include <stdio.h>int main (int argc, char* argv) {printf("Hello world\n");return 0; }輸出結果C Prog…

分布式系統中的緩存設計與應用

引言 緩存是分布式系統中的重要組件&#xff0c;主要解決高并發&#xff0c;大數據場景下&#xff0c;熱點數據訪問的性能問題。提供高性能的數據快速訪問。 本文是緩存在分布式應用第一篇文章&#xff0c;介紹緩存的原理&#xff0c;緩存的分類&#xff0c;緩存的設計&#xf…

智能機器人的技術革命:從感知到決策的全棧架構解析

——基于多模態大模型的下一代機器人系統設計引言&#xff1a;機器人技術的范式遷移當波士頓動力的Atlas完成后空翻時&#xff0c;全球見證了機器人運動控制的巔峰&#xff1b;但當Figure 01通過大模型理解人類模糊指令并自主執行任務時&#xff0c;我們正見證機器人認知智能的…

day20 雙向鏈表

雙向鏈表的函數功能注意事項 1.雙向鏈表還需要關注到前指針的指向2.函數都需要判斷邏輯3.函數的增刪都要關注到len的變化4.函數的改查功能都需要遍歷結束的標志NULL5.注意p->next->prio時&#xff0c;p->next是否指向NULL創建雙向鏈表頭節點Node_ptr list_create()函數…

[Rust 基礎課程]猜數字游戲-獲取用戶輸入并打印

創建項目 按照之前的章節講的創建一個 Cargo 項目的方法&#xff0c;自己創建一個名為 guessing_game 的 cargo 項目并執行&#xff0c;確保能成功打印出 Hello World。 編寫代碼 使用 RustRover 打開項目&#xff0c;打開 src/main.rs 文件&#xff0c;我們將在這個文件中編寫…

重讀《人件》Peopleware -(22)Ⅲ 適當人選 Ⅵ 樂在其中(上)

本章以一個小測驗開始&#xff1a;問題1&#xff1a;在過去幾年里&#xff0c;你們組織的年員工流失率是多少&#xff1f; 問題2&#xff1a;替換一個離職員工平均需要多少成本&#xff1f;評分標準如下&#xff1a;如果你對這兩個問題有任何答案&#xff0c;則通過&#xff1b…

Go、Node.js、Python、PHP、Java五種語言的直播推流RTMP協議技術實施方案和思路-優雅草卓伊凡

Go、Node.js、Python、PHP、Java五種語言的直播推流RTMP協議技術實施方案和思路-優雅草卓伊凡既然我們甲方要做直播私有化&#xff0c;既然我們做了這么多年系統&#xff0c;我們對直播的理解很深&#xff0c;那么我們2025年就應該用更先進的技術棧&#xff0c;不然怎么讓我們的…

SpringBoot 集成Mybatis Plus

一、為什么SpringBoot不推薦使用MybatisSpring Boot 不推薦使用 MyBatis&#xff0c;主要源于二者在設計理念、生態融合和開發風格上的差異。Spring Boot 強調“約定優于配置”&#xff0c;追求高效的開發體驗和統一的框架風格。它通過自動配置和依賴注入&#xff0c;將復雜的基…

PI 思維升級 PI設計的典范轉移:從阻抗思維到諧振控制

們先來回想一件事&#xff0c;根據歐姆定律&#xff0c;阻抗是不是越低越好&#xff1f; 代表即使有很大的瞬時電流&#xff0c;瞬間的電壓降也不會超過某個極限&#xff01;理論上是&#xff01; 可是這其實忽略了兩個關鍵的要素&#xff1a;PDN阻抗有諧振&#xff1a;諧振代表…

如何制定企業級服務器安全策略(Security Policy)

制定一套**企業級服務器安全策略&#xff08;Security Policy&#xff09;**對于保護服務器資源、數據安全和業務連續性至關重要。以下是制定安全策略的詳細指南&#xff0c;包括安全策略的核心要素、實施步驟和具體措施&#xff0c;幫助企業構建全面的服務器安全防護體系。1. …

n1 armbian docker compose 部署aipan mysql

apt update apt install docker-compose-plugin -y #安裝docker compose docker compose version Docker Compose version v2.38.2 sudo mkdir -p /sda1/data/mysql/conf.d sudo chown -R 999:999 /sda1/data/mysql # MySQL 用戶 UID 通常為 999 cat docker-compose.yml vers…

RAG情境化分段向量模型voyage-context-3,聚焦分段細節,融入全局文檔上下文

最近看到一個有意思的工作&#xff0c;原文來自&#xff1a; https://blog.voyageai.com/2025/07/23/voyage-context-3/?utm_sourceTWITTER&utm_mediumORGANIC_SOCIAL voyage-context-3&#xff1a;聚焦分段細節&#xff0c;融入全局文檔上下文 概要&#xff1a; Voyage A…

計算機體系結構中的中斷服務程序ISR是什么?

計算機體系結構中的中斷服務程序ISR是什么&#xff1f; 在計算機體系結構中&#xff0c;中斷服務程序&#xff08;Interrupt Service Routine, ISR&#xff09; 是操作系統或硬件直接調用的關鍵代碼模塊&#xff0c;用于響應來自硬件設備、軟件異常或系統事件的中斷信號。其核心…

開源項目XBuilder前端框架

spx-gui/ 配置文件package.json 項目依賴和腳本配置vite.config.ts Vite構建工具配置tsconfig.json TS項目配置主文件tsconfig.app.json 應用程序的TS配置tsconfig.node.json Node.js環境的TS配置index.html 應用入口HTML文件src/ 源碼目錄main.ts 應用入口文件&#xff0c;初始…

0723 單項鏈表

Part 1.完成單向鏈表&#xff0c;并完成下面功能1.單鏈表節點創建鏈表是物理空間上不連續的一個結構&#xff0c;需要創建一個next作為指向下一個節點的指針&#xff0c;所以需要建立一個結構體包含數據域&#xff0c;next指針域&#xff0c;記錄長度的數據域。因為長度只有頭節…

基于 ASP.NET Web 應用程序(.NET Framework)的花店系統

1.1功能模塊實現1.1.1整體結構界面由兩部分組成&#xff1a;左側導航欄、右側內容展示區。使用了 Bootstrap 5 的樣式庫&#xff0c;并結合了 ASP.NET MVC 的 Html.ActionLink 和 Razor 條件判斷語句來動態生成菜單項。1.1.2導航欄功能模塊導航欄基礎結構導航欄基礎結構使用 Bo…

C++ Qt6 CMake qml文件啟動方式說明

在Qt6之后,Qt程序默認使用CMake進行構建,當然也可以使用qmake, 本篇博客介紹Qt6.8之前和Qt6.8版本中QtQuick程序的啟動方式。 在QtQuick程序main.cpp里qml的文件啟動分為兩種:(1)直接加載qml文件,(2)加載qml模塊,下面分別介紹這兩種啟動方式。 方式1:直接啟動qml文…

字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼之后存儲比特數是多少?

要計算字符串 “asdasjkfkasgfgshaahsfaf” 經過哈夫曼編碼后的存儲比特數&#xff0c;需按以下步驟進行&#xff1a;步驟 1&#xff1a;統計字符出現頻率先統計字符串中每個字符的出現次數&#xff1a;a&#xff1a;出現 6 次s&#xff1a;出現 6 次d&#xff1a;出現 1 次j&a…