🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 6.1.6 缓存翻译 * sqltoy的缓存翻译底层是基于ehcache3.x,为什么不用redis? 缓存翻译是一个极度高频的工作,您一旦用了sqltoy和缓存翻译就会领会到其用途的广泛性,经常涉及员工、机构、产品等等的翻译,每个翻译数据集合可能都有上千甚至上万条,如果每次通过redis进行网络传输就失去了意义,所以必须用本地内存缓存,可以任意次的调用,确保绝对的高效。 Redis当然可以跟ehcache进行组合,来实现本地缓存近实时更新处理。 * 缓存翻译非sqltoy必须项,但通过缓存翻译将极大的帮助提升查询效率、简化sql! * 请参见sqltoy-quickstart/src/main/resources目录下的sqltoy-translate.xml 请注意xml的schema,有助于配置自动提示和自动完成 * 缓存定义分成2个部分: 缓存定义: ![](https://img.kancloud.cn/92/1b/921b2b1a8c5d874c82efe040534c4e42_1360x662.png) * 缓存定义元素的公共属性 | 参数名称 | 说明 | 是否必要 | | --- | --- | :-: | | cache | 缓存的名称 | 必要 | | keep-alive | 缓存数据保持时长,单位秒,默认3600秒,当小于等于0时,表示永久保持。 | 非必要 | | heap | 内存堆数量大小,默认10000 | 非必要 | | off-heap | 堆外内存大小,默认为0 | 非必要 | | disk-size | 写磁盘的大小,默认为0 | 非必要 | * Sql直接查询模式定义缓存 | 参数名称 | 说明 | 是否必要 | | --- | --- | --- | | cache | 缓存的名称 | 必要 | | dataSource | 数据库源,如果当前系统只有单一数据源,无效填写 | 非必要 | | sql | 可以是一个sqlId也可以直接是一个sql,针对分类型缓存,如数据字典,允许一个动态参数(即只能有一个动态条件名称,如where xxx=:cacheType,固定条件除外) ,sql中的条件参数名称可以自由定义 | 必要 | * Service模式通过springbean调用加载缓存 数据格式:二维List,按照key, name1,name2 第一列是key格式要求即可 | 参数名称 | 说明 | 是否必要 | | --- | --- | --- | | cache | 缓存的名称 | 必要 | | service | 对应spring bean的名字,也可以用com.xxxx.XXSerivice类来定义,等价于spring中Context可以根据名字获取bean也可以根据类型获取bean。 | 必要 | | method | 对应service的方法,针对数据字典类型的缓存(存在分类),需要提供一个参数:cacheType | 必要 | ![](https://img.kancloud.cn/3d/18/3d18cbcf38ca08dca072f8786eec6c2b_883x254.png) * Rest 接口调用加载缓存 数据格式:二维List,按照key, name1,name2 第一列是key格式要求即可 | 参数名称 | 说明 | 是否必要 | | --- | --- | --- | | cache | 缓存的名称 | 必要 | | url | Rest请求的url地址 | 必要 | | Username | 请求如果带验证的化,传递用户名 | 非必要 | | Password | 请求如果带验证的化,传递密码 | 非必要 | * 缓存更新: 分sql、service、rest定时检测更新,check-frequency表示检测频率(单位秒) ![](https://img.kancloud.cn/38/68/3868e90f3dee408e47bf7d29e2cc38ac_1589x894.png) increment-checker指的是增量更新,对应包含: sql-increment-checker \\ service-increment-checker \\ rest-increment-checker service 更新检测方法需包含一个时间戳的参数,如:getChangeCache(Timestamp precheckTime) rest更新检测:默认会传递参数:lastUpdateTime 将上次检测时间以yyyy-MM-dd HH:mm:ss.SSS 格式传递过去 * 如何让缓存实时更新 理论上来说缓存定时更新对于查询而言基本足够,原因: 1. 任何所谓实时其实都是有延时的,是0.1秒跟5秒之间的差异。 2. 对于查询而言翻译是显示名称,内部的业务码是恒定的,影响的是几秒钟范围内的展示,并不影响业务逻辑(逻辑是依据代码不依据名称) 3. 名称的改变相对而言不会那么随意,比如客户名称、商品名称等 如何实现实时缓存?我们的策略: 1. Sqltoy里面将缓存的失效时间keepAlive=-1 ,让其不自动失效。 2. 利用binlog监听将数据库更新通知到redis 3. 通过redis客户端对redis服务进行事件监听,对sqltoy里面的缓存进行及时更新 4. 通过sqltoy的SqlToyContext中的TranslateManager进行管理扩展:清除、整体更新、部分更新等。 ![](https://img.kancloud.cn/8c/b7/8cb70bf3051c49beb5411f2cfe4101ac_675x163.png) ![](https://img.kancloud.cn/b7/9c/b79cf41ede170dc8fe3d35845fa4093f_1079x1031.png)