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

为保护未成年人的身心健康,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__:mykey expire
PUBLISH __keyevent@0__:expire mykey

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


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


字符

发送的通知

K

键空间通知,所有通知以&nbsp;__keyspace@<db>__&nbsp;为前缀

E

键事件通知,所有通知以&nbsp;__keyevent@<db>__&nbsp;为前缀

g

DEL&nbsp;、&nbsp;EXPIRE&nbsp;、&nbsp;RENAME&nbsp;等类型无关的通用命令的通知

$

字符串命令的通知

l

列表命令的通知

s

集合命令的通知

h

哈希命令的通知

z

有序集合命令的通知

x

过期事件:每当有过期键被删除时发送

e

驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送

A

参数&nbsp;g$lshzxe&nbsp;的别名


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

redis-cli&nbsp;--csv&nbsp;psubscribe&nbsp;'__keyevent@0__:expire'


GaussDB(for Redis) VS 开源Redis

过期键空间通知延时对比


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


测试步骤

  • 使用memtier_benchmark预置10w个key

  • 使用客户端定期key过期事件

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

  • 分别在有业务流量和无业务流量场景,统计收到3w个key过期的通知耗时


测试结果:


无业务流量收到全部key过期耗时

有业务流量收到全部key过期耗时

GaussDB(for Redis)

9秒

9秒

开源Redis

3分41秒

3分44秒


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


附录
  • 本文作者

华为云GaussDB(for Redis)团队

  • 杭州/西安/深圳简历投递

yuwenlong4@huawei.com

  • 更多产品信息,欢迎访问Redis官方博客

bbs.huaweicloud.com/blogs/248875

19934bd47b24b891dd9e4d0ebc2f0bad.jpeg


戳“阅读原文”,了解更多

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值