-
Notifications
You must be signed in to change notification settings - Fork 570
Cache
此章节介绍如何使用服务端的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
----------------------