缓存具有以下特点
1. 大部分缓存功能可以通过实体标注在Repository中自动处理,可以提升开发效率并减少出错机会;
2. 支持分布式缓存(目前支持Memcached);
3. 灵活的缓存即时性策略:
1) 实体缓存(及实体正文缓存)自动实现即时性;
2) 列表缓存可以设置即时性(自行编码可以实现更灵活的控制)或非即时性;
3) 可以配置过期时间因子,用于整体延长或缩短过期时间;
设计原理:
为了合理使用缓存,依据缓存内容的不同将缓存分为3类(如下图所示):
1. 列表缓存:
1) 仅缓存EntityId列表;
2) 获取实体列表时,依据EntityId自动组装成完整的实体列表;
2. 实体缓存:每个实体一份单独的缓存。
3. 实体正文缓存:
1) 当实体正文可能很大时,为了提升运行效率并减少分布式缓存时的网络流量将实体正文缓存单独存储,不在实体缓存中存储该部分内容;
2) 实体正文缓存可能包含两种情况:数据库存储的内容和格式化后的内容;
i. 数据库存储的内容用于编辑时使用(使用频次少);
ii. 格式化的内容用于显示(使用频次多)
、
缓存及时性 :
1. 缓存的即时性实现原理:
1) 缓存与源数据保持同步;
2) 使缓存具有版本:当缓存源数据有变化时递增对应缓存的版本号,新版本的缓存不存在时通过最新的缓存源数据创建,而旧版本的缓存被抛弃,从而保证了缓存的即时性。
3) 无版本需即时更新的缓存,在分布式缓存情况下,需要做到:
i. 保持分布式缓存与源数据保持同步;
ii. 获取缓存需要穿透二级缓存直接从一级缓存(即分布式缓存)获取。
2. 各类缓存即时性方式:
缓存期限类型 | 非分布式缓存 | 分布式缓存 |
实体缓存 | 与源数据保持同步 | 缓存版本 |
实体正文缓存 | 与源数据保持同步 | 缓存版本 |
列表缓存 | 缓存版本 | 缓存版本 |
3. 各类缓存即时性实现详细说明:
1) 实体缓存及实体正文缓存均自动实现即时性;
i. 实体缓存及实体正文缓存均在数据库增、删、改的同时,在Repository中自动同步缓存;
ii. 在分布式缓存情况下,为了解决一级缓存与二级缓存的不一致,对实体缓存及实体正文缓存的CacheKey关联版本号,即当实体Update(Insert、Delete不影响)时会自动递增缓存关联的版本号丢弃旧缓存,从而确保数据的即时性;
2) 列表缓存:有些需要即时性,有些不需要即时性;
i. 对于不需要即时性的列表缓存一般根据缓存过期时间,自动过期。例如:排行数据无需即时更新。
ii. 对于需要即时性的列表缓存,通过在CacheKey关联版本号,当列表版本号变化时丢弃旧版本的缓存;
3) 列表缓存即时性处理:为了尽量提升列表缓存的使用率,把列表缓存的版本分为全局版本和分区版本:
i. 全局版本:即有任何同类型实体增、删、改都会递增该类型的全局版本。例如,后台管理博文时应该使用与全局版本号关联的缓存;
ii. 分区版本:即仅该分区内实体增、删、改才会递增该分区的版本。例如,我的博文应该使用与分区版本号(OwnerUserId)关联的缓存,只有我的博文增、删、改时才影响这个分区版本号,别人的博文增、删、改不影响我的博文缓存分区版本号;