### 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)
- 1.简介
- 开发历程
- 技术架构
- 问答了解
- 版本历史
- update-5.1.4、4.18.43
- update-5.1.2
- 早期历史
- 5.1.15.rc1
- 2.快速使用
- 示例与环境
- quickvo工具使用
- 用法说明
- 关键注意事项
- 严格VO(DTO)和POJO(entity)分层
- 3.教程
- spring项目搭建
- Toy-ORM 配置
- 详细配置参数
- 缓存功能
- 缓存配置、缓存扩展
- 扩展缓存框架配置
- 缓存翻译
- 其他缓存应用场景
- 公共功能
- 表(对象)关联
- 公共字段赋值
- 链式操作
- DTO与POJO互转
- 对象操作
- save + update
- delete + trunk
- load加载数据
- 唯一验证
- 树形数据
- sharding分库分表
- SQL操作
- sql文件规则
- filters说明
- 缓存翻译
- 分库分表
- 汇总、环比
- 行列转换
- 数据脱敏
- 格式化-数字日期
- sqlToy的sql查询基本规则
- Sql查询功能
- load操作
- get操作
- find操作
- 分页查询
- 并行查询
- execute操作
- executeSql
- executeStore
- 数据库特性
- 主键策略
- JSON等类型扩展支持
- 跨库说明--异种库兼容
- 数据库保留字处理
- 多源-多库-异库
- 多数据源
- Mongodb支持
- ElasticSearch支持
- 高级扩展
- 补充-if+fast+blank+value+loop
- 高级功能
- 完美sql
- 快速分页
- 缓存翻译
- 防止sql注入
- 字段加解密
- 扩展集成