SpringBoot缓存系统常量数据

144 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

为什么要缓存系统常量数据

有些常量数据是我们在系统初始化的时候就需要去加载完成的,并经常需要去使用这些数据。我们不可能没事需要使用的时候再去数据库中读取这些数据,这样不仅代码冗余,而且也会影响系统的运行速度,并增加数据库的压力。这时候我们就需要将这些数据进行缓存,方便后续程序中的使用,而不是经常性的为一些常量而去重复的读取数据库。

怎么实现

设计SQL语句,用于保存常量

可以在这个基础上进行扩展。

CREATE TABLE `sys_config` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `param_key` varchar(200) NOT NULL COMMENT '参数名',
  `param_value` varchar(200) DEFAULT NULL COMMENT '参数值',
  `status` tinyint(1) unsigned NOT NULL COMMENT '状态',
  `remark` varchar(200) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `unq_param_key` (`param_key`) USING BTREE,
  KEY `idx_status` (`status`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

在xml文件中编写查询语句

<select id="selectAllParam" resultType="com.example.emos.wx.db.pojo.SysConfig">
	SELECT param_key, param_value FROM sys_config WHERE status = 1;
</select>

在DAO层申明抽象方法

public List<SysConfig> selectAllParam();

创建一个封装类,用于保存需要缓存的常量

@Data
@Component
public class SystemConstants {
    public String suibian1;
    public String suibian2;
    public String suibian3;
    public String suibian4;
    public String suibian5;
    public String suibian6;
}

在启动项中添加init()方法

最后我们需要将方法在系统启动的时候进行缓存,就必须在启动项中添加init()方法,并实现读取常量数据并缓存的操作。

需要为方法添加上@PostConstruct注解,方法才能在系统初始化的时候完成加载动作。

@SpringBootApplication
@ServletComponentScan
@Slf4j
public class shuaideyaosiApiApplication {
    @Autowired
    private SysConfigDao sysConfigDao;

    @Autowired
    private SystemConstants constants;

    public static void main(String[] args) {
        SpringApplication.run(EmosWxApiApplication.class, args);
    }

    @PostConstruct
    public void init() {
        List<SysConfig> list = sysConfigDao.selectAllParam();
        list.forEach(one -> {
            String key = one.getParamKey();
            key = StrUtil.toCamelCase(key);
            String value = one.getParamValue();
            try {
                Field field = constants.getClass().getDeclaredField(key);
                field.set(constants, value);
            } catch (Exception e) {
                log.error("执行异常", e);
            }
        });

    }
}