玩家数据全部保存在redis,对合服来绝对是个坑。因为一直都是做开发,合库这事还是第一次操作。

首先,合服要做哪些事情,当然不同的游戏肯定不一样。合服的目的是为了增加同个服务器上活跃玩家的数量。合服有另外一种叫法数据互通,按这种理解就是要合并的那几个服务器,玩家可以进行交互,主要指排行榜数据和一下全服玩法。数据互通很明显前端的入口是不变的。有一个问题就是要合并的服务器,同个玩家不同角色的数据是否要删除。这次合并是按照不删除的做法进行的。这个根据不同的游戏采取不同的策略。

其次,数据合并。这次比较幸运的一点是,之前的技术对玩家id的处理上是唯一的,包括不同服务器的玩家id也是不一样的。现在进入主题redis的合并。

redis是有持久化功能的内存数据库。它有两种持久化方式:1.rdb快照;2.aof扩展。第一步就去搜索如何合并两个rdb,有看到一个文章说只要二进制打开rdb文件,去掉一个rdb的尾,另一个的头,然后合并它们的内容。反正按照这个方法我没有成功。后面就放弃了rdb转而寻找合并aof的方法。

aof是以协议文本的方式,将所有对数据库进行过写入的命令及参数记录到aof文件,aof文件是一个文本文件,要合并两个aof文件是很方便的事情。cat a.aof >> b.aof就搞定。这里会有个问题因为是把a的aof文件追加到b中,如果a和

b有一样的key时,a的值会覆盖b的值。这一部分要根据需求特殊处理下,要么在合并前要保证没有一样的key。否则,就会造成数据丢失。

现在的问题是我们如何得到一个完整的aof文件,redis提供了一个命令:BGREWRITEAOF,执行之后会生成一个完整的aof文件。

最后一步就是要让redis实例读取合并后的aof文件。

新建一个redis实例,修改redis配置文件

appendonly yes  //开启aof选择

appendfilename appendonly.aof //合并后的aof文件

redis合库的更多相关文章

  1. 基于async/non-blocking高性能redis组件库BeetleX.Redis

    BeetleX.Redis是基于async/non-blocking模式实现的高性能redis组件库,组件支持redis基础指令集,并封装更简便的List,Hashset和Subscribe操作.除了 ...

  2. 原!!win7-64 安装python的 redis客户端库

    安装python的redis客户端库 本人系统已装python2.7 利用cmd命令行: 1.cmd-->python -->>>进入python命令下 >>> ...

  3. ArcGIS超级工具SPTOOLS-按属性裁剪,矢量数据批量裁剪,矢量数据批量合库

    1.1  按属性裁剪 操作视频: https://weibo.com/tv/v/HwaZRoosq?fid=1034:4376687438183117 按属性裁剪:可以图形表,也可以是非图形表,字段值 ...

  4. golang操作redis/go-redis库

    目录 Redis介绍 Redis支持的数据结构 Redis应用场景 准备Redis环境 go-redis库 安装 连接 普通连接 V8新版本相关 连接Redis哨兵模式 连接Redis集群 基本使用 ...

  5. Redis网络库源码分析(1)之介绍篇

    一.前言 Redis网络库是一个单线程EPOLL模型的网络库,和Memcached使用的libevent相比,它没有那么庞大,代码一共2000多行,因此比较容易分析.其实网上已经有非常多有关这个网络库 ...

  6. php版的redis操作库predis操作大全

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/146.html predis是php连接redis的操作库,由于它完全使用 ...

  7. Redis事件库源码分析

    由于老大在新项目中使用redis的事件库代替了libevent,我也趁着机会读了一遍redis的事件库代码,第一次读到“优美,让人愉快”的代码,加之用xmind制作的类图非常帅,所以留文纪念. Red ...

  8. SpringBoot如何切换Redis默认库

    一些闲扯的话 我们清楚,Redis 尽管提供了 16 个索引库,但是每个数据库之间是隔离互不共享的,客户端默认连接使用的是 0 号数据库 . 注意:上方情况是基于单机 Redis 的,在集群模式下是没 ...

  9. CentOS 6.8下安装python的redis支持库

    方法很简单,SSH登录下输入: pip install redis 或者 easy_install redis 如果上面的方法不行的话,就要尝试编译安装了 wget https://pypi.pyth ...

随机推荐

  1. jdbc - Insert 'Date' value in PreparedStatement

    “preparedStatement.setDate()”方法接受的是 'java.sql.Date' 类型的参数,而我们一般格式化日期所使用的是'java.util.Date'中的'SimpleDa ...

  2. Hash - a javascript dictionary object.

    Hash,in wikipedia, may relevant to many stuffs. In javascript, hash is a group of name/value pairs w ...

  3. TOM大师脚本01-查找未建索引的外键

    [oracle@Oracle11g 2016]$ cat 022201.sql column columns format a30 word_wrappedcolumn tablename forma ...

  4. kill session真的能杀掉进程吗

    session1 确认sidSYS @ prod > select userenv('sid') from dual; USERENV('SID')-------------- 144 sess ...

  5. 那些常用的eclipse快捷键

    用了很久的eclipse了,有些快捷键常用,有的偶尔使用,现在记下常用的快捷键,以便大家和自己查用(持续更新) 这些快捷键都可以在[window]-[preferences]-[general]-[k ...

  6. PSD 转化成 HTML

    一般情况下,网页设计制作完成的工作实际是:psd 效果图 转成 html+CSS 的模板页面,一般情况下,我们会拿到美工的 psd,不同的人会有不同的做法: 打开fireworks将图片切割导出为ht ...

  7. SWFUpload(转载)

    网上的例子介绍的文档真的很多.下面简单介绍一下 SWFUpload的文件上传流程是这样的: 1.引入相应的js文件 2.实例化SWFUpload对象,传入一个配置参数对象进行各方面的配置. 3.点击S ...

  8. Winform使用DevExpress的WaitDialogForm画面

    使用了DevExpress的WaitDialogForm 在应用程序加载开始时新建一个线程,并将loading画面show起来,在应用程序画面弹出前将该线程终止. 代码: private DevExp ...

  9. Android Context作用

    Context 用于访问全局信息的接口 App的资源: strings, drawable资源等等 工程代码:LearnContext.zip ---------------------------- ...

  10. 最精简的代理设计模式demo - 保姆看孩子

    1,协议文件 @protocol NursePtotocol <NSObject> //保姆的协议方法 - (void)startToAmuseBaby; @end 2,管理类(使用类) ...