消息~組件(群聊類型)ConcurrentHashMap發送

為什么選擇ConcurrentHashMap?
在開發聊天應用時,我們需要存儲和管理大量的聊天消息數據,這些數據會被多個線程頻繁訪問和修改。比如,當多個用戶同時發送消息時,服務端需要同時處理這些消息的存儲和查詢。如果用普通的HashMap,可能會出現線程安全問題,比如數據被覆蓋或者讀取到錯誤的數據。
而ConcurrentHashMap是一個專門為多線程環境設計的數據結構,它的主要優點如下:

  1. 線程安全
    ConcurrentHashMap內部通過鎖分段機制(或者在Java 8及以上版本中使用CAS操作和synchronized鎖)來保證線程安全。這意味著多個線程可以同時讀寫它,而不會出現數據錯亂的問題。
  2. 高性能
    相比普通的HashMap,ConcurrentHashMap在多線程環境下性能更高。它允許多個線程同時讀取和更新數據,而不會像Collections.synchronizedMap那樣鎖住整個表。
  3. 支持高并發
    聊天應用通常需要處理大量的并發請求,比如同時接收和發送消息。ConcurrentHashMap能夠很好地支持這種高并發場景,確保數據的讀寫操作不會成為性能瓶頸。
  4. 易于使用
    它的使用方式和普通的HashMap非常相似,幾乎不需要額外的學習成本。只需要把HashMap替換為ConcurrentHashMap,就可以在多線程環境中安全地使用。
    舉個例子
    假設我們有一個聊天應用,用戶A和用戶B同時向用戶C發送消息。如果沒有線程安全機制,可能會出現以下問題:
    ● 用戶A的消息覆蓋了用戶B的消息。
    ● 用戶C看到的消息順序混亂。
    而ConcurrentHashMap可以很好地解決這些問題。它會確保每個消息都被正確存儲,并且在多個線程同時操作時不會出現沖突。

總結
選擇ConcurrentHashMap是因為它既安全又高效,特別適合聊天應用這種需要處理大量并發數據的場景。它能幫我們省去很多線程安全的麻煩,讓代碼更簡潔,運行也更穩定。
希望這個解釋清楚了為什么選擇ConcurrentHashMap!
聊天應用中的私聊和群聊數據查詢優化
在開發聊天應用時,如何查詢和展示私聊和群聊的會話列表是一個關鍵問題。我們需要從服務端向客戶端傳遞兩種類型的數據:私聊消息和群聊消息。為了實現這一點,我們使用了ConcurrentHashMap來存儲這些數據,確保線程安全和高效的并發訪問。

聊天應用中的私聊和群聊數據查詢優化

在開發聊天應用時,如何查詢和展示私聊和群聊的會話列表是一個關鍵問題。我們需要從服務端向客戶端傳遞兩種類型的數據:私聊消息和群聊消息。為了實現這一點,我們使用了ConcurrentHashMap來存儲這些數據,確保線程安全和高效的并發訪問。

以下是服務端代碼的結構:

ConcurrentHashMap<Long, List<ChatMessage>> messageMap = new ConcurrentHashMap<>();
ConcurrentHashMap<Long, List<GroupMessage>> groupMessageMap = new ConcurrentHashMap<>();

私聊會話查詢

私聊會話的查詢需要獲取以下信息:

  1. 用戶頭像、用戶名和會話是否置頂。
  2. 最后一條消息、最后活動時間和未讀消息數量。

查詢私聊用戶信息

SELECT m.user_id, m.isPinned, u.username, u.image 
FROM friend m 
JOIN user u ON m.user_id = u.id 
WHERE m.friend_id = ?
  • friend:存儲用戶之間的關系,user_id表示好友的ID,friend_id表示當前用戶的ID,isPinned表示是否置頂。
  • user:存儲用戶的基本信息,username是用戶名,image是用戶頭像。

查詢私聊消息信息

SELECT CASE WHEN sender_id = ? THEN receiver_id ELSE sender_id END as chat_id, MAX(time) as last_time,(SELECT content FROM messages m WHERE (m.sender_id = ? OR m.receiver_id = ?) AND (CASE WHEN m.sender_id = ? THEN m.receiver_id ELSE m.sender_id END) = chat_idAND m.room_id IS NULLORDER BY m.time DESC LIMIT 1) as last_message,SUM(CASE WHEN receiver_id = ? AND status = 0 THEN 1 ELSE 0 END) as unread_count
FROM messages 
WHERE (sender_id = ? OR receiver_id = ?) AND room_id IS NULL 
GROUP BY chat_id
ORDER BY last_time DESC;
  • messages:存儲消息內容,sender_idreceiver_id分別表示發送者和接收者的ID,time表示消息發送時間,status表示消息的讀取狀態(0表示未讀,1表示已讀)。
  • 邏輯解釋
    • CASE WHEN sender_id = ? THEN receiver_id ELSE sender_id END as chat_id:根據當前用戶ID,確定對方的用戶ID。
    • MAX(time):獲取最后一條消息的時間。
    • 子查詢獲取最后一條消息的內容。
    • SUM(CASE WHEN receiver_id = ? AND status = 0 THEN 1 ELSE 0 END):統計未讀消息的數量。

