先说一下我们目前的做法是:
Nginx和php。Redis 做数据缓存 MySQL 做数据库。这样每次用户的请求上来,php都会去redis 和mysql 取数据,数据更新后同步的写到MySQL 和Redis 中,这里有以下缺点:
1,对玩家的请求处理的比较慢,因为每次php都要依靠到Redis 和MySQL 读数据操作完后再写数据涉及到io的一读一写,对程序本身来说是很耗性能的,同时对MySQL 来说也是很有压力的。
基于以上的问题,我决定改善一下目前的这种状况。
方法如下:
1.前端用nginx做网络接入,后由lua模块,把包体中取出一个字段,这个字段可以是某个tooken或者干脆就是一个index(是由登陆服务器产生的),然后根据这个token做hash计算,决定讲此包发送到哪个tomcat上。
2.java 层来在本地内存中保存这些在线的玩家的列表数据。
3.当接收到nginx转发过来的http请求协议,java 层做相应的逻辑计算,后立即返回给用户结果
4.后台起一个或者几个线程来按照某一策略来把数据同步到redis或者mysql中。这个侧略可以是LRU,根据玩家最近最久没有操作过的数据(而这个数据又是变化的),将其同步到MySql和 redis中。
特别说明一下:
这里的redis是用来做二级缓存用的,比如一些不经常用的玩家数据,而这些数据又比较占空间,像 好友列表之类的(根据各自的游戏实现的需要),而对于玩家身上经常要变动的数据,比如,金币,我们将其直接存放的java层的本地内存中。
这样的做好处:
1,玩家操作频繁的数据,我们基本上都保存在本地,处理数据直接在本地内存做操作,将IO跟逻辑处理分开,增加系统的吞吐量,效率高
2.减少了对数据库和redis的读写,减少数据库的压力。