Redis適用場景

Redis適用場景

  • 一、加速緩存
  • 二、會話管理
  • 三、排行榜和計數器
  • 四、消息隊列
  • 五、實時分析
  • 六、分布式鎖
  • 七、地理位置數據
  • 八、限流
  • 九、數據共享
  • 十、簽到

一、加速緩存

Redis最常見的應用之一是作為緩存層,用于存儲頻繁訪問的數據,從而減輕數據庫的負載。
通過將數據存儲在內存中,Redis可以實現高速的讀取和寫入操作,極大地提升應用程序的性能。例如,在一個電子商務網站中,可以將熱門商品的信息存儲在Redis中,當用戶訪問這些商品時,首先從Redis中讀取,如果Redis中沒有,再從數據庫中讀取并更新到Redis中。
示例
假設我們有一個在線書店應用,用戶經常查看書籍的詳細信息。
我們可以使用Redis來緩存這些熱門書籍的信息:

// 嘗試從Redis緩存中獲取書籍信息
Book cachedBook = redisTemplate.opsForValue().get(id);
if (cachedBook != null) {return cachedBook;
}// 如果緩存中沒有,從數據庫查詢
Bookbook book = bookRepository.findById(id).orElse(null);
if (book != null) {// 將查詢結果放入緩存,并設置過期時間redisTemplate.opsForValue().set(id, book, 10, TimeUnit.MINUTES);
}
return book;

二、會話管理

在Web應用中,Redis常用于存儲用戶會話信息,如登錄狀態、購物車內容等。
由于其快速的讀寫速度,Redis非常適合這種需要頻繁訪問和更新的數據。
示例
假設我們有一個需要用戶登錄的Web應用,可以使用Redis來存儲用戶的登錄狀態:

// 用戶登錄時,將會話信息存儲到Redis中
redisTemplate.opsForValue().set(sessionId, user, 1, TimeUnit.HOURS);// 用戶訪問時,從Redis中獲取會話信息
User user = redisTemplate.opsForValue().get(sessionId);
if (user != null) {// 用戶已登錄,繼續處理請求
} else {// 用戶未登錄,重定向到登錄頁面
}

三、排行榜和計數器

Redis的原子增減操作非常適合用于計數器和排行榜應用,如社交媒體的點贊數、閱讀數、排名等。
Redis的Sorted Set數據類型可以方便地實現排行榜功能。
示例
假設我們要實現一個文章閱讀量排行榜:

// 增加文章的閱讀量
redisTemplate.opsForValue().increment("article:" + articleId + ":views");// 獲取排行榜
Set<ZSetOperations.TypedTuple<String>> range = redisTemplate.opsForZSet().reverseRangeWithScores("article:views", 0, 9);
for (ZSetOperations.TypedTuple<String> tuple : range) {System.out.println("文章ID: " + tuple.getValue() + ", 閱讀量: " + tuple.getScore());
}

四、消息隊列

Redis支持發布/訂閱模式,可以用作輕量級的消息隊列系統,用于異步任務處理、事件處理等。
示例
假設我們要實現一個異步任務處理系統:

// 生產者發送消息
redisTemplate.convertAndSend("taskQueue", new TaskMessage("processData"));// 消費者接收消息并處理
@RedisMessageListener(topics = "taskQueue")
public void receiveMessage(Message message, String channel) {TaskMessage taskMessage = (TaskMessage) message.getBody();processData(taskMessage.getData());
}

五、實時分析

Redis的有序集合和位圖數據結構使其成為實時分析和計數的理想工具,可以用于記錄用戶活動、頁面訪問量等。
示例
假設我們要統計網站的訪問量:

// 增加頁面訪問量
redisTemplate.opsForValue().increment("page:" + pageId + ":views");// 獲取頁面訪問量
Long views = redisTemplate.opsForValue().get("page:" + pageId + ":views");
System.out.println("頁面訪問量: " + views);

六、分布式鎖

在分布式系統中,Redis可以用于實現分布式鎖,可以在分布式系統中協調多節點對共享資源的訪問,確保操作的原子性。
示例:

// 實現一個分布式鎖來防止并發寫入數據庫
// 嘗試獲取鎖
Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent("lock:data", "locked", 10, TimeUnit.SECONDS);
if (lockAcquired) {try {// 持有鎖,執行數據庫寫操作} finally {// 釋放鎖redisTemplate.delete("lock:data");}
} else {// 獲取鎖失敗,等待或重試
}
public void redisLock() throws InterruptedException {//獲取鎖(重入鎖),執行鎖的名稱RLock lock = redissonclient.getlock("my:book:lock:id");//嘗試獲取鎖,參數分別是:獲取鎖的最大等待時間(期間會重試),鎖自動釋放時間,時間單位//boolean isLock=lock.tryLock(10,30,TimeUnit.SECONDS);boolean isLock =lock.tryLock( time:10,TimeUnit.SECONDS);//判斷是否獲取成功if (isLock) {try {System.out.println("執行業務");} finally {//釋放鎖lock.unlock();}}
}
public <T> T executeWithLock(String lockKey, long timeout, Callable<T> action) {RLock lock = redissonClient.getLock(lockKey);boolean isLock = false;try {// 嘗試獲取鎖,最大等待時間1秒,鎖自動釋放時間為timeout秒isLock = lock.tryLock(1, timeout, TimeUnit.SECONDS);if (isLock) {try {// 執行傳入的操作并返回結果return action.call();} finally {// 檢查是否持有鎖再釋放if (lock.isHeldByCurrentThread()) {lock.unlock();}}} else {System.out.println("未能獲取鎖,稍后重試");return null; // 或者拋出異常}} catch (InterruptedException e) {// 處理異常,恢復線程中斷狀態Thread.currentThread().interrupt();System.out.println("獲取鎖時被中斷");return null; // 或者拋出異常} catch (Exception e) {// 處理其他異常System.out.println("執行操作時發生異常: " + e.getMessage());return null; // 或者拋出異常}
}

redis實現的分布式鎖是不可重入的。同一個線程再次獲取鎖會失敗。
redisson實現的分布式鎖是可重入的。同一個線程可以再次獲取鎖,判斷依據是線程id。可重入能避免多個鎖之間產生死鎖的問題。它在存儲鎖數據的時候利用的是hash結構記錄線程id和重入次數,key是自定義的鎖名稱。

七、地理位置數據

Redis支持地理空間數據,可以用于構建地理位置應用,如附近的人、地點推薦等功能。
示例
假設我們要實現一個附近的人功能:

// 添加地理位置坐標
redisTemplate.opsForGeo().add("users", "user1", 116.397428, 39.90923);// 查詢附近的人
GeoResults<RedisGeoCommands.GeoLocation<String>> nearbyUsers = redisTemplate.opsForGeo().radius("users", 116.397428, 39.90923, 1, RedisGeoCommands.GeoUnit.KILOMETERS);
for (GeoResult<RedisGeoCommands.GeoLocation<String>> result : nearbyUsers) {System.out.println("用戶ID: " + result.getContent().getName() + ", 距離: " + result.getDistance().getValue() + "km");
}
# 添加餐廳地理位置
GEOADD restaurants 13.361389 38.115556 "餐廳A"
GEOADD restaurants 15.087269 37.502669 "餐廳B"
GEOADD restaurants 9.191383 45.464211 "餐廳C"# 用戶當前位置:經緯度 (14, 37)
# 查找附近 100 公里內的餐廳
GEORADIUS restaurants 14 37 100 km
# 返回:餐廳A 餐廳B

八、限流

Redis 適合用于限流(Rate Limiting)場景。限流的目的是控制某個操作在特定時間內的訪問頻率,比如 API 請求、短信發送、登錄嘗試等。Redis 的原子操作和高效性能使其成為實現限流的理想工具。
示例
假設我們要限制API的調用頻率

// 嘗試獲取令牌
Long tokens = redisTemplate.opsForValue().increment("api:" + apiId + ":tokens");
if (tokens <= 10) {// 令牌充足,處理請求
} else {// 令牌不足,拒絕請求
}

使用 Redis 實現滑動窗口計數器

  • 使用 Redis 的 List 存儲每次請求的時間。
  • 每次請求時,移除時間窗口外的舊記錄,并添加新記錄。
  • 統計當前時間窗口內的記錄數,如果超過閾值則拒絕請求。

限制每個用戶每分鐘只能訪問10次,假設用戶在第一分鐘的最后一秒訪問了9次,又在下一分鐘的第一秒訪間了10次,這樣的訪問是可以通過現在的訪問頻率限制的,但實際上該用戶在2秒內訪問了19次,這與每個用戶每分鐘只能訪問10次的限制差距較大。盡管這種情況比較極端,但是在一些場合中還是需要粒度更小的控制方案。如果要精確地保證每分鐘最多訪問10次需要記下用戶每次訪問的時間。
因此對每個用戶,我們使用一個列表類型的鍵來記錄他最近10次訪間客的時間。一旦鍵中的元素超過10個,就判斷時間最早的元素距現在的時間是否小于1分鐘。如果是則表示用戶最近1分鐘的訪問次數超過了10次;如果不是就將現在的時間加入到列表中,同時把最早的元素刪除。
如果要限制“A時間最多訪問B次”時,如果“B”的數值較大,此方法會占用較多的存儲空間,實際使用時還需要開發者自己去權衡。

// 偽代碼如下
// 獲取列表長度
$listLength = LLEN rate:limiting:$IP
if $listLength<10// 將當前時間新增到列表左側LPUSH rate:limiting:$IP now()
else // 獲取列表最后一位元素,也就是最早的那個時間$time = LINDEX rate:limiting:$IP - 1if now() - $time < 60return "訪問超過了限制"else// 將當前時間新增到列表左側,并刪除最右側的元素LPUSH rate:limiting:$IP now()RPOP rate:limiting:$IP

九、數據共享

在微服務架構中,Redis可以作為服務間共享數據的媒介。
示例
假設我們有兩個服務需要共享用戶信息:

// 服務A設置用戶信息
redisTemplate.opsForValue().set("user:" + userId, user);// 服務B獲取用戶信息
User user = redisTemplate.opsForValue().get("user:" + userId);

十、簽到

Redis的Bitmap是一種非常適合用于簽到系統的數據結構。它通過位圖(bit array)存儲和操作數據,可以高效地處理大量的簽到操作,特別適合于需要頻繁更新并查詢某個用戶是否已簽到的場景。
假設每個用戶的簽到狀態通過 位圖(Bitmap) 記錄,每個用戶對應一個唯一的 ID,通過設置和查詢位來確定該用戶是否簽到。

設置用戶 101 已簽到
SETBIT sign_in_bitmap 101 1比如查詢用戶 ID 為 101 的簽到狀態
GETBIT sign_in_bitmap 101統計總共有多少用戶已簽到
BITCOUNT sign_in_bitmap

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

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

相關文章

【LangChain4j快速入門】5分鐘用Java接入AI大模型,Spring Boot整合實戰!| 附源碼

【LangChain4j快速入門】5分鐘用Java接入AI大模型&#xff0c;Spring Boot整合實戰&#xff01; 前言&#xff1a;當Java遇上大模型 在AI浪潮席卷全球的今天&#xff0c;Java開發者如何快速擁抱大語言模型&#xff1f;LangChain4j作為專為Java打造的AI開發框架&#xff0c;以…

2025第十七屆“華中杯”大學生數學建模挑戰賽題目B 題 校園共享單車的調度與維護問題完整成品正文33頁(不含附錄)文章思路 模型 代碼 結果分享

校園共享單車運營優化與調度模型研究 摘 要 本研究聚焦校園共享單車點位布局、供需平衡、運營效率及故障車輛回收四大核心問題&#xff0c;通過構建一系列數學模型&#xff0c;系統分析與優化共享單車的運維體系。 針對問題一&#xff0c;我們建立了基于多時段觀測的庫存估算…

Unity游戲多語言工具包

由于一開始的代碼沒有考慮多語言場景&#xff0c;導致代碼中提示框和UI顯示直接用了中文&#xff0c;最近開始提取代碼的中文&#xff0c;提取起來太麻煩&#xff0c;所以拓展了之前的多語言包&#xff0c;降低了操作復雜度。最后把工具代碼提取出來到單獨項目里面&#xff0c;…

.NET MCP 文檔

MCP 概述 MCP&#xff08;Model Context Protocol&#xff09;是由 Anthropic 推出的一種開放協議&#xff0c;類似 AI 的 USB-C 擴展塢&#xff0c;用于在大模型和數據源之間建立安全的通信&#xff08;授權&#xff09;&#xff0c;讓 AI 應用能夠安全地訪問和操作本地或遠程…

【Linux】vim配置----超詳細

目錄 一、插件管理器準備 二、目錄準備 三、安裝插件 一、插件管理器準備 Vim-plug 是一個Vim插件管理器&#xff0c;利用異步并行可以快速地安裝、更新和卸載插件。它的安裝和配置都非常簡單&#xff0c;而且在操作過程中會給出很多易讀的反饋信息&#xff0c;是一個自由、…

PHP實現圖片自動添加水印效果

<?php // 設置原始圖片路徑和水印圖片路徑 $original_image original.jpg; $watermark_image watermark.png;// 創建圖片資源 $original imagecreatefromjpeg($original_image); $watermark imagecreatefrompng($watermark_image);// 獲取圖片尺寸 $original_width im…

檢查新接手LINUX服務器應用的部署情況和正在運行的服務

當接手一臺新的 Linux 服務器時&#xff0c;第一要務就是摸清系統上已經安裝部署了哪些應用和服務。 本文將以 CentOS7為例&#xff0c;詳細介紹如何系統地排查已安裝的應用和服務&#xff0c;包括它們的安裝方式和安裝位置。 1.查看系統基本信息 首先獲取系統整體信息&…

使用注解方式整合ssm時,啟動tomcat掃描不到resource下面的xxxmapper.xml問題,解決方法

解決org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.mapper.方法 在Spring與Mybatis整合時&#xff0c;可能會遇到這樣的報錯 原因&#xff1a; 其原因為mapper路徑的映射錯誤&#xff0c;表示在嘗試執行某個 Mapper 接口的方法時…

C++11特性補充

目錄 lambda表達式 定義 捕捉的方式 可變模板參數 遞歸函數方式展開參數包 數組展開參數包 移動構造和移動賦值 包裝器 綁定bind 智能指針 RAII auto_ptr unique_ptr shared_ptr 循環引用 weak_ptr 補充 總結 特殊類的設計 不能被拷貝的類 只能在堆上創建…

My SQL 索引

核心目標&#xff1a; 理解 mysql 索引的工作原理、類型、優缺點&#xff0c;并掌握創建、管理和優化索引的方法&#xff0c;以顯著提升數據庫查詢性能。 什么是索引&#xff1f; 索引是一種特殊的數據庫結構&#xff0c;它包含表中一列或多列的值以及指向這些值所在物理行的指…

極狐GitLab 注冊限制如何設置?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 注冊限制 (BASIC SELF) 您可以對注冊實施以下限制&#xff1a; 禁用新注冊。新注冊需要管理員批準。需要用戶電子郵件確認。…

10.(vue3.x+vite)div實現tooltip功能(css實現)

1:效果截圖 2:代碼實現 <template><div><div class="tooltip" style="margin-top: 20%; margin-left: 20%; background-color: blueviolet; color: white;

Linux下 文件的查找、復制、移動和解壓縮

1、在/var/log目錄下創建一個hehe.log的文件&#xff0c;其文件內容是&#xff1a; myhostname ghl mydomain localdomain relayhost [smtp.qq.com]:587 smtp_use_tls yes smtp_sasl_auth_enable yes smtp_sasl_security_options noanonymous smtp_sasl_tls_security_opt…

Ubuntu 安裝 Docker 教程(官方推薦方式)

? 步驟 1&#xff1a;卸載舊版本&#xff08;如果有&#xff09; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done---### ? 步驟 2&#xff1a;更新 APT 索引并安裝依賴項bash sudo a…

計算機視覺與深度學習 | Transformer原理,公式,代碼,應用

Transformer 詳解 Transformer 是 Google 在 2017 年提出的基于自注意力機制的深度學習模型,徹底改變了序列建模的范式,解決了 RNN 和 LSTM 在長距離依賴和并行計算上的局限性。以下是其原理、公式、代碼和應用的詳細解析。 一、原理 核心架構 Transformer 由 編碼器(Encod…

計算機基礎 | 常見進制與單位簡介 / 表示 / 描述

注&#xff1a;本文為 “進制與常見單位應用” 相關文章合輯。 原文為繁體&#xff0c;注意術語描述差異。 略作重排。 進制簡介&#xff08;二進制、八進制、十進制、十六進制&#xff09; 發表于 2017-01-20 鄭中勝 數字系統&#xff08;Numeral system&#xff09;&#…

門面模式與適配器模式

一、門面模式 門面模式&#xff1a;提供統一接口訪問子系統接口 1、包含角色 外觀系統對外的統一接口子系統類的集合&#xff1b;并不知道外觀角色的存在&#xff0c;需要為了配合外觀角色而做特殊處理或修改 2、舉例 原本開關燈要分別操作各個房間的燈&#xff0c;現在設置總…

SpringBoot Actuator指標收集:Micrometer與Prometheus集成

文章目錄 引言一、Spring Boot Actuator基礎二、Micrometer簡介與集成三、基本指標收集與配置四、自定義業務指標實現五、與Prometheus集成六、實戰案例&#xff1a;API性能監控總結 引言 在現代微服務架構中&#xff0c;監控應用程序的健康狀況和性能指標變得至關重要。Sprin…

【Android面試八股文】Android應用進程的啟動流程【二】

應用進程 1.1 Android系統進程的啟動過程&#xff1a; 1、init進程fork出Zygote進程后&#xff0c;Zygote進程會創建一個服務端socket&#xff0c;等待AMS發起socket請求。 同時&#xff0c;由Zygote進程fork出的SystemServer進程會啟動各項系統服務&#xff0c;其中就包含了A…

基于Django的AI客服租車分析系統

基于Django的AI客服租車分析系統 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】AI智能客服與用戶交互指導手冊 【技術棧】 ①&#xff1a;系統環境&#xff1a;Python 3.8&#xff0c;Django 4.2框架 ②&#xff1a;開發環境&a…