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

場(chǎng)景題:如何實(shí)現(xiàn)億級(jí)用戶在線狀態(tài)統(tǒng)計(jì)?

開(kāi)發(fā) 前端
QQ 在線狀態(tài)的統(tǒng)計(jì)功能就是億級(jí)的,它的特征是:數(shù)據(jù)量大、內(nèi)存占用高、實(shí)時(shí)性要求高,因此我們使用常規(guī)的解決方案是不能實(shí)現(xiàn)的。

近兩年不知道大家有沒(méi)有發(fā)現(xiàn),現(xiàn)在的面試中《場(chǎng)景題》問(wèn)的越來(lái)越多了,一方面是就業(yè)市場(chǎng)競(jìng)爭(zhēng)者較多所帶來(lái)的必然結(jié)果;另一方面是隨著時(shí)間的推移,公司對(duì)于應(yīng)聘者的技術(shù)要求也越來(lái)越高了,這時(shí)候只會(huì)八股文就不夠了,你還得會(huì)更難的場(chǎng)景題才行。

所以,今天我們就來(lái)盤(pán) Java 中的常見(jiàn)面試題《如何實(shí)現(xiàn)億級(jí)用戶在線狀態(tài)統(tǒng)計(jì)?》,這個(gè)時(shí)候有人就會(huì)說(shuō)了:“億級(jí)?你確定你們公司有億級(jí)用戶同時(shí)在線的場(chǎng)景?”“我會(huì)億級(jí)系統(tǒng)的設(shè)計(jì)還會(huì)來(lái)你們公司應(yīng)聘嗎?可笑”。

哈哈哈,確實(shí)如此,這些質(zhì)疑都是合理的。但是話說(shuō)回來(lái),面試的難度本來(lái)就比實(shí)際工作的難度大很多;其次,你來(lái)應(yīng)聘是想拿到高薪的 Offer,而不是和面試官干仗來(lái)的,對(duì)吧?所以,搞明白這道題的答案才是我們關(guān)注的重點(diǎn)。

1.億級(jí)用戶在線場(chǎng)景分析

例如,QQ 在線狀態(tài)的統(tǒng)計(jì)功能就是億級(jí)的,它的特征是:數(shù)據(jù)量大、內(nèi)存占用高、實(shí)時(shí)性要求高,因此我們使用常規(guī)的解決方案是不能實(shí)現(xiàn)的。例如,在數(shù)據(jù)庫(kù)中給每個(gè)用戶中添加一個(gè)在線狀態(tài),上線設(shè)為 1,下線設(shè)為 0,通過(guò)統(tǒng)計(jì)狀態(tài)為 1 的數(shù)據(jù),獲取在線人數(shù)。該方案無(wú)法承受大規(guī)模用戶頻繁上、下線操作,會(huì)給數(shù)據(jù)庫(kù)帶來(lái)巨大 IO 壓力,且實(shí)時(shí)統(tǒng)計(jì)需不斷刷新查詢,易拖垮數(shù)據(jù)庫(kù)性能,因此不可取。

2.解決方案

此時(shí),我們的統(tǒng)計(jì)實(shí)現(xiàn)可分為以下兩類(lèi):

  1. 基于總數(shù)的統(tǒng)計(jì)方案:設(shè)置一個(gè)總在線人數(shù),上線 +1、下線 -1,從而實(shí)現(xiàn)上線總?cè)藬?shù)的統(tǒng)計(jì)。
  1. 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單、效率高、內(nèi)存占用少。
  2. 缺點(diǎn):不精準(zhǔn),沒(méi)辦法精確的查找某些用戶某個(gè)時(shí)刻的在線狀態(tài);且在異常退出應(yīng)用的情況下,后續(xù)基于在線監(jiān)測(cè)機(jī)制的重復(fù)下線判斷很難實(shí)現(xiàn)。
  1. 基于具體用戶詳情的統(tǒng)計(jì)方案:將用戶的標(biāo)識(shí)(如 QQ 號(hào))和上線狀態(tài)都存儲(chǔ)在集合中。
  2. 優(yōu)點(diǎn):統(tǒng)計(jì)精準(zhǔn),可以查找某些用戶某個(gè)時(shí)刻的在線狀態(tài);且在異常退出應(yīng)用的情況下,后續(xù)基于在線監(jiān)測(cè)機(jī)制可以精準(zhǔn)的實(shí)現(xiàn)下線用戶的去重功能。
  3. 缺點(diǎn):內(nèi)存占用大、效率較低。

3.具體實(shí)現(xiàn)

3.1 基于總數(shù)的統(tǒng)計(jì)方案