群聊會話查詢

群聊會話的查詢需要獲取以下信息:

  1. 群組名稱、群組頭像、是否置頂。
  2. 最后一條消息、最后活動時間和未讀消息數量。

查詢群聊信息

SELECT g.id AS group_id,g.name AS group_name,g.image AS group_avatar,MAX(ug.timeship) AS last_active_time,(SELECT ug2.message FROM user_group ug2 WHERE ug2.group_id = g.id ORDER BY ug2.timeship DESC LIMIT 1) AS last_message,SUM(CASE WHEN ug.status = 1 AND ug.user_id != ? THEN 1 ELSE 0 END) AS unread_count,MAX(ug.isPinned) AS is_pinned
FROM groupsql g
JOIN user_group ug ON g.id = ug.group_id
WHERE ug.user_id = ? OR EXISTS (SELECT 1 FROM user_group WHERE group_id = g.id AND user_id = ?)
GROUP BY g.id, g.name, g.image
ORDER BY is_pinned DESC, last_active_time DESC;
  • groupsql:存儲群組的基本信息,id是群組ID,name是群組名稱,image是群組頭像。
  • user_group:存儲用戶與群組的關系,group_id是群組ID,user_id是用戶ID,timeship是用戶加入群組的時間,message是群組消息,status表示消息的讀取狀態(1表示未讀)。
  • 邏輯解釋
    • MAX(ug.timeship):獲取群組的最后活動時間。
    • 子查詢獲取最后一條消息的內容。
    • SUM(CASE WHEN ug.status = 1 AND ug.user_id != ? THEN 1 ELSE 0 END):統計未讀消息的數量。
    • MAX(ug.isPinned):判斷群組是否置頂。
    • ORDER BY is_pinned DESC, last_active_time DESC:按置頂優先級和最后活動時間排序。

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

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

相關文章

Stapi知識框架

一、Stapi 基礎認知 1. 框架定位 自動化API開發框架&#xff1a;專注于快速生成RESTful API 約定優于配置&#xff1a;通過標準化約定減少樣板代碼 企業級應用支持&#xff1a;適合構建中大型API服務 代碼生成導向&#xff1a;顯著提升開發效率 2. 核心特性 自動CRUD端點…

基于深度學習的水果識別系統設計

一、選擇YOLOv5s模型 YOLOv5&#xff1a;YOLOv5 是一個輕量級的目標檢測模型&#xff0c;它在 YOLOv4 的基礎上進行了進一步優化&#xff0c;使其在保持較高檢測精度的同時&#xff0c;具有更快的推理速度。YOLOv5 的網絡結構更加靈活&#xff0c;可以根據不同的需求選擇不同大…

Spring Security與SaToken的對比

Spring Security與SaToken的詳細對照與優缺點分析 1. 核心功能與設計理念 對比維度Spring SecuritySaToken核心定位企業級安全框架&#xff0c;深度集成Spring生態&#xff0c;提供全面的安全解決方案&#xff08;認證、授權、攻擊防護等&#xff09;輕量級權限認證框架&#…

【docker】--鏡像管理

文章目錄 拉取鏡像啟動鏡像為容器連接容器法一法二 保存鏡像加載鏡像鏡像打標簽移除鏡像 拉取鏡像 docker pull mysql:8.0.42啟動鏡像為容器 docker run -dp 8080:8080 --name container_mysql8.0.42 -e MYSQL_ROOT_PASSWORD123123123 mysql:8.0.42 連接容器 法一 docker e…

力扣HOT100之二叉樹:543. 二叉樹的直徑

這道題本來想到可以用遞歸做&#xff0c;但是還是沒想明白&#xff0c;最后還是去看靈神題解了&#xff0c;感覺這道題最大的收獲就是鞏固了我對lambda表達式的掌握。 按照靈神的思路&#xff0c;直徑可以理解為從一個葉子出發向上&#xff0c;在某個節點處拐彎&#xff0c;然后…

web 自動化之 yaml 數據/日志/截圖

