本文分享自华为云社区《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”,表示发送所有类型通知。

字符

发送的通知

K

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

E

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

g

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

$

字符串命令的通知

l

列表命令的通知

s

集合命令的通知

h

哈希命令的通知

z

有序集合命令的通知

x

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

e

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

A

参数 g$lshzxe 的别名

通过以下命令,可以订阅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过期的通知耗时

测试结果:

 

无业务流量收到全部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)游戏实践:玩家下线行为上报的更多相关文章

  1. 即时通讯系统为什么选择GaussDB(for Redis)?

    摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis). 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式.一条消息的产生是如何在群聊 ...

  2. 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数

    摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...

  3. Unity中制作游戏的快照游戏支持玩家拍快照

    Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...

  4. Redis进阶实践之十三 Redis的Redis-trib.rb文件详解

    一.简介     事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的角度来阐述一下,对第一次使用的人来说很重要.redis-trib.rb是redis官方推出的管理re ...

  5. Redis进阶实践之十六 Redis大批量增加数据

    一.介绍      有时,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键.这就是所谓的批量插入,本文档的目标是提供有关如何以尽可能快的速度向Redis提 ...

  6. Redis进阶实践之十八 使用管道模式加速Redis查询

    一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...

  7. Redis进阶实践之十三 Redis的Redis-trib.rb脚本文件使用详解

    转载来源:http://www.cnblogs.com/PatrickLiu/p/8484784.html 一.简介 事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的 ...

  8. Redis进阶实践之九 独立封装的RedisClient客户端工具类(转载9)

    Redis进阶实践之九 独立封装的RedisClient客户端工具类 一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己 ...

  9. Redis进阶实践之七Redis和Lua初步整合使用(转载 7)

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  10. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务(转载6)

    Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务 一.引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题 ...

随机推荐

  1. Opencv系列之一:简介与基本使用

    1 Opencv简介 Opencv是计算机视觉中经典的专用库,其支持多语言,跨平台,功能强大.Opencv-Python为Opencv提供了Python接口,使得使用者在Python中能够调用C/C+ ...

  2. 虹科干货| 虹科Redis企业版数据库:告别游戏卡顿,让快乐加速!

    "卡顿一分钟,玩家两行泪" 游戏已成为年轻人最主要的消遣娱乐方式之一,游戏卡顿给玩家带来糟糕游戏体验背后的原因是什么?数据存储与查询速度不够快!   游戏开发领域,不仅拥有海量的数 ...

  3. 二进制枚举&爆搜DFS

    给定一个如下图所示的全圆量角器. 初始时,量角器上的指针指向刻度 0. 现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针) ...

  4. 持续集成(CI)、自动化构建和自动化测试--初探

    转自:http://blog.csdn.net/adparking/article/details/5796532 此文章是为了总结前一段时间由于Maven2的学习而引起的一个持续集成的学习. 一.什 ...

  5. 树莓派4B使用串口登录的设置方法

    -特别提示- 本文具有时效性. 当前我使用的是pi4硬件, 镜像版本 raspberrypi 5.15.61 32位. 在我解决该问题的时候, 在网上查找了很多方法, 有些方法被实际测试发现是不行的. ...

  6. Static关键词

    在程序中使用static 变量 1. 局部变量 普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴.编译器一般不对普通局部变量进行初始化,也就是说它 ...

  7. DiscuzQ官方最新v3.0.220211源码编译搭建教程和官方部署教程,适合二开(已本地编译通过,无任何错误)

    经过长达半个月的研究! 完成这篇DiscuzQ官方最新版本v3.0.220211的源码编译和官方部署教程.适合喜欢二次开发的小伙伴们,已经通过本地编译测试,保证没有任何错误. 具体教程在我搭建的dzq ...

  8. python之if语句处理列表

    目录 检查特殊元素 确定列表不是空的 使用多个列表 检查特殊元素 在我们上期讲的python之史上最详细if教程就提到过有关于列表的关系运算符 那我们现在来创建并且打印一个列表先 list_1 = [ ...

  9. LabVIEW基于机器视觉的实验室设备管理系统(4)

    目录 行动计划 后面板连线 初始化 ​返回 ​ 注册 账号限制 查重账号或者姓名 确认密码 注册 效果演示 我们上一期制作完了给账户修改密码,那么我们这一期就来完成账户注册这一功能.老规矩哦,先来计划 ...

  10. 从零开始使用 ROS CDK 搭建云上解决方案

    作者: 金湛 前言 资源编排服务ROS(Resource Orchestration Service)是阿里云提供的一项简化云计算资源管理的服务.开发者和管理员可以编写模板,在模板中定义所需的阿里云资 ...