zoukankan      html  css  js  c++  java
  • Redis在游戏服务器中的应用

    Redis在游戏服务器中的应用

    Agent`K 最近在使用Redis,忽然发现以前很多费神的事情都迎刃而解了,又应了经典:我们要做的99%的事情,别人都早已做过了!


    (扫盲:Redis是内存型、键值对型数据库,独立运行,不是第三方库)


    排行榜
    游戏服务器中涉及到很多排行信息,比如玩家等级排名、金钱排名、战斗力排名等。
    一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合。
    但是有时候我们需要每一个玩家的排名,玩家的数量太多,不能利用数据库(全表排序压力太大),自己维护也会比较麻烦。
    使用Redis可以很好的解决这个问题。它提供的有序Set,支持每个键值(比如玩家id)拥有一个分数(score),每次往这个set里添加元素,
    Redis会对其进行排序,修改某一元素的score后,也会更新排序,在获取数据时,可以指定排序范围。
    更重要的是,这个排序结果会被保存起来,不用在服务器启动时重新计算。
    通过它,排行榜的实时刷新、全服排行都不再成为麻烦事。


    消息队列(可跨服
    Redis提供的List数据类型,可以用来实现一个消息队列。
    由于它是独立于游戏服务器的,所以多个游戏服务器可以通过它来交换数据、发送事件。
    Redis还提供了发布、订阅的事件模型。
    利用这些,我们就不必自己去实现一套服务器间的通信框架,方便地实现服务器组。


    数据库缓存
    Redis提供了较为丰富数据类型,使我们可以更为容易地将数据对象缓存起来(序列化、protobuffer)。
    当需要请求某一数据时,先从Redis中查找,如果没有再查数据库,同时交给Redis缓存起来。
    当对数据进行修改时,则先将修改后的数据保存到Redis,然后保存至数据库(2)。
    第2步可以有另外的思路:
    A不实时保存到数据库,而是交由另外的线程(甚至是专门的程序)去保存,以提高逻辑层的响应速度。
    B部分数据交给Redis保存(Reids自身有持久化功能),像玩家已经完成过的任务ID集合,利用Redis的Set类型保存更为合适。
    C玩家瞬时变化的数据不见得每次修改都需要保存(比如金钱、经验),但如果游戏服务器自己维护在内存中,出现宕机就会导致回档。
    Redis是独立于游戏服务器的,交由它来保存,可以防止宕机回档的问题,也可以减少游戏服务器自己维护数据所占用的内存。

    Agent`K 转载请注明

  • 相关阅读:
    第四十七课、父子间的冲突
    第四十六课、继承中的构造与析构
    第四十五课、不同的继承方式
    第四十四课、继承中的访问级别
    第四十三课、继承的概念和意义
    第四十二课、类型转换函数(下)
    第四十一课、类型转化构造函数(上)
    暴力大法好
    HideProcess
    Hduacm—5497
  • 原文地址:https://www.cnblogs.com/agent-k/p/Redis.html
Copyright © 2011-2022 走看看