-
Notifications
You must be signed in to change notification settings - Fork 4
数据缓存设计(Redis)
问: 1 玩家数据,在线离线数据缓存,主要是查询 2 排行榜排序返回结果。 我试了一下把玩家的mailbox存在redis中,但是不可以,如果我把所有在线玩家的数据存在globalData数据又太多了。 我看API说createBaseAnywhereFromDBID也可以获取到玩家的mailbox,准备离线用这个,在线还是用内存之类的。 需求:我想要方便的与其他玩家交互。
答: 你可以外接一个redis, 或者你自己在KBE内存管理。 mailbox当然不能往redis丢了,他不认识。
你说的另一个问题是你设计问题。
离线查询小心数据库io密集问题。
问: 其实我想做的就是: 1 查询指定玩家信息 2 跟指定玩家通信
我有想过缓存所有玩家的数据,但是太多了肯定不行。 比如现在我要做一个好友,需要给客户端发送我所有好友的基本信息,这里有的玩家在线有的玩家离线,如果是远程通信或者从数据库查,则都需要回调回来才能获取到信息,肯定不好用。如果都从内存读,又太大了,请问你们一般这种破是怎么做的?
答:
一般不要随意利用globalData放东西,存储一些管理器类的mailbox或者全局标记类比较合适。
玩家这种你应该扔到一个管理器实体来管理, 将管理器放到globaldata中, 需要访问数据时从globaldata找到管理器,再请求获得数据, 而不是把所有玩家都扔到globaldata。
排行榜如果是有限名额的排行榜你可以放入到一个管理器管理即可。 如果是全服所有人的排行榜你内存中也只能放入一部分, 名次之外的玩家应该只能看到自己当前上下文的排行或者前100名排行和自己当前名次。
如果需要显示任何人的上下文排行榜, 你需要从缓冲中查询排行区段, 查不到再从数据库加载放到缓冲中, 总之需要很多优化办法, 数据量一起来或许你还要考虑多个管理器。 太麻烦你可以扔到redis, 让redis排行所有人的数据, redis中应该只放入纯数据而不是放入KBE的结构体, 但至少应该有一个玩家的DBID作为识别是哪个玩家。
问: 一 玩家通信||数据操作: 1 在线玩家弄一个管理器存玩家的mailbox 2 离线玩家用 createBaseAnywhereFromDBID
二 查询玩家信息 1 使用sql语句从数据库获取 2 使用你提供的方法,把在线玩家和离线玩家部分需要的数据存在redis从redis获取,因为我对redis不是很熟,如果都放在redis服务器的内存中,可能不够大,redis持久化了的话,那取数据会不会和sql取数据差不多? 谢谢回复!
答: NO。 准确说管理器中不区分在线或者离线, 他们数据都在其中。 你可以弄个结构体存, 如果在线, 那么Mailbox变量不为Null。
redis和sql的区别主要是一个数据全部在内存中, 一个只有小部分可能在内存。 查询起来一个效率不是一个量级。
你可以把排行榜部分独立出去, 让客户端通过http等方式单独请求redis服务器查询。 例如网页上也可以查询。