写点什么

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

  • 2023-09-18
    广东
  • 本文字数:1536 字

    阅读完需:约 5 分钟

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


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 过期时间


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


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

发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
GaussDB(for Redis)游戏实践:玩家下线行为上报_数据库_华为云开发者联盟_InfoQ写作社区