為保護(hù)未成年人的身心健康,2007 年國家推出網(wǎng)絡(luò)游戲防沉迷系統(tǒng),對(duì)未成年人的游戲時(shí)間進(jìn)行限制,游戲廠家需要及時(shí)感知用戶的下線時(shí)間并上報(bào)。Redis 是游戲數(shù)據(jù)庫重要選型之一,在基于開源 Redis 實(shí)現(xiàn)以上功能時(shí),感知用戶下線行為延遲較大,導(dǎo)致上報(bào)時(shí)間不準(zhǔn)確。華為云 GaussDB(for Redis)作為一款企業(yè)級(jí)游戲數(shù)據(jù)庫,具備卓越的企業(yè)級(jí)能力,能及時(shí)上報(bào)用戶下線行為,并被廣泛應(yīng)用于排行榜等多種業(yè)務(wù)場(chǎng)景。
基于 Redis 的用戶下線上報(bào)實(shí)現(xiàn)
實(shí)現(xiàn)用戶下線上報(bào)能力的常見方式
游戲廠商使用 Redis key 過期功能,結(jié)合鍵空間通知功能(keyspace notification),可以實(shí)現(xiàn)用戶下線上報(bào),常見使用方式如下:
(1)用戶登錄后,為每一個(gè)用戶 key 設(shè)置一個(gè)過期時(shí)間(3-5 分鐘);
(2)游戲客戶端,定期每分鐘上報(bào)一次心跳,收到心跳后,服務(wù)端重置游戲用戶 key 的過期時(shí)間;
(3)為避免網(wǎng)絡(luò)波動(dòng)造成的未及時(shí)上報(bào),若 5 分鐘內(nèi),收到心跳,則重置過期時(shí)間;若未收到,將觸發(fā) key 過期,系統(tǒng)判定用戶下線。
因此,Redis 鍵空間通知功能要及時(shí)感知 key 過期,以確保上報(bào)時(shí)間的準(zhǔn)確性。
Redis 鍵空間通知功能
Redis 鍵空間通知,允許用戶通過訂閱頻道或模式,以接收 key 的修改、過期等通知。對(duì)于每個(gè) key 的修改,鍵空間通知都會(huì)發(fā)送兩種不同類型的事件。以 DB0 用戶 mykey 過期為例,Redis 會(huì)發(fā)送兩條消息,相當(dāng)于執(zhí)行了兩個(gè) publish 命令:
PUBLISH__keyspace@0__:mykeyexpire
復(fù)制代碼
通過訂閱頻道__keyspace@0__:mykey 可以接收0號(hào)數(shù)據(jù)庫中所有修改鍵 mykey 的事件, 而訂閱頻道__keyevent@0__:expire 則可以接收0號(hào)數(shù)據(jù)庫中所有執(zhí)行 expire 命令的鍵。其中以 keyspace 為前綴的頻道被稱為鍵空間通知,而以 keyevent 為前綴的頻道則被稱為鍵事件通知。
可以通過命令 CONFIG SET notify-keyspace-events [parameter]來開啟或者關(guān)閉鍵空間通知功能,若 parameter 為空則表示關(guān)閉該功能,若不空則開啟。通常將參數(shù)設(shè)置為“AKE”,表示發(fā)送所有類型通知。
通過以下命令,可以訂閱 DB0 所有過期的用戶 key。
redis-cli--csvpsubscribe'__keyevent@0__:expire'
復(fù)制代碼
GaussDB(for Redis) VS 開源 Redis
過期鍵空間通知延時(shí)對(duì)比
Redis 規(guī)格:都采用 4GB 的規(guī)格
測(cè)試步驟:
使用 memtier_benchmark 預(yù)置 10w 個(gè) key
使用客戶端定期 key 過期事件
使用 python 腳本,對(duì)其中的 3w 個(gè) key 設(shè)置 10s 過期時(shí)間
分別在有業(yè)務(wù)流量和無業(yè)務(wù)流量場(chǎng)景,統(tǒng)計(jì)收到 3w 個(gè) key 過期的通知耗時(shí)
測(cè)試結(jié)果:
可以看出,在有無業(yè)務(wù)流量場(chǎng)景下,GaussDB(for Redis)僅需 9 秒即可完成全部 key 過期的上報(bào),而社區(qū) Redis 需要 4 分鐘左右才能完成上報(bào),嚴(yán)重影響用戶下線行為上報(bào)的準(zhǔn)確性。
原理分析
開源 Redis 鍵空間通知功能采用了惰性刪除和定期刪除兩種策略,即在訪問時(shí)進(jìn)行過期檢查,同時(shí)后臺(tái)以一定頻率執(zhí)行定期檢查任務(wù),可以通過修改配置文件 redis.conf 的 hz 選項(xiàng)來調(diào)整這個(gè)頻率。每次過期任務(wù)會(huì)按以下流程進(jìn)行刪除操作:
1. 從設(shè)置了過期時(shí)間的 key 的集合中隨機(jī)檢查 20 個(gè) key;
2. 刪除檢查中發(fā)現(xiàn)的所有過期 key;
3. 如果檢查結(jié)果中 25%以上的 key 已過期,則開始新一輪任務(wù)。
可以注意到,開源 Redis 并不是一次運(yùn)行就檢查所有的庫中所有的鍵,而是隨機(jī)檢查一定數(shù)量的鍵,從而導(dǎo)致上報(bào)延時(shí)長。而 GaussDB(for Redis)后臺(tái)有一個(gè)實(shí)時(shí)線程會(huì)對(duì) key 進(jìn)行持續(xù)掃描,及時(shí)上報(bào)過期 key,也不會(huì)影響前臺(tái)寫操作。
GaussDB(for Redis)是一款超越開源 Redis 的企業(yè)級(jí) KV 數(shù)據(jù)庫,在游戲場(chǎng)景中,除了被應(yīng)用在游戲玩家下線場(chǎng)景,還被廣泛應(yīng)用在玩家數(shù)據(jù)存儲(chǔ)、排行榜、好友關(guān)系、消息推送等場(chǎng)景。其采用存算分離的架構(gòu),既能滿足游戲業(yè)務(wù)對(duì)高并發(fā)的性能指標(biāo)要求,又能降本增效,深受游戲開發(fā)者的青睞。
審核編輯 黃宇
-
開源
+關(guān)注
關(guān)注
3文章
3673瀏覽量
43787 -
Redis
+關(guān)注
關(guān)注
0文章
386瀏覽量
11424
發(fā)布評(píng)論請(qǐng)先 登錄
Redis集群部署與性能優(yōu)化實(shí)戰(zhàn)
【經(jīng)驗(yàn)分享】在Omni3576上編譯Redis-8.0.2源碼,并安裝及性能測(cè)試

【幸狐Omni3576邊緣計(jì)算套件試用體驗(yàn)】Redis最新8.0.2版本源碼安裝及性能測(cè)試
游戲手柄振動(dòng)馬達(dá):沉浸式游戲體驗(yàn)的核心
Redis 再次開源!
Redis實(shí)戰(zhàn)筆記

華為云 Flexus X 加速 Redis 案例實(shí)踐與詳解

Redis Cluster之故障轉(zhuǎn)移

華為云Flexus X實(shí)例,Redis性能加速評(píng)測(cè)及對(duì)比

Redis緩存與Memcached的比較
ChatGPT 在游戲開發(fā)中的創(chuàng)新應(yīng)用
游戲手柄震動(dòng)馬達(dá)的技術(shù)特點(diǎn)分析

評(píng)論