尽量做了,目标是绝大部分是操作内存。而又不需要特意去写麻烦的代码去处理内存与数据库 数据一致性问题
思路是?
从内存 保存到数据库 ,这个好做吧
内存中每条记录记录个上次保存时间、保存频率等等
内存记录的创建时间,生命周期
写另外一个线程去写内存中的全部记录,把合适 时间的数据保存到DB
把合适时间的数据从内存中删除
这分别是一个保存到DB 和 清掉内存数据(为了减少内存使用) 的工作
然后从数据库里面读,就是早上发出来 那样的方法,尽量封装几个常用 的
先找内存中有没有,再找数据库中(找到就写入内存)。
就是说内存的数据 与 数据库中的数据不是100%对应的
但结构需要完全 一致
这样做,最终内存中的数据都是一些比较常用的。
而上次保存时间、保存频率、创建时间、生命周期 这些可以记录在 Java表结构类里。 程序员可以设定具体数值
比如 玩家表 经常 用到,生命周期就长一点,保存频率长一点
日志的,生命周期短一点
后续 :
之前 说 “内存数据库” 与 “MongoDB” 100%对应
然后现在是发现不能100%对应
查询条件 对应 一条记录的 这类可以 对应
然后现在是发现不能100%对应
查询条件 对应 一条记录的 这类可以 对应
然后 查询条件 对应 多条记录的, 需要在内存数据库中做个标记“LIST”
在同步内存到数据库的时候 ,看到这个标记,就知道是列表,再读列表,写入数据库
就是内存数据库 完全使用 k / v 结构
就是内存数据库 完全使用 k / v 结构
关于mq 在游戏中的使用:
先分清出几类sql,一种是玩家密切重要的,要立刻看到效果,不允许慢的,这种就实时执行;另外一种sql,像log,玩家基本不会去关心的,我们可以在cpu或io不忙时候再去执行对不
一个功能多数都会涉及两种sql执行吧
我们就分开来实施,在这一功能中,重要的一定要执行,不重要sql我把他放在一个队列,搞个组件(判断cpuio不忙的时候)临时去这些待执行的队列再执行就ok
message queue就是信息队列技术的一个名称嘛
message queue组件目前有很多开源的框架技术嘛,如张宴老师做的httpsqs等,当然公司内部开发也行,我们公司自己独立开发过
httpsqs支持java、php、c等等语言
异步取你要做的功能,如sql、功能等等
httpsqs是独立的
当然还有很多
就是有内嵌的其他实现咯。
那个异步组件你用个还可以把均衡负载做得非常理想的
是的,其实新浪微薄以及人人网用这个还是非常多的
里面架构很多基于这个来实现,而且能把几门语言很容易结合起来
关于一些需要实时操作的东西,好像就不能异步了。
组件不一定是异步,还可以同步,同步的作用在于跨语言实现啦
比如说我用php写个战斗算法,但很消耗时间,我改用c,但是整个游戏基本都是php,如果通过php调用c算法呢,估计要做扩展,这个时间有这个组件就很容易生效啦,这个组件可以同步也可以异步的
是的,其实新浪微薄以及人人网用这个还是非常多的
里面架构很多基于这个来实现,而且能把几门语言很容易结合起来
关于一些需要实时操作的东西,好像就不能异步了。
组件不一定是异步,还可以同步,同步的作用在于跨语言实现啦
比如说我用php写个战斗算法,但很消耗时间,我改用c,但是整个游戏基本都是php,如果通过php调用c算法呢,估计要做扩展,这个时间有这个组件就很容易生效啦,这个组件可以同步也可以异步的