文章目錄 一、yaml 數據獲取二、日志獲取三、截圖 一、yaml 數據獲取 需要安裝 PyYAML 庫 import yaml import os from TestPOM.common import dir_config as Dirdef read_yaml(key,file_name"test_datas.yaml"):file_path os.path.join(Dir.testcases_dir, file_…

rtty操作記錄說明

rtty操作記錄說明 前言 整理資料發現了幾年前做的操作記錄&#xff0c;分享出來&#xff0c;希望對大家有用。 rtty-master&#xff1a;rtty客戶端程序&#xff0c;其中buffer\log\ssl為源碼的子目錄&#xff0c;從git上下載https://github.com/zhaojh329&#xff0c; rtty…

mybatis中${}和#{}的區別

先測試&#xff0c;再說結論 userService.selectStudentByClssIds(10000, "wzh or 11");List<StudentEntity> selectStudentByClssIds(Param("stuId") int stuId, Param("field") String field);<select id"selectStudentByClssI…

【運維】MacOS藍牙故障排查與修復指南

在日常使用macOS系統過程中&#xff0c;藍牙連接問題時有發生。無論是無法連接設備、連接不穩定還是藍牙功能完全失效&#xff0c;這些問題都會嚴重影響我們的工作效率。本文將分享一些實用的排查方法和修復技巧&#xff0c;幫助你解決macOS系統上的藍牙故障。 問題癥狀 常見…

數據結構(一) 緒論

一. 時間復雜度: (1)定義: 時間復雜度是衡量算法執行時間隨輸入規模(通常用n表示)增長的變化趨勢的指標,時間復雜度用O符號表示 用于描述算法在最壞情況下或平均情況下的時間需求 時間復雜度關注的是操作次數的增長率&#xff0c;而非具體執行時間 常見的時間復雜度由小到大依次…

網絡協議與系統架構分析實戰:工具與方法全解

網絡協議與系統架構分析實戰&#xff1a;工具與方法全解 在互聯網系統的開發、運維與安全分析中&#xff0c;協議解析與抓包分析是不可或缺的核心技能。本文將系統梳理主流協議解析工具、協議自動識別方案&#xff0c;并結合實際抓包案例&#xff0c;講解如何還原和推測底層系…

發那科機器人4(編程實例)

發那科機器人4(編程實例) 一、編程實例1、直線運動實例2、圓弧運動實例3、曲線運動實例4、物料搬運實例5、異步輸送帶檢測一、編程實例 1、直線運動實例 本節內容:直線運動實例 本次實例,采用的是基礎模塊,以基礎模塊當中的四邊形為例,演示一下機器人的直線運動。 編程…

agent初識

AI Agent 時代已來&#xff1a;不止于聊天的智能體&#xff0c;將如何重塑我們的世界&#xff1f; AI Agent 時代已來&#xff1a;不止于聊天的智能體&#xff0c;將如何重塑我們的世界&#xff1f; 你是否曾驚嘆于 ChatGPT 的對答如流&#xff1f;或者 Midjourney 的妙筆生花…

.Net HttpClient 使用Json數據

HttpClient 使用Json數據 現代Web項目中&#xff0c;Json是最常用的數據格式。不論是前后端的交互中&#xff0c;還是純前端項目中&#xff0c;都是如此。因此&#xff0c;.Net HttpClient 能不能更加方便、快捷的處理Json格式數據&#xff0c;也就至關重要了&#xff01; 文末…

UDP--DDR--SFP,FPGA實現之指令監測模塊實現

指令監測模塊實現介紹 如下圖所示&#xff0c;為指令監測模塊的運行框圖 將指令設置為8bytes數據&#xff0c;故需要一個64位寄存器進行緩存&#xff0c;在進行數據緩存時&#xff0c;數據不可以輸出至下一級模塊&#xff0c;故對數據和有效指示信號也應該進行相應延遲&#…

JavaScript雙問號操作符(??)詳解,解決使用 || 時因類型轉換帶來的問題

目錄 JavaScript雙問號操作符&#xff08;??&#xff09;詳解&#xff0c;解決使用||時因類型轉換帶來的問題 一、雙問號操作符??的基礎用法 1、傳統方式的痛點 2、雙問號操作符??的精確判斷 3、雙問號操作符??與邏輯或操作符||的對比 二、復雜場景下的空值處理 …

智能體的典型應用:自動駕駛、智能客服、智能制造、游戲AI與數字人技術

本文為《React Agent&#xff1a;從零開始構建 AI 智能體》專欄系列文章。 專欄地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。項目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代碼示?例與實戰源&#xff09;。完整介紹…

Ubuntu 22.04(WSL2)使用Docker安裝Redis

Ubuntu 22.04&#xff08;WSL2&#xff09;使用Docker安裝Redis 本教程將指導您在運行于WSL2的Ubuntu 22.04上通過Docker安裝Redis 7.4.3。您將獲得一個配置了自定義設置、持久化存儲和安全選項的Redis實例。 前提條件 WSL2上已安裝Ubuntu 22.04。WSL2上已安裝并運行Docker&…

淺談 Redis 數據類型

淺談 Redis 數據類型 &#xff08;一&#xff09;String 類型 Redis 的 String 類型 是二進制安全的&#xff0c;可以用來存儲 文本字符串、int 類型數據和 bitmap 位圖 等數據。 1. 字符串操作 適用于存儲 文本、JSON、序列化數據 等任意二進制安全的內容 命令作用示例SET設…

Day1 時間復雜度

一 概念 在 C 中&#xff0c;時間復雜度是衡量算法運行時間隨輸入規模增長的趨勢的關鍵指標&#xff0c;用于評估算法的效率。它通過 大 O 表示法&#xff08;Big O Notation&#xff09; 描述&#xff0c;關注的是輸入規模 n 趨近于無窮大時&#xff0c;算法時間增長的主導因…