返利APP排行榜數據實時更新:基于 WebSocket 與 Redis 的高并發數據推送技術

返利APP排行榜數據實時更新:基于 WebSocket 與 Redis 的高并發數據推送技術

大家好,我是阿可,微賺淘客系統及省賺客APP創始人,是個冬天不穿秋褲,天冷也要風度的程序猿!

在返利APP運營中,用戶對排行榜數據的實時性要求極高——無論是“今日收益TOP10”還是“熱門商品銷量榜”,延遲超過1秒就可能影響用戶體驗。傳統的輪詢方案不僅會造成服務器資源浪費,還無法滿足高并發場景下的實時推送需求。本文將基于WebSocket的全雙工通信能力與Redis的高性能緩存特性,提供一套可落地的高并發數據推送方案,全程附帶完整Java代碼實現。
返利 APP 排行榜

一、技術選型核心依據

1.1 WebSocket 替代輪詢的必然性

傳統輪詢通過客戶端定時發送HTTP請求獲取數據,存在兩大問題:一是空請求占比高(當數據無更新時,請求仍會占用帶寬與服務器資源);二是實時性差(輪詢間隔決定了數據延遲)。而WebSocket通過一次TCP握手建立持久連接,服務器可主動向客戶端推送數據,推送延遲可控制在100ms內,且單個連接的資源占用僅為HTTP輪詢的1/10。

1.2 Redis 高并發支撐能力

排行榜數據需頻繁更新(如用戶返利金額變動)與查詢,Redis的Sorted Set(ZSet) 結構天然適合排序場景,支持O(logN)復雜度的插入、刪除與排序操作。同時,Redis的發布訂閱(Pub/Sub)功能可實現數據更新后的實時通知,配合WebSocket完成端到端推送。

二、核心技術實現(Java代碼)

2.1 Redis 排行榜操作封裝(cn.juwatech.redis.RankRedisService)

package cn.juwatech.redis;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.Set;@Service
public class RankRedisService {// 返利排行榜Redis Key前綴private static final String RANK_KEY_PREFIX = "rebate:rank:";// 排行榜數據更新訂閱頻道public static final String RANK_UPDATE_CHANNEL = "rebate:rank:update";@Resourceprivate RedisTemplate<String, Object> redisTemplate;@Resourceprivate ZSetOperations<String, Object> zSetOperations;/*** 更新用戶排行榜數據* @param rankType 排行榜類型(如"daily_income":日收益,"month_sales":月銷量)* @param userId 用戶ID* @param score 排序分數(如收益金額、銷量)*/public void updateRankScore(String rankType, String userId, double score) {String rankKey = getRankKey(rankType);// 存儲用戶ID與對應分數到ZSet,分數相同按插入順序排序zSetOperations.add(rankKey, userId, score);// 限制排行榜長度(僅保留前100名,避免數據膨脹)zSetOperations.removeRange(rankKey, 0, -101);// 發布數據更新通知redisTemplate.convertAndSend(RANK_UPDATE_CHANNEL, rankType);}/*** 獲取排行榜前N名數據* @param rankType 排行榜類型* @param topSize 前N名* @return 有序集合(score從高到低)*/public Set<ZSetOperations.TypedTuple<Object>> getTopRank(String rankType, int topSize) {String rankKey = getRankKey(rankType);// ZSet默認按score升序,reverseRange按降序獲取前topSize條return zSetOperations.reverseRangeWithScores(rankKey, 0, topSize - 1);}/*** 構建完整Redis Key*/private String getRankKey(String rankType) {return RANK_KEY_PREFIX + rankType;}
}

2.2 WebSocket 連接管理與數據推送(cn.juwatech.websocket.RankWebSocketServer)

基于Spring WebSocket實現,支持用戶建立連接時訂閱指定排行榜,數據更新時定向推送。

