Redis数据库在网游服务器开发中的应用
2014-04-29纪国贤
纪国贤
摘 要 Redis 是一个开源的内存数据库,具有速度快,类型全,支持多种语言操作,可以把内存中的数据同步存储到硬盘上保存等优点,被广泛应用于网站大数据搜索,游戏服务器等领域。
关键词 Redis 网络游戏 Key-Value
中图分类号:TP3 文献标识码:A
Redis是一个开源的,先进的key-value持久化产品。它通常被称为数据结构服务器,它的值可以是字符串(String)、哈希(Map)、列表(List)、集合(Sets)和有序集合(Sorted sets)等类型。可以在这些类型上面做一些原子操作,如:字符串追加、增加Hash里面的值、添加元素到列表、计算集合的交集,并集和差集;或者区有序集合中排名最高的成员。为了取得好的性能,Redis是一个内存型数据库。不限于此,看你怎么用了,也可以把数据保存到磁盘中,或者把数据操作指令追加了一个日志文件,把它用于持久化。也可以用Redis容易的搭建master-slave架构用于数据复制。Redis可以用大部分程序语言来操作:C、C++、C#、Java、Node.js、php、ruby等等。
Redis主要用于解决传统关系型数据库存储和查询等操作速度缓慢的问题,比如Mysql,Mssql。传统网络游戏中要把关系型数据库的数据加载到内存中运算才能满足游戏对数据的处理速度的需求。而从内存到数据库保存数据是每隔一段时间保存的,如果服务器出现bug,那么内存里面的数据将会全部丢失。这就意味着玩家会丢失游戏数据,比如丢了装备,丢了进度,只能被迫回档,这显然对游戏的运营造成了很大的困扰。因为Redis数据库是运行在内存中的,相对于基于磁盘存储的传统数据库,速度快了许多倍,游戏可以同步的把数据保存在redis数据库里面,这样即使服务器程序突然关闭也不会丢失用户数据。
市场上还有Mongodb,Memcached等key-value型内存数据库提供了和Redis类似的功能。Mongodb是非关系型数据库,数据保存在磁盘上并且提供比较高的性能。Memcached是配合Mysql这种传统数据库的非关系型内存数据库,也可以看成是一个数据缓存,但是他不提供数据持久化的功能,只能通过其他传统数据库保存数据。Redis数据库比他们优秀一个方面是他既是内存数据库,又可以把数据保存到硬盘上。Redis有两种硬盘存储模式支持(snapshot和aof),另外Redis可以将key-value中的部分调用较少的value存储在硬盘中,即VM(虚拟内存)。Redis显然比较适合于游戏中的应用。
游戏服务器中涉及到很多排行信息,比如玩家等级排名、金钱排名、战斗力排名等。一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合。但是有时候我们需要每一个玩家的排名,玩家的数量太多,不能利用数据库(全表排序压力太大),自己维护也会比较麻烦。使用Redis可以很好的解决这个问题。它提供的有序Set,支持每个键值(比如玩家id)拥有一个分数(score),每次往这个set里添加元素,Redis会对其进行排序,修改某一元素的score后,也会更新排序,在获取数据时,可以指定排序范围。更重要的是,这个排序结果会被保存起来,不用在服务器启动时重新计算。通过它,排行榜的实时刷新、全服排行都不再成为麻烦事。
Redis提供了较为丰富数据类型,使我们可以更为容易地将数据对象缓存起来(序列化、protobuffer)。当需要请求某一数据时,先从Redis中查找,如果没有再查数据库,同时交给Redis缓存起来。当对数据进行修改时,则先将修改后的数据保存到Redis,然后保存至数据库。可以有另外的思路:A不实时保存到数据库,而是交由另外的线程(甚至是专门的程序)去保存,以提高逻辑层的响应速度。B部分数据交给Redis保存(Reids自身有持久化功能),像玩家已经完成过的任务ID集合,利用Redis的Set类型保存更为合适。C玩家瞬时变化的数据不见得每次修改都需要保存(比如金钱、经验),但如果游戏服务器自己维护在内存中,出现宕机就会导致回档。Redis是独立于游戏服务器的,交由它来保存,可以防止宕机回档的问题,也可以减少游戏服务器自己维护数据所占用的内存。
为了更好的扩展数据库,把Redis设置成集群模式是相当简单的事情:在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
Redis数据库优异的性能和完善的数据处理方式,非常适合在网络游戏服务器中使用,高速,稳定,支持多种类型是它最大的优点。