Redis的使用總結

Redis 核心使用場景

  1. 緩存加速

    • 高頻訪問數據緩存(如商品信息、用戶信息)

    • 緩解數據庫壓力,提升響應速度

  2. 會話存儲

    • 分布式系統共享 Session(替代 Tomcat Session)

    • 支持 TTL 自動過期

  3. 排行榜/計數器

    • 實時排序(Sorted Set 實現)

    • 文章閱讀量/點贊數統計(INCR 命令)

  4. 消息隊列

    • List 實現簡單隊列(LPUSH/BRPOP)

    • Streams 實現可靠消息隊列(Redis 5.0+)

  5. 分布式鎖

    • SETNX 命令實現互斥鎖

    • Redisson 客戶端封裝分布式鎖

  6. 實時系統

    • 用戶行為記錄(最近搜索、瀏覽歷史)

    • 實時數據統計(在線人數、地理位置)

Redis 數據類型與典型應用

數據類型結構特征典型場景操作命令示例
String二進制安全文本/數值緩存、計數器、分布式鎖SET/GET/INCR/DECR
Hash字段值映射表存儲對象(用戶信息、商品詳情)HSET/HGET/HGETALL
List雙向鏈表消息隊列、最新消息列表LPUSH/RPOP/LRANGE
Set無序唯一集合標簽系統、共同好友SADD/SMEMBERS/SINTER
ZSet有序分值集合排行榜、延遲隊列ZADD/ZRANGE/ZREVRANGE
Stream消息流(持久化隊列)消息隊列(支持消費者組)XADD/XREAD/XGROUP
BitMap位操作簽到統計、用戶畫像SETBIT/BITCOUNT/BITOP
HyperLogLog基數估算算法UV 統計(去重計數)PFADD/PFCOUNT

鍵(Key)命名規范

  1. 層級結構業務模塊:子模塊:唯一標識

    • 示例:user:profile:1001

  2. 命名原則

    • 長度 ≤ 100 字符

    • 避免特殊字符(推薦字母數字 + 冒號)

    • 可讀性優先(如?order:status:2024

Spring Boot 集成實踐

1. 添加依賴
<!-- Spring Data Redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!-- 連接池(推薦) -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
2. 配置參數 (application.yml)
spring:redis:host: 127.0.0.1port: 6379password: yourpasswordlettuce:pool:max-active: 20max-idle: 10min-idle: 5
3. 核心組件配置
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(RedisSerializer.string());template.setValueSerializer(RedisSerializer.json());return template;}@Beanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {return new StringRedisTemplate(factory);}
}
4. 使用示例
@Component
public class UserService {private final RedisTemplate<String, User> redisTemplate;// 存儲用戶信息public void cacheUser(User user) {redisTemplate.opsForValue().set("user:" + user.getId(), user, 30, TimeUnit.MINUTES);}// 獲取用戶信息public User getCachedUser(Long userId) {return redisTemplate.opsForValue().get("user:" + userId);}// 使用 Hash 存儲對象public void cacheUserProfile(Long userId, Map<String, String> profile) {redisTemplate.opsForHash().putAll("user:profile:" + userId, profile);}
}
5. 注解緩存支持
@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {return RedisCacheManager.builder(factory).cacheDefaults(RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1))).build();}
}// 業務使用
@Service
public class ProductService {@Cacheable(value = "products", key = "#productId")public Product getProductById(String productId) {// 數據庫查詢邏輯}
}

最佳實踐建議

  1. 連接池配置:合理設置 max-active 防止連接耗盡

  2. 序列化選擇:優先使用 JSON 序列化(Jackson2JsonRedisSerializer)

  3. 大Key規避:String 類型 value ≤ 10KB,集合元素 ≤ 1萬

  4. 事務限制:Redis 事務非原子性,推薦使用 Lua 腳本