package cn.juwatech.websocket;import cn.juwatech.redis.RankRedisService;
import cn.juwatech.redis.RankRedisService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import javax.annotation.Resource;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Component
public class RankWebSocketServer extends TextWebSocketHandler implements MessageListener {// 存儲用戶會話與訂閱的排行榜類型(線程安全)private final Map<WebSocketSession, String> sessionRankMap = new ConcurrentHashMap<>();// 排行榜Redis服務@Resourceprivate RankRedisService rankRedisService;/*** 客戶端建立WebSocket連接時觸發*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {// 從連接參數中獲取用戶訂閱的排行榜類型(如?rankType=daily_income)String rankType = session.getUri().getQuery().split("=")[1];sessionRankMap.put(session, rankType);// 首次連接時推送當前排行榜數據pushRankData(session, rankType);}/*** 接收Redis數據更新通知,推送排行榜數據*/@Overridepublic void onMessage(Message message, byte[] pattern) {// 解析Redis訂閱消息(排行榜類型)String rankType = new String(message.getBody());// 遍歷訂閱該排行榜的所有會話,推送數據sessionRankMap.forEach((session, type) -> {if (rankType.equals(type) && session.isOpen()) {pushRankData(session, rankType);}});}/*** 推送排行榜數據到客戶端*/private void pushRankData(WebSocketSession session, String rankType) {try {// 從Redis獲取前10名排行榜數據var topRank = rankRedisService.getTopRank(rankType, 10);// 構建JSON格式響應(包含排行榜類型、數據列表)JSONObject response = new JSONObject();response.put("rankType", rankType);response.put("data", topRank.stream().map(tuple -> {JSONObject item = new JSONObject();item.put("userId", tuple.getValue());item.put("score", tuple.getScore());return item;}).toList());// 發送文本消息session.sendMessage(new TextMessage(response.toJSONString()));} catch (IOException e) {// 記錄推送失敗日志(實際項目中需結合監控告警)e.printStackTrace();}}/*** 客戶端關閉連接時清理會話*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {sessionRankMap.remove(session);}
}

2.3 WebSocket 配置類(cn.juwatech.config.WebSocketConfig)

package cn.juwatech.config;import cn.juwatech.redis.RankRedisService;
import cn.juwatech.websocket.RankWebSocketServer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;import javax.annotation.Resource;@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Resourceprivate RankWebSocketServer rankWebSocketServer;/*** 注冊WebSocket處理器,配置訪問路徑*/@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 允許跨域訪問,配置WebSocket訪問路徑為/ws/rebate-rankregistry.addHandler(rankWebSocketServer, "/ws/rebate-rank").setAllowedOrigins("*");}/*** 配置Redis消息監聽器,訂閱排行榜更新頻道*/@Beanpublic RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);// 訂閱排行榜更新頻道container.addMessageListener(listenerAdapter, new PatternTopic(RankRedisService.RANK_UPDATE_CHANNEL));return container;}/*** 綁定Redis消息監聽器與WebSocket處理器*/@Beanpublic MessageListenerAdapter listenerAdapter(RankWebSocketServer rankWebSocketServer) {return new MessageListenerAdapter(rankWebSocketServer);}
}

三、高并發場景優化策略

3.1 連接數承載優化

單個WebSocket服務器的并發連接數受限于操作系統文件句柄數(默認1024),生產環境需通過以下配置提升承載能力:

  1. 調整Linux系統參數:echo "net.core.somaxconn=65535" >> /etc/sysctl.conf(最大監聽隊列數);
  2. 采用Nginx反向代理實現WebSocket集群負載均衡,配置示例:
http {upstream websocket_servers {server 192.168.1.100:8080 weight=1;server 192.168.1.101:8080 weight=1;}server {listen 80;location /ws/rebate-rank {# 啟用WebSocket代理proxy_pass http://websocket_servers;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}}
}

3.2 Redis 性能優化

  1. 開啟Redis持久化(AOF+RDB),避免排行榜數據丟失;
  2. 對排行榜Key設置過期時間(如日收益榜24小時過期),減少內存占用;
  3. 使用Redis集群(3主3從),提升讀吞吐量與可用性。

四、客戶端接入示例(JavaScript)

// 建立WebSocket連接(根據環境替換域名)
const rankType = "daily_income"; // 訂閱日收益排行榜
const ws = new WebSocket(`ws://your-domain.com/ws/rebate-rank?rankType=${rankType}`);// 接收服務器推送的排行榜數據
ws.onmessage = function(event) {const rankData = JSON.parse(event.data);console.log("實時排行榜更新:", rankData);// 渲染排行榜到頁面(示例:更新表格)renderRankTable(rankData.data);
};// 連接關閉處理
ws.onclose = function() {console.log("WebSocket連接關閉,嘗試重連...");// 重連邏輯(避免頻繁重連,添加延遲)setTimeout(() => window.location.reload(), 3000);
};// 渲染排行榜表格
function renderRankTable(data) {const table = document.getElementById("rankTable").getElementsByTagName("tbody")[0];table.innerHTML = "";data.forEach((item, index) => {const row = table.insertRow();row.insertCell(0).textContent = index + 1; // 排名row.insertCell(1).textContent = item.userId; // 用戶IDrow.insertCell(2).textContent = (item.score).toFixed(2); // 收益金額(保留2位小數)});
}

本文著作權歸聚娃科技省賺客app開發者團隊,轉載請注明出處!

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

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

相關文章

[論文閱讀] 人工智能 + 軟件工程 | 告別冗余HTML與高算力消耗:EfficientUICoder如何破解UI2Code的token難題

告別冗余HTML與高算力消耗&#xff1a;EfficientUICoder如何破解UI2Code的token難題 論文信息信息類別具體內容論文原標題EfficientUICoder: A Dual-Modal Token Compression Framework for UI-to-Code Generation with Multimodal Large Language Models論文鏈接https://arxiv…

【STM32項目開源】STM32單片機智能語音風扇控制系統

目錄 一、設計背景和意義 1.1設計背景&#xff1a; 1.2設計意義&#xff1a; 二、實物展示 三、硬件功能介紹 2.1 硬件清單&#xff1a; 2.2 功能介紹&#xff1a; 四、軟件設計流程圖 五、硬件PCB展示 六、軟件主函序展示 七、單片機實物資料 資料獲取 查看主頁介…

git clone vllm

這個錯誤不是 vLLM 本身的問題&#xff0c;而是 pip 在 clone GitHub 倉庫時失敗了&#xff1a; error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush after ref listing根因通常是&#xff1a; 網絡問題&#xff08;訪問 GitHub 被中斷 / 代理…

光譜相機的新興領域應用

光譜相機在?新興領域?的應用正快速拓展&#xff0c;結合?AI、納米技術、量子傳感?等前沿科技&#xff0c;突破傳統檢測極限。以下是六大最具潛力的新興應用方向及技術突破點&#xff1a;?1. 元宇宙與數字孿生??應用場景?&#xff1a;?虛擬材質建模?&#xff1a;通過高…

深入理解數據結構之復雜度

文章目錄1.數據結構前言1.1 數據結構1.2 算法2.算法效率2.1 復雜度的概念2.2 復雜度的重要性3.1 大O的漸進表式法3.2 時間復雜度計算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例74.空間復雜度4.1 空間復雜度計算示例4.1.1 示例14.1.2 示…

【Vue3】10-編寫vue項目時,ref的應用(2)

合集篇&#xff1a; 1.【Vue3】創建并運行一個簡易的Vue3項目 2.【Vue3】編寫vue實現一個簡單效果&#xff0c;并使用setup糖簡化代碼 目錄refref 定義對象類型的響應式數據1. 概念理解a. 概念b. 分析2. 代碼實操代碼場景步驟一&#xff1a;導入ref步驟二&#xff1a;修改數據形…

clickhouse 中SUM(CASE WHEN ...) 返回什么類型?

文章目錄clickhouse 中SUM(CASE WHEN ...) 返回什么類型&#xff1f;CASE WHENSUM(CASE WHEN ...) 返回什么類型&#xff1f;clickhouse 中SUM(CASE WHEN …) 返回什么類型&#xff1f; CASE WHEN ClickHouse中的CASE WHEN用法與SQL標準中的用法基本相同&#xff0c;用于實現…

【算法】C語言多組輸入輸出模板

在 C語言 里&#xff0c;“多組輸入輸出”是很多在線評測系統&#xff08;OJ&#xff09;常見的模式&#xff0c;通常有兩種情況&#xff1a;1. 輸入到文件結束&#xff08;EOF&#xff09;比如題目沒有告訴有多少組數據&#xff0c;就需要一直讀直到輸入結束。#include <st…

【Ubuntu】sudo apt update出現E :倉庫***沒有Release文件

【Ubuntu】sudo apt update出現E &#xff1a;倉庫***沒有Release文件 1 問題描述 在執行sudo apt update更新一下軟件包時出現了如下報錯 E: 倉庫***沒有Release 文件。 N: 無法安全地用該源進行更新&#xff0c;所以默認禁用該源。 N:參見apt-secure&#xff08;8&#xf…

全球后量子遷移進展:區域特色與產業落地差異

一、量子威脅具象化&#xff1a;從技術風險到產業沖擊量子計算對傳統密碼體系的威脅已從理論走向現實&#xff0c;其破壞性不僅體現在算法破解效率的飛躍&#xff0c;更滲透到數據全生命周期的安全防護中。以金融領域為例&#xff0c;2024 年國際安全機構模擬實驗顯示&#xff…

貪心算法應用:決策樹(ID3/C4.5)詳解

Java中的貪心算法應用&#xff1a;決策樹&#xff08;ID3/C4.5&#xff09;詳解 決策樹是一種常用的機器學習算法&#xff0c;它通過遞歸地將數據集分割成更小的子集來構建樹形結構。ID3和C4.5是兩種經典的決策樹算法&#xff0c;它們都使用了貪心算法來選擇最優的特征進行分割…

華為任旭東:開源協作,激發創新,共創智能世界 | GOSIM HANGZHOU 2025

GOSIM HANGZHOU 2025峰會盛大開幕&#xff0c;華為首席開源聯絡官、CNCF基金會董事任旭東以《開源協作&#xff0c;激發創新&#xff0c;共創智能世界》為題發表Keynote演講。顛覆性技術到工業應用的轉換時間越來越短&#xff0c;AI技術正在推動傳統軟件產業的演進&#xff0c;…

本地部署 GPS 跟蹤系統 Traccar 并實現外部訪問

Traccar 是一款集成了強大的 java 后端服務的 GPS 跟蹤系統 。它支持在多種設備使用&#xff0c;在物流運輸、資產管理和個人安全等領域應用。本文將詳細的介紹如何利用 Docker 在本地部署 Traccar 并結合路由俠實現外網訪問本地部署的 Traccar 。 第一步&#xff0c;本地部署…

【開題答辯全過程】以 “川趣玩”旅行團預定微信小程序為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

Android Doze低電耗休眠模式 與 WorkManager

1. Doze模式下&#xff0c;WorkManager setInitialDelay設置小于15分鐘&#xff0c;被系統強制到15分鐘執行&#xff0c;怎么辦 ? Android 擁有兩項省電功能&#xff0c;通過管理設備未連接電源時應用的行為來延長用戶電池續航時間&#xff1a;低電耗模式 (Doze) 和應用待機模…

iOS 能耗監控與電池優化實戰:如何查看App耗電量、分析CPU、GPU內存使用、(uni-app iOS開發性能調試指南)

在 iOS 應用開發中&#xff0c;能耗與電池消耗是用戶最直觀的體驗指標。 即便功能完善&#xff0c;如果 App 存在以下問題&#xff1a; 電池掉電快、設備發熱嚴重&#xff1b;后臺任務執行過多&#xff1b;頁面渲染與文件操作引發 CPU/GPU 過載&#xff1b;日志或緩存導致頻繁 …

Git 本地分支推送多個遠程分支

方法一&#xff1a;一次性推送命令 命令格式&#xff1a; git push <遠程倉庫名> <本地分支引用>:<遠程分支名1> <本地分支引用>:<遠程分支名2> ...具體步驟&#xff1a; 確保你的代碼修改已經提交到了本地分支 git add . git commit -m "你…

抖音私信評論互動消息通知監聽自動獲取,通過qq機器人轉發到qq來通知

抖音私信評論互動消息通知監聽自動獲取&#xff0c;通過qq機器人轉發到qq來通知 如果不是抖音平臺&#xff0c;其他平臺也類似的&#xff0c;也可以實現&#xff0c;只是目前懶得寫了 本期視頻點贊過10個就開源代碼 有需要的人可以在視頻底下留言 需求反饋多的我可以實現

UVM驗證工具--gvim

目錄 gvim語法高亮 gvim支持git Linux環境自帶gvim工具&#xff0c;我們需要做如下設置&#xff1a; 支持UVM、SystemVerilog、verilog語法高亮支持git&#xff08;實時顯示對文件的修改&#xff09; gvim語法高亮 gvim支持git

MyBatis 從入門到精通(第二篇)—— 核心架構、配置解析與 Mapper 代理開發

在第一篇博客中&#xff0c;我們掌握了 MyBatis 的基礎概念與環境搭建&#xff0c;成功通過簡單查詢實現了數據持久化。但要真正用好 MyBatis&#xff0c;還需深入理解其 “內部工作原理” 與 “企業級開發規范”。本篇將聚焦三大核心&#xff1a;MyBatis 架構與核心類、全局配…