游戏缓存粗谈

1.本地缓存和分布式缓存

游戏服务器为了保证访问数据的性能需要将玩家的数据进行缓存,根据缓存的位置不一样,可以分为:本地jvm缓存和分布式缓存。之前做的2个游戏算是2种方式都接触过。

本地jvm缓存:实现方式有多种,比较好的方式就是用一些第三方缓存,比如ehcache,提供了多种缓存策略,或者自己实现一个本地缓存,比如通过ConcurrentHashMap来实现。

分布式缓存:之前有接触的redis,redis3.0之后也支持了服务器端实现集群。
      (更多http://my.oschina.net/OutOfMemory/blog/412408)

2.缓存与数据库

有些游戏可能把缓存紧紧是当做一个缓存,get的时候先从数据中取然后放入缓存中,真正需要update,delete的时候都是直接操作数据库的,这种方式我觉得是比较折中的方式,既保证了一定的性能,有保证的安全性。

另外一种情况就是所有东西都在缓存里面做,然后定期同步到数据库,这种情况就有一定的风险,导致缓存数据没有同步到数据库中。当然如果用的是redis之类的缓存,它本身就提供了2种持久化的功能,分别是RDB和AOF,其实RDB模式下也有可能出现数据的丢失。

游戏公司感觉更多的是关注性能,有时候对数据安全这块不是特别注重,是能够容忍数据丢失(游戏回档),反正我是不是特别赞成这样,但事实就是好多公司都这样搞。

3.数据同步

        本地缓存的同步看到过2种方式的实现,一种是将所有的增删改操作按顺序放入队列,然后使用定时器去读取队列,将数据同步到数据库;另外一种是通过CRC32检查对象是否改变,然后进行同步。

下面看一个关于CRC32的一个实例

public class CRC32Util {

	/**
	 * 获取对象的crc值
	 *
	 * @param object
	 *            实现Serializable接口的对象
	 * @return
	 */
	public static long getCRC(Object object) {
		long crc = 0;
		CRC32 crc32 = new CRC32();
		crc32.update(object2Byte(object));
		crc = crc32.getValue();
		return crc;
	}

	/**
	 * 讲可序列化对象转成字节数组
	 *
	 * @param object
	 *            实现Serializable接口的对象
	 * @return
	 */
	public static byte[] object2Byte(Object object) {
		byte data[] = null;
		ObjectOutputStream out = null;
		ByteArrayOutputStream baos = null;
		try {
			baos = new ByteArrayOutputStream();
			out = new ObjectOutputStream(baos);
			out.writeObject(object);
			data = baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (baos != null) {
				try {
					baos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return data;
	}
}
public class BagCache implements Serializable {
	private static final long serialVersionUID = 1L;
	private long id;
	private int pid;
	private int num;

	public BagCache(long id, int pid, int num) {
		this.id = id;
		this.pid = pid;
		this.num = num;
	}
        //get.set方法
}
public class RoleCache implements Serializable {

	private static final long serialVersionUID = 1L;
	private int roleId;
	private String roleName;
	private Map<Long, BagCache> bagMap = new HashMap<Long, BagCache>();

	public RoleCache(int roleId, String roleName) {
		this.roleId = roleId;
		this.roleName = roleName;
	}

	public BagCache getBag(long id) {
		return bagMap.get(id);
	}

	public void putBag(BagCache bag) {
		bagMap.put(bag.getId(), bag);
	}
        //get.set方法
}
public class CRC32Test {

	public static void main(String[] args) {
		RoleCache role = new RoleCache(1, "a1");
		BagCache bag = new BagCache(1, 1, 1);
		role.putBag(bag);

		long crc = CRC32Util.getCRC(role);
		System.out.println("第一次:" + crc);

		role.setRoleName("a2");
		crc = CRC32Util.getCRC(role);
		System.out.println("第二次:" + crc);

		bag.setNum(2);
		crc = CRC32Util.getCRC(role);
		System.out.println("第三次:" + crc);

	}
}

通过定时检查可序列化的内存对象的CRC32的值,来判断是否需要同步当前对象。

关于分布式缓存,因为本身自己是支持持久化的,很多情况下不需要自己去做持久化了,比如mogodb;当然有个问题就是像redis和mogodb这种缓存数据库,其实并不是特别方便我们去做数据统计的,所以我们也经常使用redis+mysql的方式,将数据也同步到mysql中,一方面是为了安全,一方面是方便做数据统计。redis同步到mysql思路也差不多,将key的增删改操作放入redis的set列表中,然后由定时器去读取set列表,进行同步mysql。

时间: 2024-10-06 08:09:51

游戏缓存粗谈的相关文章

游戏制作大致流程粗谈之三

这次的粗谈主要细谈游戏策划的七大步骤(来源文库) 一:立项报告 1:了解公司现有的技术资源和技术能力. 2:分析目标消费群体,确定游戏风格 3:确定基本玩法玩点.故事背景. 立项报告讨论通过后方可进入下一个阶段 二:项目初期策划文档 1:游戏类型说明(游戏构架) 2:世界观设定(剧本) 3:玩法玩点详细分析及总结(提出游戏元素并分析) 4:预计开发周期(包括策划.技术分析.代码编写.美工.内部测试.公开测试) 5:提出开发小组人员构成名单 6:工作量预估(按工时预估个人工作量) 7:分析宣传方法

粗谈Android中的对齐

在谈这个之前先啰嗦几个概念. 基线:书写英语单词时为了规范书写会设有四条线,从上至下第三条就是基线.基线对齐主要是为了两个控件中显示的英文单词的基线对齐,如下所示: Start:在看API的时候经常会有Start对齐,End对齐,Start对齐主要是为了能够在不同的textDirection(文本排列方向)的时候更好的对齐的一种方式,在textDirection为LTR(从左到右)时Start对齐就等于左对齐,当textDirection为RTL(从右到左)时Start对齐就等于右对齐.End同

游戏制作大致流程粗谈之五

这一次的文章来介绍一下游戏制作非常重要的工具之一游戏引擎 游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始.大部分都支持多种操作平台,如Linux.Mac OS X.微软Windows.游戏引擎包含以下系统:渲染引擎(即"渲染器",含二维图像引擎和三维图像引擎).物理引擎.碰撞检测系统.音效.脚本引擎.电脑动画.人工智能.网络引擎以及场

游戏制作大致流程粗谈之二

上次讲到了游戏原画的制作,在原画师完成原画的创作后,负责建模的同学便需要通过建模工具对原画进行建模,包括游戏的人物模型,场景,物品,等等等等, 游戏建模大致流程如下:1.建立模型   2.UV展开 3.绘制贴图 4.骨骼动画,同时还需要进行编辑的有模型的碰撞体积等等,然后用贴图对模型进行渲染,同时修改 一些材质. 游戏的模型完成后便该有程序员同学来进行代码的编写了,目前比较流行的游戏编程语言有C++,JAVA等,游戏编程接口有DirectX,OpenGL等.编程是游戏制作 环节中耗时最长,工作量

游戏制作大致流程粗谈之一

游戏诞生的第一步便是策划的一个想法,经过和大家的讨论后便可以拿出一套初步的策划方案,其中最重要的两个点应该是 游戏的玩法和游戏的背景,同时也需要考虑玩法和背景的结合情况,接下来一些次要但是长远的东西也应该考虑进去,那就是 游戏所运行的平台以及制作游戏的工具比如说引擎. 一旦确定了策划案,接下来便应该由美工组中的原画同学们来完成原画的制作,根据策划中的游戏背景,人物和场景等等来 进行原画的制作,这也是游戏制作中比较重要的环节之一,往往一个游戏最终的表现力就取决于原画的精细程度.

游戏制作大致流程粗谈之四

这次来介绍一下游戏开发团队中的美工角色 游戏美术设计师可以简单的分为2D和3D两类,2D即使用位图等二维图形制作游戏:3D则是通过大型的3D游戏引擎制作游戏世界和各种物件的3D模型,并有计算机处理后得到真实感较强的3D图像. 由于美术工作量的庞大和种类繁多,通常游戏公司又将游戏美工细分为以下不同的工作岗位. 原画概念设计师 需要有素描和色彩基础,逐步提升为概念设计师.原画部门当中有美术宣传组,要求尤其高,必须有画插画的基础和概念设计的功底. 作为原画师 需要懂得运用photoshop和paint

由“从按下回车到网页显示”粗谈网页优化

图为百度console.log中的信息. 注 水平有限.望批评指正. 前言 从開始做uikoo9.com開始,一直想怎怎么优化,版本号也一直在迭代. 如今最终有点雏形.近期開始思考怎么能让一个网页最快的展如今用户眼前, 想了想前端纷繁的框架,究竟怎样组合才好,写起来好,构建起来好,展现起来快, 且不谈jquery.bootstrap之流.angularjs.vuejs,reactjs.expressjs(nodejs).requirejs,seajs等等怎样组合才好? 追根溯源開始思考,非常多大

Apache Httpd服务器之缓存粗解

当我们通过浏览器输入一个网址,然后服务器响应给我们内容时,服务器会有一个非常复杂的处理过程.服务器并不是每次都会根据我们请求的页面在磁盘上读取页面内容,然后将这些内容返回给浏览器供我们浏览.如果这样,那么当浏览器的并发请求特别多时,会对服务器造成很大的负载.那么服务器如何在并发请求特别大时还能保持响应水准呢?为了解决这一问题,http协议引进了缓存标准.而apache httpd服务器实现了http协议的这一标准.当然,请求和响应是双向的,所以缓存也不仅仅是在服务器这一端来实现,目前的主流浏览器

【用PS3手柄在安卓设备上玩游戏系列】谈安卓游戏对手柄的支持

不同的游戏对于手柄的支持程度是不一样的,对应所需要进行的手柄设置也不尽相同.我没有这样的时间和精力,针对每一款游戏去写博客,但找出不同游戏中的共同点,针对同一类的游戏去写博客,应该是可行的.我把安卓上的游戏分成下面四种类型: 1.原生支持实体手柄的 安卓系统本身是支持实体手柄的.淘宝上面随便一搜"安卓手柄",就能找到各种外设厂商针对安卓系统定制的游戏手柄.游戏厂商跟外设厂商的支持总是相辅相成的,在游戏厂商的支持下,有些游戏是原生支持手柄的.这里的"原生"二字,强调的