分享一下项目中使用的缓存框架设计

缓存有以下三种常见的模式:
Cache Aside 更新模式
Read/Write Through 更新模式
Write Behind Caching 更新模式
通俗一点来讲就是:
1.同时更新缓存和数据库(Cache Aside 更新模式)
2.先更新缓存,缓存负责同步更新数据库(Read/Write Through 更新模式)
3.先更新缓存,缓存定时异步更新数据库(Write Behind Caching 更新模式)
这三种模式各有优劣,可以根据业务场景选择使用。

ps:本文介绍的缓存框架是服务于游戏业务的。基于游戏服务器线程池的设计,所有用户的操作都是单线程的,所以不需要考虑并发的问题。

缓存框架提供查询自己或其他玩家数据的方法,但只能修改和删除自己的数据。

redis ↔ 内存 ↔ mysql
(由服务器负责将数据从redis和mysql中写入读取)

通过继承缓存框架的抽象类,构造方法中设置JavaBeanredis keymysql数据查询SQL语句,即可使用

redis和内存中数据的组织可以看作是一个Map<userID,List< Bean>>
mysql 则会按照设置的sql语句获取相应的表数据

流程图

回写机制:

1.用户下线回写:分三步,根据内存变更集回写用户的个人数据,记录一个回写时间,最后清空内存相关缓存

2.定时回写:根据数据更新的时间戳,过滤出所有需要回写的数据进行回写操作,清空内存相关缓存,更新redis中的最后一次回写时间

3.关服回写:操作与定时回写相同

序列化机制:
1、mysql :
mysql和JavaBean类的转换是依靠反射完成的,在构建DBMapCacheSource时需要传入相对应的JavaBean类,通过反射从Java类中获取所有非static的属性,用于构建映射关系

2、redis:
redis和JavaBean类的转换使用了Java序列化库protostuff protostuff是一个开箱即用的序列化库,使用非常简单,相对其它序列化库,

protostuff优势在于:
1、使用简单 Protobuf每次要编写接口定义文件,然后还要编译,操作太繁琐;
2、高性能 相对json等文本序列化库,protostuff是二进制的,因此性能比json等方式高;
可以说protostuff在高性能和使用成本上做了很好的取舍。
以下是其相关资料:
github:https://codechina.csdn.net/mirrors/protostuff/protostuff
官方文档:https://protostuff.github.io/docs/protostuff-runtime/

优化空间:
缓存框架使用的是全量缓存,线上内存占用会比较大,可以考虑用LRU之类的算法做缓存淘汰,这样做的化要考虑缓存的命中率,不然会经常发生长时间的GC

猜你喜欢

转载自blog.csdn.net/awsl_6699/article/details/130005021