為保護未成年人的身心健康,2007 年國家推出網絡游戲防沉迷系統,對未成年人的游戲時間進行限制,游戲廠家需要及時感知用戶的下線時間并上報。Redis 是游戲數據庫重要選型之一,在基于開源 Redis 實現以上功能時,感知用戶下線行為延遲較大,導致上報時間不準確。華為云 GaussDB(for Redis)作為一款企業級游戲數據庫,具備卓越的企業級能力,能及時上報用戶下線行為,并被廣泛應用于排行榜等多種業務場景。
基于 Redis 的用戶下線上報實現
實現用戶下線上報能力的常見方式
游戲廠商使用 Redis key 過期功能,結合鍵空間通知功能(keyspace notification),可以實現用戶下線上報,常見使用方式如下:
(1)用戶登錄后,為每一個用戶 key 設置一個過期時間(3-5 分鐘);
(2)游戲客戶端,定期每分鐘上報一次心跳,收到心跳后,服務端重置游戲用戶 key 的過期時間;
(3)為避免網絡波動造成的未及時上報,若 5 分鐘內,收到心跳,則重置過期時間;若未收到,將觸發 key 過期,系統判定用戶下線。
因此,Redis 鍵空間通知功能要及時感知 key 過期,以確保上報時間的準確性。
Redis 鍵空間通知功能
Redis 鍵空間通知,允許用戶通過訂閱頻道或模式,以接收 key 的修改、過期等通知。對于每個 key 的修改,鍵空間通知都會發送兩種不同類型的事件。以 DB0 用戶 mykey 過期為例,Redis 會發送兩條消息,相當于執行了兩個 publish 命令:
PUBLISH__keyspace@0__:mykeyexpire
復制代碼
通過訂閱頻道__keyspace@0__:mykey 可以接收0號數據庫中所有修改鍵 mykey 的事件, 而訂閱頻道__keyevent@0__:expire 則可以接收0號數據庫中所有執行 expire 命令的鍵。其中以 keyspace 為前綴的頻道被稱為鍵空間通知,而以 keyevent 為前綴的頻道則被稱為鍵事件通知。
可以通過命令 CONFIG SET notify-keyspace-events [parameter]來開啟或者關閉鍵空間通知功能,若 parameter 為空則表示關閉該功能,若不空則開啟。通常將參數設置為“AKE”,表示發送所有類型通知。
通過以下命令,可以訂閱 DB0 所有過期的用戶 key。
redis-cli--csvpsubscribe'__keyevent@0__:expire'
復制代碼
GaussDB(for Redis) VS 開源 Redis
過期鍵空間通知延時對比
測試步驟:
使用 memtier_benchmark 預置 10w 個 key
使用客戶端定期 key 過期事件
使用 python 腳本,對其中的 3w 個 key 設置 10s 過期時間
分別在有業務流量和無業務流量場景,統計收到 3w 個 key 過期的通知耗時
測試結果:
可以看出,在有無業務流量場景下,GaussDB(for Redis)僅需 9 秒即可完成全部 key 過期的上報,而社區 Redis 需要 4 分鐘左右才能完成上報,嚴重影響用戶下線行為上報的準確性。
原理分析
開源 Redis 鍵空間通知功能采用了惰性刪除和定期刪除兩種策略,即在訪問時進行過期檢查,同時后臺以一定頻率執行定期檢查任務,可以通過修改配置文件 redis.conf 的 hz 選項來調整這個頻率。每次過期任務會按以下流程進行刪除操作:
1. 從設置了過期時間的 key 的集合中隨機檢查 20 個 key;
2. 刪除檢查中發現的所有過期 key;
3. 如果檢查結果中 25%以上的 key 已過期,則開始新一輪任務。
可以注意到,開源 Redis 并不是一次運行就檢查所有的庫中所有的鍵,而是隨機檢查一定數量的鍵,從而導致上報延時長。而 GaussDB(for Redis)后臺有一個實時線程會對 key 進行持續掃描,及時上報過期 key,也不會影響前臺寫操作。
GaussDB(for Redis)是一款超越開源 Redis 的企業級 KV 數據庫,在游戲場景中,除了被應用在游戲玩家下線場景,還被廣泛應用在玩家數據存儲、排行榜、好友關系、消息推送等場景。其采用存算分離的架構,既能滿足游戲業務對高并發的性能指標要求,又能降本增效,深受游戲開發者的青睞。
審核編輯 黃宇
-
開源
+關注
關注
3文章
3402瀏覽量
42712 -
Redis
+關注
關注
0文章
378瀏覽量
10942
發布評論請先 登錄
相關推薦
華為云 Flexus X 加速 Redis 案例實踐與詳解
![華為云 Flexus X 加速 <b class='flag-5'>Redis</b> 案例<b class='flag-5'>實踐</b>與詳解](https://file1.elecfans.com//web3/M00/04/7A/wKgZPGd0HF-ABq-3AAF657lKo6c323.png)
Redis緩存與Memcached的比較
ChatGPT 在游戲開發中的創新應用
基于 FPGA 的飛機大戰游戲系統設計
亞馬遜云科技助力所思科技打造爆款游戲《猛獸派對》 保障全球百萬玩家在線暢玩
![亞馬遜云科技助力所思科技打造爆款<b class='flag-5'>游戲</b>《猛獸派對》 保障全球百萬<b class='flag-5'>玩家</b>在線暢玩](https://file1.elecfans.com/web2/M00/E5/E1/wKgaomZBqkyACeqvAATvJQAy9KU462.jpg)
MediaTek與望塵科技共同推動移動光追技術普及,為游戲玩家帶來沉浸式體驗
![MediaTek與望塵科技共同推動移動光追技術普及,為<b class='flag-5'>游戲</b><b class='flag-5'>玩家</b>帶來沉浸式體驗](https://file1.elecfans.com//web2/M00/CB/E4/wKgaomYfb-6AZYo2AAFqqSsI7cc17.jpeg)
Redis開源版與Redis企業版,怎么選用?
![<b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業版,怎么選用?](https://file.elecfans.com/web2/M00/3F/D7/poYBAGJqPMKAEXjWAAAOpepuZJ8475.jpg)
賽車游戲還能這么玩?看移遠如何賦能遠程現實賽車游戲新體驗
![賽車<b class='flag-5'>游戲</b>還能這么玩?看移遠如何賦能遠程現實賽車<b class='flag-5'>游戲</b>新體驗](https://file1.elecfans.com/web2/M00/C7/BF/wKgaomYM_P6AOLVvAAMxdJ2IdV0431.jpg)
數據安全沒保障?GaussDB(for Redis) 為你保駕護航
![數據安全沒保障?<b class='flag-5'>GaussDB</b>(for <b class='flag-5'>Redis</b>) 為你保駕護航](https://file1.elecfans.com/web2/M00/C7/0C/wKgaomYFec2AROzoAAbTN1ZjfRQ540.png)
GaussDB(for Redis) 特性揭秘:多租戶管理
![<b class='flag-5'>GaussDB</b>(for <b class='flag-5'>Redis</b>) 特性揭秘:多租戶管理](https://file1.elecfans.com//web2/M00/C6/25/wKgZomYFeXKALJF9AAAQQoP7Yjw24.webp)
GaussDB(for Redis) 特性揭秘:大 key 治理
![<b class='flag-5'>GaussDB</b>(for <b class='flag-5'>Redis</b>) 特性揭秘:大 key 治理](https://file1.elecfans.com/web2/M00/C6/25/wKgZomYFeOCAed07AAI8IiCcEsM153.png)
新版 Redis 不再“開源”,對使用者都有哪些影響?
![新版 <b class='flag-5'>Redis</b> 不再“開源”,對使用者都有哪些影響?](https://file1.elecfans.com/web2/M00/C6/01/wKgZomYELTGAKZLDAAVrOCJwvPc054.png)
評論