成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

場景題:如何實現億級用戶在線狀態統計?

開發 前端
QQ 在線狀態的統計功能就是億級的,它的特征是:數據量大、內存占用高、實時性要求高,因此我們使用常規的解決方案是不能實現的。

近兩年不知道大家有沒有發現,現在的面試中《場景題》問的越來越多了,一方面是就業市場競爭者較多所帶來的必然結果;另一方面是隨著時間的推移,公司對于應聘者的技術要求也越來越高了,這時候只會八股文就不夠了,你還得會更難的場景題才行。

所以,今天我們就來盤 Java 中的常見面試題《如何實現億級用戶在線狀態統計?》,這個時候有人就會說了:“億級?你確定你們公司有億級用戶同時在線的場景?”“我會億級系統的設計還會來你們公司應聘嗎?可笑”。

哈哈哈,確實如此,這些質疑都是合理的。但是話說回來,面試的難度本來就比實際工作的難度大很多;其次,你來應聘是想拿到高薪的 Offer,而不是和面試官干仗來的,對吧?所以,搞明白這道題的答案才是我們關注的重點。

1.億級用戶在線場景分析

例如,QQ 在線狀態的統計功能就是億級的,它的特征是:數據量大、內存占用高、實時性要求高,因此我們使用常規的解決方案是不能實現的。例如,在數據庫中給每個用戶中添加一個在線狀態,上線設為 1,下線設為 0,通過統計狀態為 1 的數據,獲取在線人數。該方案無法承受大規模用戶頻繁上、下線操作,會給數據庫帶來巨大 IO 壓力,且實時統計需不斷刷新查詢,易拖垮數據庫性能,因此不可取。

2.解決方案

此時,我們的統計實現可分為以下兩類:

  1. 基于總數的統計方案:設置一個總在線人數,上線 +1、下線 -1,從而實現上線總人數的統計。
  1. 優點:實現簡單、效率高、內存占用少。
  2. 缺點:不精準,沒辦法精確的查找某些用戶某個時刻的在線狀態;且在異常退出應用的情況下,后續基于在線監測機制的重復下線判斷很難實現。
  1. 基于具體用戶詳情的統計方案:將用戶的標識(如 QQ 號)和上線狀態都存儲在集合中。
  2. 優點:統計精準,可以查找某些用戶某個時刻的在線狀態;且在異常退出應用的情況下,后續基于在線監測機制可以精準的實現下線用戶的去重功能。
  3. 缺點:內存占用大、效率較低。

3.具體實現

3.1 基于總數的統計方案

基于總數的統計,我們可以使用以下兩種方式:

  1. 基于 Redis 的 incr(+1)和 decr(-1)操作實現,如下圖所示:

圖片圖片

  1. 基于 Redis 的 HyperLogLog 實現,HyperLogLog (下文簡稱為 HLL) 是 Redis 2.8.9 版本添加的數據結構,它用于高性能的基數 (去重) 統計功能,它的缺點就是存在極低的誤差率(0.81%)。它只需要 12KB 空間就能統計 2^64(約 18 億)的數據。

圖片圖片

此實現方案不能移除元素、存在誤差,但空間占用率非常低。

3.2 基于用戶的統計實現

基于用戶標識(QQ)我們可以采用 Redis 中提供的 Bitmap(位數組)來實現,位數組結構如下:

圖片圖片

其中每個下標就可以表示一個具體的數字,例如以上圖片標識 1、3 數字存在,如果值為 0 表示不存在,這樣的話 10 億數字占用的位數組空間位 10 億 bit,也就是 1000000000/1024/1024/1024/8=0.116 ****GB,可以看出它的空間占用量是非常小的。

用戶上線時使用 SetBit 命令將對應位置設為 1 表示在線,下線時設為 0 。判斷用戶是否在線用 GetBit 命令,統計在線用戶數用 BigCount 命令,具體操作命令如下圖所示:

圖片圖片

在 Spring Boot 項目中,我們可以使用 RedisTemplate 實現用戶的上、下線設置,以及在線個數統計,具體實現代碼如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class BitmapService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 設置Bitmap中的位
     * @param key 鍵
     * @param offset 偏移量
     * @param value 值(0或1)
     */
    public void setBit(String key, long offset, boolean value) {
        redisTemplate.opsForValue().setBit(key, offset, value);
    }

    /**
     * 獲取Bitmap中的位
     * @param key 鍵
     * @param offset 偏移量
     * @return 位的值(0或1)
     */
    public boolean getBit(String key, long offset) {
        return redisTemplate.opsForValue().getBit(key, offset);
    }

    /**
     * 計算Bitmap中值為1的位的數量
     * @param key 鍵
     * @return 值為1的位的數量
     */
    public Long bitCount(String key) {
        return redisTemplate.opsForValue().bitCount(key);
    }
}


責任編輯:武曉燕 來源: 磊哥和Java
相關推薦

2021-01-22 15:33:58

iOS微信iPhone

2009-05-06 09:19:53

Silverlight檢測微軟

2021-01-24 08:20:55

微信微信8.0.1移動應用

2021-05-24 08:58:34

Redis Bitmap 數據統計

2025-05-26 02:11:00

2021-06-08 08:51:50

Redis 數據類型數據統計

2021-04-25 08:44:23

QQ騰訊在線狀態

2020-09-01 07:49:14

JVM流量系統

2014-10-11 11:15:05

云平臺容聯云通訊

2025-01-08 07:00:00

MySQL數據庫判重

2017-10-24 10:15:05

CDN突發池系統架構

2023-12-07 07:46:21

MySQL寫入點LSN

2024-08-30 17:14:34

2020-11-10 09:05:45

用戶畫像蘇寧

2019-08-22 15:42:03

2025-06-09 08:21:55

2015-04-30 16:55:33

有道

2023-09-18 16:59:06

數據布隆過濾器

2009-06-29 15:25:21

SessionJSP

2018-11-01 13:23:02

網關APIHTTP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩视频 | 欧美日韩电影一区 | 国产成人亚洲精品 | 久久机热 | 亚洲欧美一区二区三区国产精品 | 久久久高清 | 四虎永久免费影院 | 亚洲精品一区二区三区四区高清 | 国产在线精品一区二区三区 | 国产精品国产三级国产aⅴ中文 | 九九综合 | 亚洲视频一区在线观看 | 日本激情一区二区 | 久久精品二区亚洲w码 | 宅男伊人 | 亚洲成人免费视频在线 | 国产午夜精品一区二区三区嫩草 | 日韩视频中文字幕 | 视频一区二区中文字幕 | 亚洲精品视频在线观看视频 | 国产成人av一区二区三区 | 久久亚洲视频网 | 中文字幕加勒比 | av在线播放免费 | 亚洲精品一区二区三区免 | 亚洲成av人片在线观看 | 亚洲精品99 | 亚洲精品免费在线 | 久久免费精品视频 | av中文字幕在线播放 | 青青久久| 一级做a| 日韩国产精品一区二区三区 | 91免费电影 | 99在线资源 | 综合久久久久久久 | 欧美日韩国产精品一区二区 | 中文字幕在线精品 | 中文字幕一区二区三区四区五区 | 久久久久久久久久久爱 | 欧美日韩高清一区 |