focus on linux, c/c++, lua

如何把memcached应用到我的项目中

      近日把memcached的相关协议看了下,把我的数据前端又重新梳理了一遍。开始琢磨着如何把我memcached应用到项目中,对于我自己仿造的轮子有点失去信心了。。。如果是对于一个web项目,memcached有很大的发挥空间,特别是对一些静态页面的缓存,如图片,文件,视频等,不需要数据的同步,也不会存在从cache中获得脏数据的可能。但是对于我们一个游戏项目,如果按照memcached的协议去做缓存,玩家第一次登录的时候,从db获取,并保存在cache中,以后该玩家的数据就直接从cache中获取。但不同于web服务,玩家在游戏过程中,身上携带的数据不停的变化,这样就会要求数据必须从服务器内存同步到数据前端的cache,然后前端再通过一种机制存入硬盘的dbms。
      如果说这种方案实施成功的话,当然会大大的减轻数据库的压力,memcached对内存管理非常的给力,又可以分布式管理,甚至LRU机制让下线的玩家依然可以把数据放在cache中。这些对于我来说诱惑很大,当然这些都是理论上,其实理论上可以多数都是操蛋的。
      下面说说问题在哪里,先假设玩家的数据是这样的:

struct user_data
{
    int64  u_id (key);
    
string u_nickname;
    int64  u_money;
    int64  u_exp;
}


     玩家第一次登录的时候把这些信息全部获取了,在该玩家下线的时候,u_exp增加了,但是u_money没变,假设该时,我做一次数据同步,那么我犯愁了,玩家这么多数据,我该更新哪条数据呢?全部做一次数据覆盖应该不是一个好的设计,因为有可能db没有提供一个覆盖所有数据的存储过程,只针对了每个数据段的更新提供存储过程。这里有一个比较次一点的方案就是玩家在每次更新数据的时候,就让cache去通知db也更新一次,这时cache就是把玩家的操作及时的转达给了db,不用为日后的同步做任何tag。这样下来db的写操作还是没有减少,但是读操作大大的减少了,这也不失为一种折中方案。最近准备试试这个方案,看下高峰期db的效率能提升多少。

posted on 2012-01-06 15:59 zuhd 阅读(2545) 评论(8)  编辑 收藏 引用 所属分类: server

评论

# re: 如何把memcached应用到我的项目中 2012-01-06 19:47 zhs007

加个

bool isUpdate;

的标志不就完了么  回复  更多评论   

# re: 如何把memcached应用到我的项目中 2012-01-07 09:06 zuhd

我现在就是这么做的,从心理上一直觉得它很丑陋  回复  更多评论   

# re: 如何把memcached应用到我的项目中 2012-01-07 15:02 zzzdev

针对数据库编程,需要注意网络通信开销。
1、更新一个字段和更新20个字段,对于数据库来说开销大头在网络通信上,除非一个IP包装不下,否者考虑更新一个或多个字段总体来说没有任何意义。
2、对于持久化,尽量使用批量接口,数据库会很HIGH的。  回复  更多评论   

# re: 如何把memcached应用到我的项目中 2012-01-09 09:10 zuhd

@zzzdev
你所指的网络开销是指带宽?一般服务器和数据库的通讯都是在局域网内,不存在什么开销,你说的批量接口,不懂耶  回复  更多评论   

# re: 如何把memcached应用到我的项目中[未登录] 2012-01-10 01:45 杨粼波

用SP可以节约一点带宽。不过对于更新数据来说,对数据库的消耗确实是大的。而如果只是查询,那并不存在任何问题。

网络开销基本上不是问题,现在部署上多半都是同局域网的,千兆网卡,甚至光纤,很难造成太大的影响。

数据库主要IO开销还是在硬盘上,特别是更新数据。用memcached,主要也就是减轻磁盘IO的消耗,缓存在内存中,减少对磁盘的操作。

像MySQL这样级别的数据库,可以把数据规模降低,比如分表这种做法。当然,这需要数据规模达到一定程度。所以我现在还没有分表。数据库还能承受。

我现在头疼两个东西:
1.批量更新;
2.日志的增长。
日志倒还好,勤快点备份清理就好。
批量更新,可以缓存数据到内存当中,以期减少写入频率,但是,始终还是要写入的,这个负载最终还是无可避免的。  回复  更多评论   

# re: 如何把memcached应用到我的项目中 2012-01-10 09:11 zuhd

@杨粼波
你要是想减少写操作,就模拟rpg的做法,玩家下线时统一保存数据,或是定时保存数据,日志嘛有钱的话单独用一台服务器做。
其实频繁的读操作也能把mysql拖的疲惫不堪,关系数据库快要被淘汰了  回复  更多评论   

# re: 如何把memcached应用到我的项目中 2012-01-10 10:41 杨粼波

再怎么减少,还是有操作的,只能说是尽量的减少操作量。因为现在的磁盘型硬盘io操作还是非常非常慢的。这种优化是非常收益可观的。

其实我现在也是采用的定时保存,开了数据库的连接池。我有经常查看数据库的消耗,多半都是消耗在了批量更新上。现在来看,还是可以承受的。

如果你的MySQL能被查询所拖垮,那你可以考虑下:能否减少查询的次数?如果不可行,那是否应该要去分表了?

现在的确KV型的NoSQL数据库兴起了,但是就我直觉来说,很长时间内关系型的SQL数据库是不大可能被淘汰的。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理