ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、概述 进程内缓存如果用于多进程(多服务器)时,各应用服务器之间的缓存都是独立的,因此在不同服务器的进程间会存在缓存不一致的情况。即使EhCache这类第三方缓存机制提供了集群环境下的缓存同步策略,但是同步依然是需要一定的时间,短暂的缓存不一致依然存在; 在一些要求高一致性(任何数据变化都能及时的被查询到)的系统和应用中,就不能再使用EhCache来解决了,这个时候使用集中式缓存就可以很好的解决缓存数据的一致性问题; 我们这里采用redis来实现; ## 二、方案 使用方案主体基于内置方案即可,但因为它是进程外的缓存机制,如我们采用的redis,需要在更新缓存的时候,必须用@CachePut来更新缓存; 参考:[平台缓存机制](../%E5%B9%B3%E5%8F%B0%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6.md) ## 三、实例 ### **应用进程代码** 查询: ``` public interface SysLogDao extends BaseDao<SysLog, Long> { @Cacheable(cacheNames = "syslogcache1", key = "#infoCode") SysLog findByInfoCode(String infoCode); } ``` 更新: ``` @Component public class SysLogCacheService { @Autowired private SysLogDao sysLogDao; @CachePut(cacheNames = "syslogcache1", key = "#log.infoCode") public SysLog save(SysLog log) { return sysLogDao.save(log); } } ``` 使用: ``` @RayServiceMethod public ResponseObject view(long logId) { SysLog log = sysLogDao.findByInfoCode("log20220323172704e1a"); log.setModuleName(DateUtil.getDateStr(100)); sysLogCacheService.save(log); // SysLog log = sysLogDao.findById(logId).get(); model.setLog(log); return responseObj; } ``` ### **调度进程代码** ``` @Autowired SysLogDao sSysLogDao; @Override protected void doInRayPeriodJob(SysJobExecution sysjobexecution, StringBuilder errorMessage) { SysLog log = sSysLogDao.findByInfoCode("log2022032317270446b"); scanRechargeService.doInSingleTransaction(); } ```