  5. 監控告警:集成 Prometheus + Grafana 監控 QPS、內存等指標

緩存穿透緩存雪崩緩存擊穿

問題定義后果解決方案
緩存穿透請求的數據在緩存和數據庫中都不存在大量無效請求打到數據庫緩存空值、布隆過濾器、請求數據基礎格式校驗
緩存雪崩大量緩存同時過期,導致請求打到數據庫數據庫壓力驟增,可能崩潰隨機過期時間、多級緩存、限流與降級、熱點數據永不過期
緩存擊穿熱點 key 過期時,大量請求同時訪問數據庫壓力瞬間增大互斥鎖、邏輯過期、提前刷新

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

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

相關文章

富文本編輯器實現

&#x1f3a8; 富文本編輯器實現原理全解析 &#x1f4dd; 基本實現路徑圖 #mermaid-svg-MO1B8a6kAOmD8B6Y {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MO1B8a6kAOmD8B6Y .error-icon{fill:#552222;}#mermaid-s…

LeetCode熱題100——283. 移動零

給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸入: nums [0] 輸出:…

與Ubuntu相關命令

windows將文件傳輸到Ubuntu 傳輸文件夾或文件 scp -r 本地文件夾或文件 ubuntu用戶名IP地址:要傳輸到的文件夾路徑 例如&#xff1a; scp -r .\04.py gao192.168.248.129:/home/gao 如果傳輸文件也可以去掉-r 安裝軟件 sudo apt-get update 更新軟件包列表 sudo apt insta…

Kafka 在小流量和大流量場景下的順序消費問題

一、低流量系統 特點 消息量較少&#xff0c;吞吐量要求低。系統資源&#xff08;如 CPU、內存、網絡&#xff09;相對充足。對延遲容忍度較高。 保證順序消費的方案 單分區 單消費者 將消息發送到單個分區&#xff08;例如固定 Partition 0&#xff09;&#xff0c;由單個…

小程序 GET 接口兩種傳值方式

前言 一般 GET 接口只有兩種URL 參數和路徑參數 一&#xff1a;URL 參數&#xff08;推薦方式&#xff09; 你希望請求&#xff1a; https://serve.zimeinew.com/wx/products/info?id5124接口應該寫成這樣&#xff0c;用 req.query.id 取 ?id5124&#xff1a; app.get(&…

小白學習java第14天(中):數據庫

1.DML data manage language數據庫管理語言 外鍵:外鍵是什么&#xff1f;就是對其進行表與表之間的聯系&#xff0c;就是使用的鍵進行關聯&#xff01; 方法一&#xff1a;我們在數據庫里面就對其進行表與表之間的連接【這種是不建議的&#xff0c;我不太喜歡就是將數據里面弄…

NO.95十六屆藍橋杯備戰|圖論基礎-單源最短路|負環|BF判斷負環|SPFA判斷負環|郵遞員送信|采購特價產品|拉近距離|最短路計數(C++)

P3385 【模板】負環 - 洛谷 如果圖中存在負環&#xff0c;那么有可能不存在最短路。 BF算法判斷負環 執?n輪松弛操作&#xff0c;如果第n輪還存在松弛操作&#xff0c;那么就有負環。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…

K8s pod 應用

/** 個人學習筆記&#xff0c;如有問題歡迎交流&#xff0c;文章編排和格式等問題見諒&#xff01; */ &#xff08;1&#xff09;編寫 pod.yaml 文件 pod 是 kubernetes 中最小的編排單位&#xff0c;一個 pod 里包含一個或多個容器。 apiVersion: v1 # 指定api版本 kind…

Oracle創建觸發器實例

一 創建DML 觸發器 DML觸發器基本要點&#xff1a; 觸發時機&#xff1a;指定觸發器的觸發時間。如果指定為BEFORE&#xff0c;則表示在執行DML操作之前觸發&#xff0c;以便防止某些錯誤操作發生或實現某些業務規則&#xff1b;如果指定為AFTER&#xff0c;則表示在執行DML操作…

Filename too long 錯誤

Filename too long 錯誤表明文件名超出了文件系統或版本控制系統允許的最大長度。 可能的原因 文件系統限制 不同的文件系統對文件名長度有不同的限制。例如&#xff0c;FAT32 文件名最長為 255 個字符&#xff0c;而 NTFS 雖然支持較長的文件名&#xff0c;但在某些情況下也…

網絡不可達network unreachable問題解決過程

問題&#xff1a;訪問一個環境中的路由器172.16.1.1&#xff0c;發現ssh無法訪問&#xff0c;ping發現回網絡不可達 C:\Windows\System32>ping 172.16.1.1 正在 Ping 172.16.1.1 具有 32 字節的數據: 來自 172.16.81.1 的回復: 無法訪問目標網。 來自 172.16.81.1 的回復:…

Python設計模式:備忘錄模式

1. 什么是備忘錄模式&#xff1f; 備忘錄模式是一種行為設計模式&#xff0c;它允許在不暴露對象內部狀態的情況下&#xff0c;保存和恢復對象的狀態。備忘錄模式的核心思想是將對象的狀態保存到一個備忘錄對象中&#xff0c;以便在需要時可以恢復到之前的狀態。這種模式通常用…

Python基礎語法3

目錄 1、函數 1.1、語法格式 1.2、函數返回值 1.3、變量作用域 1.4、執行過程 1.5、鏈式調用 1.6、嵌套調用 1.7、函數遞歸 1.8、參數默認值 1.9、關鍵字參數 2、列表 2.1、創建列表 2.2、下標訪問 2.3、切片操作 2.4、遍歷列表元素 2.5、新增元素 2.6、查找元…

JavaEE學習筆記(第二課)

1、好用的AI代碼工具cursor 2、Java框架&#xff1a;Spring(高級框架)、Servelt、Struts、EJB 3、Spring有兩層含義&#xff1a; ①Spring Framework&#xff08;原始框架&#xff09; ②Spring家族 4、Spring Boot(為了使Spring簡化) 5、創建Spring Boot 項目 ① ② ③…

基于Flask與Ngrok實現Pycharm本地項目公網訪問:從零部署

目錄 概要 1. 環境與前置條件 2. 安裝與配置 Flask 2.1 創建虛擬環境 2.2 安裝 Flask 3. 安裝與配置 Ngrok 3.1 下載 Ngrok 3.2 注冊并獲取 Authtoken 4. 在 PyCharm 中創建 Flask 項目 5. 運行本地 Flask 服務 6. 啟動 Ngrok 隧道并獲取公網地址 7. 完整示例代碼匯…

Ragflow、Dify、FastGPT、COZE核心差異對比與Ragflow的深度文檔理解能力??和??全流程優化設計

一、Ragflow、Dify、FastGPT、COZE核心差異對比 以下從核心功能、目標用戶、技術特性等維度對比四款工具的核心差異&#xff1a; 核心功能定位 ? Ragflow&#xff1a;專注于深度文檔理解的RAG引擎&#xff0c;擅長處理復雜格式&#xff08;PDF、掃描件、表格等&#xff09;的…

LeetCode[232]用棧實現隊列

思路&#xff1a; 一道很簡單的題&#xff0c;就是棧是先進后出&#xff0c;隊列是先進先出&#xff0c;用兩個棧底相互對著&#xff0c;這樣一個隊列就產生了&#xff0c;右棧為空的情況&#xff0c;左棧棧底就是隊首元素&#xff0c;所以我們需要將左棧全部壓入右棧&#xff…

postman 刪除注銷賬號

一、刪除賬號 1.右上角找到 頭像&#xff0c;view profile https://123456-6586950.postman.co/settings/me/account 二、找回賬號 1.查看日志所在位置 三、postman更新后只剩下history 在 Postman 中&#xff0c;如果你發現更新后只剩下 History&#xff08;歷史記錄&…

微服務相比傳統服務的優勢

這是一道面試題&#xff0c;咱們先來分析這道題考察的是什么。 如果分析面試官主要考察以下幾個方面&#xff1a; 技術理解深度 你是否清楚微服務架構&#xff08;Microservices&#xff09;和傳統單體架構&#xff08;Monolithic&#xff09;的本質區別。能否從設計理念、技術…

【KWDB 創作者計劃】_深度學習篇---向量指令集

文章目錄 前言一、加速原理數據級并行(DLP)計算密度提升減少指令開銷內存帶寬優化隱藏內存延遲二、關鍵實現技術1. 手動向量化(Intrinsics)優勢挑戰2. 編譯器自動向量化限制3. BLAS/LAPACK庫優化4. 框架級優化三、典型應用場景矩陣運算卷積優化歸一化/激活函數嵌入層(Embe…