首页 新闻 会员 周边

数据实时更新的讨论

0
悬赏园豆:20 [已解决问题] 解决于 2015-08-13 09:29

这个需要有点类似实时排名的算法,具体问题作如下阐述:
当一个用户进入游戏之后需要实时记录用户的时间时长(刷新时间1-5秒),例如A用户00秒进入游戏,A用户的可用时长为10秒,哪么10秒的时候用户需要被踢出游戏房间.
程序现在有两种方式实现:
方案一:实时循环,做法就是定义一个定时器,实时去循环修改用户的时间,这种做法有一个问题,当数据量达到一定量的时候,一个循环里处理时间需要消耗CPU大量的时间(做了一个实验,数据量达到1W,CPU消耗就达到了25左右).效率非常低,这种方案肯定是不行的.
方案二:用结束时间去实现,例如A用户00秒进入游戏,可用时间为10秒,哪么给这个用户定义一个10秒定时器,在10秒后这个用户会被踢出房间,这样的做法相比方案一效率会高出很多,而且CPU消耗也不会有影响,但这种方案有一个疑问,难道1W个用户,要创建一W个定时器吗,这肯定是不行的.

如有哪位兄台有更好的方案,还请赐教!
(分数不多了,见谅!代码由C++实现)

问题补充:

其实就是实时记录用户的游戏时间,当用户的时间用完时就将此用户删除,有点类似网吧的记费系统。

独一无二~的主页 独一无二~ | 初学一级 | 园豆:4
提问于:2015-08-11 12:49
< >
分享
最佳答案
0

1.游戏玩家肯定已经登陆了,记录当前登陆时间,还有个标志(表示用户是否可以继续玩游戏)

2.开启一个监听时间(每隔几秒钟查询下数据库当前用户登陆时间和系统时间差值,并修改标志值)

3.玩家在玩游戏的时候肯定要触发事件,每执行操作查询数据库判断 "标志"是否可用,如果不能用就标志时间到了,不能继续玩游戏了

不知道性能怎样,还请多多指教,希望不要喷水哦。

收获园豆:12
唯我独萌 | 小虾三级 |园豆:537 | 2015-08-11 16:57

你的思路正是我现在实施的方案,不过数据都是保存在内存里的,没有保存到数据库,因为玩家的数据是实时变动的,只有退出时才会写数据库,所以数据处理都是在程序里实现的,其实就一个问题,就是几秒钟后检查数据的时候,这块的逻辑,检查用户是否过期必须会用到查询,我的数据结构是map,我压到2W条数据,再跑数据CPU占用就很高了。其实我是想找一种其它的解决方案,每隔几秒这种查找的方法很消耗CPU的,特别是数据量大的时候。

独一无二~ | 园豆:4 (初学一级) | 2015-08-11 17:02

@zbyhi: 放到内存里面?用户量如果很大,内存会不会够用?建议搭建一个分布式缓存服务器.存取用户的状态

唯我独萌 | 园豆:537 (小虾三级) | 2015-08-11 17:07

@背叛的冲刷: 这个是有的,有做限制,相当于一组服务器上会做一个上限人数。

独一无二~ | 园豆:4 (初学一级) | 2015-08-11 17:08

@zbyhi: 不知道cookie和sesssion这里实用不?

唯我独萌 | 园豆:537 (小虾三级) | 2015-08-11 17:10

@背叛的冲刷: HTTP里的东西,C++里好像不实用!

独一无二~ | 园豆:4 (初学一级) | 2015-08-11 17:11

@zbyhi: 那就建立一个静态全局集合吧,实际跟session原理差不多。

  public static list<sessionid,时间> list=new  list<sessionid,时间>();

唯我独萌 | 园豆:537 (小虾三级) | 2015-08-11 17:14

@背叛的冲刷: 功能已经实现了,只是想优化这块的逻辑,不过好像没有太好的办法。

独一无二~ | 园豆:4 (初学一级) | 2015-08-11 17:15

public static list<sessionid,时间> list=new  list<sessionid,时间>();

时间到了,移除sessionid

每一次执行操作根据sessionid,判断对应的list集合是否包含sessionid,然后...

唯我独萌 | 园豆:537 (小虾三级) | 2015-08-11 17:26
其他回答(1)
0

实时排名,然后又踢用户? 然后自己定时?这些太乱了,问题没搞太懂。

收获园豆:8
gw2010 | 园豆:1487 (小虾三级) | 2015-08-11 13:57

懂起你意思了,我建议综合你两种想法。为什么呢?如果只用循环验证,比如隔5秒验证一下,这样确实很耗资源。服务器也受不了。第二种,如果纯客户端其实也不安全,客户端计算器改变一下可能就不行了。反正就是不安全的意思吧。

综合是什么概验呢就是客户端也添加计时器,到计时器到你要验证的点去服务端验证,当然这中间你会加很多设计进去,这样子即不是一直循环,也要用到服务端验证,当然这里验证会有一些差,但是这种可以考虑接受,比如用户多用了10分钟那么验证不过,踢下去就行了。这10分钟可能就不追究了。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-08-11 15:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册