前言
最近,花时间撸了一个支付(支付宝、微信)服务,可实现多商户、多应用界面数据化配置。对外提供应用ID以及秘钥,调用者只需要调用相关接口即可实现支付相关逻辑。
缓存
为什么会聊到缓存呢?当然是考虑到如果后期并发量上去了,频繁的调用接口,而接口又会对请求数据和本身数据库应用参数做一定的合法校验,这时候就会频繁的查询数据库应用数据信息。
其实项目中我们对于不易改动的信息没必要每次都去数据库查询,可以将查询结果放入缓存中,第二次调用时,直接在缓存中获取,不再经过数据库。
这时候,只要引入几个小小的注解,就可以轻松搞定,不带修改一丝丝业务逻辑。
启动类上加 @EnableCaching 实现缓存管理:
/**
* 启动类
* @author 小柒2012
*/
@EnableCaching
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
logger.info("PayCloud 支付系统");
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
微信配置接口参数,前一个保存并实现缓存逻辑,后一个读取缓存:
@Override
@Transactional(rollbackFor=Exception.class)
@CacheEvict(cacheNames="wxPayConfig",key="#config.tenantId")
public Result saveWxConfig(WxPayConfig config) {
wxPayConfigRepository.saveAndFlush(config);
return Result.ok();
}
@Override
@Cacheable(cacheNames = "wxPayConfig", key="#tenantId")
public WxPayConfig getWxConfig(Long tenantId) {
String nativeSql = "SELECT * FROM app_wxPay_config WHERE tenant_id=?";
WxPayConfig config = dynamicQuery.nativeQuerySingleResult(WxPayConfig.class,
nativeSql,new Object[]{tenantId});
return config;
}
小结
配置类的信息,基本不大会变动,如果并发读取比较大,还是墙裂建议使用缓存的,但是一定要有一定的更新策略。本次案例使用的是应用内缓存,生产环境可以使用分布式缓存 Redis 代替。
源码:https://gitee.com/52itstyle/easy-pay
演示
地址:https://pay.cloudbed.vip
账号:pay 密码:123456
- END -