基于總數(shù)的統(tǒng)計(jì),我們可以使用以下兩種方式:

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

圖片圖片

  1. 基于 Redis 的 HyperLogLog 實(shí)現(xiàn),HyperLogLog (下文簡(jiǎn)稱為 HLL) 是 Redis 2.8.9 版本添加的數(shù)據(jù)結(jié)構(gòu),它用于高性能的基數(shù) (去重) 統(tǒng)計(jì)功能,它的缺點(diǎn)就是存在極低的誤差率(0.81%)。它只需要 12KB 空間就能統(tǒng)計(jì) 2^64(約 18 億)的數(shù)據(jù)。

圖片圖片

此實(shí)現(xiàn)方案不能移除元素、存在誤差,但空間占用率非常低。

3.2 基于用戶的統(tǒng)計(jì)實(shí)現(xiàn)

基于用戶標(biāo)識(shí)(QQ)我們可以采用 Redis 中提供的 Bitmap(位數(shù)組)來(lái)實(shí)現(xiàn),位數(shù)組結(jié)構(gòu)如下:

圖片圖片

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

用戶上線時(shí)使用 SetBit 命令將對(duì)應(yīng)位置設(shè)為 1 表示在線,下線時(shí)設(shè)為 0 。判斷用戶是否在線用 GetBit 命令,統(tǒng)計(jì)在線用戶數(shù)用 BigCount 命令,具體操作命令如下圖所示:

圖片圖片

在 Spring Boot 項(xiàng)目中,我們可以使用 RedisTemplate 實(shí)現(xiàn)用戶的上、下線設(shè)置,以及在線個(gè)數(shù)統(tǒng)計(jì),具體實(shí)現(xiàn)代碼如下:

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;

    /**
     * 設(shè)置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);
    }

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


責(zé)任編輯:武曉燕 來(lái)源: 磊哥和Java
相關(guān)推薦

2021-01-22 15:33:58

iOS微信iPhone

2009-05-06 09:19:53

Silverlight檢測(cè)微軟

2021-01-24 08:20:55

微信微信8.0.1移動(dòng)應(yīng)用

2021-05-24 08:58:34

Redis Bitmap 數(shù)據(jù)統(tǒng)計(jì)

2025-05-26 02:11:00

2021-06-08 08:51:50

Redis 數(shù)據(jù)類(lèi)型數(shù)據(jù)統(tǒng)計(jì)

2021-04-25 08:44:23

QQ騰訊在線狀態(tài)

2020-09-01 07:49:14

JVM流量系統(tǒng)

2025-01-08 07:00:00

MySQL數(shù)據(jù)庫(kù)判重

2014-10-11 11:15:05

云平臺(tái)容聯(lián)云通訊

2017-10-24 10:15:05

CDN突發(fā)池系統(tǒng)架構(gòu)

2023-12-07 07:46:21

MySQL寫(xiě)入點(diǎn)LSN

2024-08-30 17:14:34

2020-11-10 09:05:45

用戶畫(huà)像蘇寧

2019-08-22 15:42:03

2025-06-09 08:21:55

2023-09-18 16:59:06

數(shù)據(jù)布隆過(guò)濾器

2015-04-30 16:55:33

有道

2009-06-29 15:25:21

SessionJSP

2018-11-01 13:23:02

網(wǎng)關(guān)APIHTTP
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩在线观看 | 亚洲一区国产精品 | 久久久久久久综合色一本 | 国产人免费人成免费视频 | 久久综合久久综合久久综合 | 成人综合在线视频 | 成人免费视频在线观看 | 欧美精品在线播放 | 日韩成人在线观看 | 国产精品欧美一区二区三区 | 国产精品视频一区二区三 | 亚洲精品日韩精品 | 亚洲欧美日韩激情 | 天天天天操 | 高清久久久 | 免费视频中文字幕 | 久草资源| 99亚洲精品 | 免费看色 | 国产一区亚洲 | 精品一区二区在线观看 | 黄色一级免费观看 | 成人不卡 | 亚洲视频区| 久久精品国产久精国产 | 欧美一区二区三区四区五区无卡码 | 国产在线激情视频 | 麻豆亚洲 | 91最新视频 | 精品久久久久久亚洲精品 | 中文字幕一区二区三区日韩精品 | av在线天堂 | 国产 日韩 欧美 中文 在线播放 | 国产美女久久久 | 亚洲精品一区二三区不卡 | 网站黄色av | 亚洲永久入口 | 91精品久久久久久久99 | 在线免费观看视频黄 | 日韩在线观看一区二区三区 | 日韩视频一区在线观看 |