用redis实现的小游戏设计

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 前段时间接了一个H5游戏的后端开发任务,需求比较简单,就是在大会场里,几百、上千人分成若干组,在一段时间里同时摇手机,实时显示当前排名,最后看哪个组摇的最快,哪个人摇的最快。
前段时间接了一个H5游戏的后端开发任务,需求比较简单,就是在大会场里,几百、上千人分成若干组,在一段时间里同时摇手机,实时显示当前排名,最后看哪个组摇的最快,哪个人摇的最快。
由于是所有用户同时摇手机,而且一秒钟之内要摇5-10下,假设一千人同时摇,可能在一秒钟内会有5000至10000次的写入请求,而且在写入后还要同时计算当前各组的排名和个人里前N名的排名,如果用关系数据库,可能会由于瞬间大量插入而导致性能下降,造成游戏前端响应慢并且无法实时显示成绩排名。考虑到该游戏的实时性要求和游戏数据的低价值性(游戏结束后数据基本上就没用了),选择了redis作为后端存储。

该文章主要介绍redis的5种数据类型在本游戏中的使用,关于该游戏的架构设计,不过多说明,总体上就是前端使用websocket接入到后端,后端用netty开发,接收到前端的游戏数据后,将后续处理置入线程池,由线程池负责数据存入redis,并从redis中获取当前最新成绩排名。

在redis中,主要存储了以下内容:
1. 团队、玩家信息
2. 游戏状态、目标得分信息
3. 游戏得分、排名

1. 团队、玩家信息是典型的键值对类型,如团队名称、团队介绍;玩家名称、玩家头像,所以使用Hash类型存储,redis key的命名如:team:teamId、player:playerId。
2. 团队与玩家关系是典型的无需集合,并且一个团队中的玩家信息是不可重复的,所以使用集合(Set)类型存储,redis key的命名如:team.player:teamId
3. 游戏状态、目标得分均只有一个取值,所以用字符串类型存储,redis key的命名如:game.status,target.score
4. 游戏得分包括个人游戏得分和团队游戏得分,是典型的需要排序的数据集合,所以采用了有序集合类型(sorted set),数据被更新后会自动排序,方便支取得到游戏排名数据。redis key的命名如下player.score:playerId、team.score:teamId。

以上只是该游戏中一小部分数据存储的设计,通过这些设计,可以解决游戏中大部分数据的存储,并且可以快速得到个人与团队成绩排名,当然在实际应用中,还需要结合事务、管道等功能,提高数据的一致性和数据存取的快速处理,提高应用的处理性能。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
缓存 移动开发 NoSQL
php结合redis实现高并发下的抢购、秒杀功能的实例
php结合redis实现高并发下的抢购、秒杀功能的实例
253 0
|
NoSQL Redis
Redis学习4:List数据类型、拓展操作、实现日志等
注意点:对存储空间的顺序进行分析!
Redis学习4:List数据类型、拓展操作、实现日志等
|
存储 NoSQL Redis
Redis学习3:hash类型操作、拓展操作、实现购物等
首先可以理解成一个redis里面有一个小的redis。同时要注意引入了一个field的名字。
Redis学习3:hash类型操作、拓展操作、实现购物等
|
缓存 NoSQL 安全
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存
上一篇文章已经总结了使用ehCache来实现Shiro的缓存管理,步骤也很简单,引入依赖后,直接开启Realm的缓存管理器即可。如果使用Redis来实现缓存管理其实也是一样的,我们也是需要引入redis的依赖,然后开启缓存传入自定义的redis的缓存管理器就行。区别是我们需要为自定义的redis缓存管理器提供自定义的缓存管理类。这个缓存管理类中需要使用到redisTemplate模板,这个模板我们也是需要自己定义。
268 0
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存
|
NoSQL Java 关系型数据库
浅谈Redis实现分布式锁
浅谈Redis实现分布式锁
|
存储 NoSQL 关系型数据库
「Redis」事务实现机制
Redis事务实现机制
557 0
|
消息中间件 设计模式 NoSQL
异步结果通知实现——基于Redis实现,我这操作很可以
前段时间,我在内存中实现了一个简单异步通知框架。但由于没有持久化功能,应用重启就会导致数据丢失,且不支持分布式和集群。今天这篇笔记,引入了 Redis 来解决这些问题,以下是几点理由: 数据结构丰富,支持 List、Sorted Set 等 具有持久化功能,消息的可靠性能得到保证 高可用性,支持单机、主从、集群部署 项目中已使用,接入成本更低 基于 Redis 实现延时队列也有几种方法,展开详细讲讲。
|
NoSQL 前端开发 PHP
thinkphp+redis实现秒杀功能
thinkphp+redis实现秒杀功能
253 0
thinkphp+redis实现秒杀功能
|
存储 NoSQL 安全
分布式锁中-基于 Redis 的实现如何防重入
分布式锁中-基于 Redis 的实现如何防重入
254 0
分布式锁中-基于 Redis 的实现如何防重入
|
存储 消息中间件 缓存
分布式锁中-基于 Redis 的实现需避坑 - Jedis 篇
分布式锁中-基于 Redis 的实现需避坑 - Jedis 篇
342 0
分布式锁中-基于 Redis 的实现需避坑 - Jedis 篇