Skip to content
ScutGame edited this page Jan 27, 2015 · 12 revisions

此章节介绍如何使用服务端的Cache缓存

目的与用途

面对开发人员使用数据库在操作数据时,一般会使用查询、删除、更新等Sql语句操作数据库;使用开发时间长又不免方便,对于游戏需要频繁读取和更新数据的需求,性能上又满意;那有没有更好的方案呢?这里给大家介绍一种NoSql的Redis缓存数据库,它提供高读写的IO性能,可以满足我们的需求。

在Redis缓存数据库基础上,为了更好的使用和性能,在服务器端增加一层缓存访问层(CacheStruct),对于常用的数据在第一次使用后,它会存留在内存中,一定时间内(24h)未使用则会自动移除,再次使用时会再次加载;在数据的增加、修改和删除操作上,使用CacheStruct对象来增加、修改和删除数据,它会监听数据的变动,采用异步的方式自动更新到Redis缓存数据库中(更新间隔100ms);不需要关心与数据库或Redis缓存数据库的交互。

游戏数值类型的配置数据,变动比较小,不需要在程序里对它修改,是只读类型的;此类数据可以使用SQL或MySql数据库存储,CacheStruct可以针对此类数据也可以缓存,提高读取性能;有修改时,可以重载数据。

注意:Redis缓存数据库使用

  • 为了读取性能,它的数据也是在内存中的,不能随意关闭Redis缓存数据库,需要等待它自动备份或手动备份后,才可关闭,否则数据会丢失;
  • 打开Redis.conf配置文件,搜索“save”配置项可查看它的更新方式;
  • “dbfilename”配置项是它的存储磁盘文件,用于备份或数据恢复, 需要自己手动备份;

缓存设计

它提供数据加载,数据重载,数据卸载,缓存查找,缓存修改删除等功能。

缓存存储结构

存储方式使用静态的字典模型,数据以结构化的实体对象Entity放入字典模型。

1 缓存池(CachePool)结构如下:(实体类名:表示Entity的完整类名)


字典主键   |  字典值项 
----------------------
实体类名   |  缓存容器
----------------------

2 缓存容器(CacheContainer)结构也是一个字典模型,有Entity、Dictionary和Queue几种类型存储。

实体主键:表示Entity的属性有带“EntityField(true)"标记的主键值。

  • Entity类型存储:它用于公有的ShareEntity实体模型存储
    字典主键   |  字典值项 
    ----------------------
    实体主键   |  缓存项
    ----------------------
  • Dictionary类型存储:它用于私有的BaseEntity实体模型存储,PersonalId表示数据的所属者ID是Entity的GetIdentity方法返回值,可以使用UserID作为所属者ID
    字典主键   |  字典值项 
    ----------------------
    PersonalId |  缓存项
    ----------------------
  • Queue类型存储:它用于存储一组Entity对象列表
    字典主键   |  字典值项 
    ----------------------
    队列主键   |  缓存项
    ----------------------

3 缓存项(CacheItemSet)

  • 如果是Entity类型存储:存储Entity对象的值

  • 如果是Dictionary类型存储:值也是一个字典模型,如下

    字典主键   |  字典值项 
    ----------------------
    实体主键   |  Entity   
    ----------------------
  • 如果是Queue类型存储:值是一个队列模型,如下
    Queue项
    ----------------------
    Entity1
    Entity2
    ...
    EntityN
    ----------------------

缓存更新机制

缓存使用示例

自定义缓存模型

自定义数据加载

自定义更新机制

Clone this wiki locally