GaussDB(for Redis)游戏实践:玩家下线行为上报

本文分享自华为云社区《GaussDB(for Redis) 游戏实践:玩家下线行为上报》,作者:GaussDB 数据库

为保护未成年人的身心健康,2007年国家推出网络游戏防沉迷系统,对未成年人的游戏时间进行限制。游戏厂家需要及时感知用户的下线时间并上报。Redis是游戏数据库重要选型之一,在基于开源Redis实现以上功能时,感知用户下线行为延迟大,导致上报时间不准确。华为云GaussDB(for Redis)作为一款企业级游戏数据库,具备卓越的企业级能力,能及时上报用户下线行为,并被广泛应用于排行榜等多种业务场景。

一、基于Redis的用户下线上报实现

实现用户下线上报能力的常见方式

使用Redis key过期功能,结合键空间通知功能可以实现用户下线上报,常见使用方式如下:

1)用户登录后,为每一个用户key设置一个过期时间(3-5分钟)

2)游戏客户端,定期每分钟上报一次心跳。收到心跳后,服务端重置游戏用户key的过期时间

3)为避免网络波动造成的未及时上报,若5分钟内,收到心跳,则重置过期时间;若未收到,将触发key过期,系统判定用户下线。

因此,Redis键空间通知功能要及时感知key过期,以确保上报时间的准确性。

Redis****键空间通知功能

Redis键空间通知(keyspace notification),允许用户通过订阅频道或模式, 以接收key的修改、过期等通知。对于每个key的修改,键空间通知都会发送两种不同类型的事件。以DB0用户mykey过期为例,Redis会发送两条消息,相当于执行了两个publish命令:

  • PUBLISH keyspace@0:mykey expire
  • PUBLISH keyevent@0:expire mykey

通过订阅频道 keyspace@0:mykey 可以接收 0 号数据库中所有修改键 mykey 的事件, 而订阅频道 keyevent@0:expire 则可以接收 0 号数据库中所有执行 expire 命令的键。其中以 keyspace 为前缀的频道被称为键空间通知,而以 keyevent 为前缀的频道则被称为键事件通知。

可以通过命令CONFIGSET notify-keyspace-events parameter来开启或者关闭键空间通知功能,若parameter为空则表示关闭该功能,若不空则开启。通常将参数设置为"AKE",表示发送所有类型通知。

通过以下命令,可以订阅DB0所有过期的用户key

css 复制代码
redis-cli --csv psubscribe '__keyevent@0__:expire'

二、GaussDB(for Redis)与开源Redis key过期键空间通知延时对比

Redis****规格:都采用4GB的规格

测试步骤:

1)使用memtier_benchmark预置10w个key

2)使用客户端定期key过期事件

3)使用python脚本,对其中的3w个key设置10s过期时间

  1. 分别在有业务流量和无业务流量场景,统计收到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数据库,在游戏场景中,除了被应用在游戏玩家下线场景,还被广泛应用在玩家数据存储、排行榜、好友关系、消息推送等场景。采用存算分离的架构,既能满足游戏业务对高并发的性能指标要求,又能降本增效,深受游戏开发者的青睐。

点击关注,第一时间了解华为云新鲜技术~

相关推荐
高频因子挖掘机18 分钟前
多股票 K 线如何用 Pandas 对齐?从收益率计算到横截面分析
后端·github·api
KIDULT°8 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
我不是程序员三三9 小时前
透明加密软件偶发解密异常排错实录:文件时能打开时乱码
数据库·域智盾
snhna9 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
架构技术专栏9 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
天行健,君子而铎9 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
码事漫谈9 小时前
你让AI干的活,它可能只干了十分之一——而你根本看不出来
后端
牛战士coding10 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
Wx-bishekaifayuan10 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
人工智能·spring boot·后端·python·课程设计·express·旅游
Wx-bishekaifayuan10 小时前
springboot汉中旅游服务平台41442-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游