eladmin——系统缓存

233 阅读1分钟

一、系统缓存

eladmin系统缓存使用的是 Redis,默认使用 Spring 的注解对系统缓存进行操作。

二、配置缓存

配置文件位于 eladmin-common 模块中的 me.zhengjie.config.RedisConfig,如下(重点关注spring-cache相关配置):

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 自定义缓存key生成策略,默认将使用该策略。
     */
    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return (target, method, params) -> {
            Map<String,Object> container = new HashMap<>(8);
            Class<?> targetClassClass = target.getClass();
            // 类地址
            container.put("class",targetClassClass.toGenericString());
            // 方法名称
            container.put("methodName",method.getName());
            // 包名称
            container.put("package",targetClassClass.getPackage());
            // 参数列表
            for (int i = 0; i < params.length; i++) {
                container.put(String.valueOf(i),params[i]);
            }
            // 转为JSON字符串
            String jsonString = JSON.toJSONString(container);
            // 做SHA256 Hash计算,得到一个SHA256摘要作为Key
            return DigestUtils.sha256Hex(jsonString);
        };
    }

    @Bean
    @Override
    @SuppressWarnings({"all"})
    public CacheErrorHandler errorHandler() {
        // 异常处理,当Redis发生异常时,仅打印日志,不影响正常业务。这里用spring自带的LoggingCacheErrorHandler也可以。
        log.info("初始化 -> [{}]", "Redis CacheErrorHandler");
        return new CacheErrorHandler() {
            @Override
            public void handleCacheGetError(RuntimeException e, Cache cache, Object key) {
                log.error("Redis occur handleCacheGetError:key -> [{}]", key, e);
            }

            @Override
            public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {
                log.error("Redis occur handleCachePutError:key -> [{}];value -> [{}]", key, value, e);
            }

            @Override
            public void handleCacheEvictError(RuntimeException e, Cache cache, Object key) {
                log.error("Redis occur handleCacheEvictError:key -> [{}]", key, e);
            }

            @Override
            public void handleCacheClearError(RuntimeException e, Cache cache) {
                log.error("Redis occur handleCacheClearError:", e);
            }
        };
    }
}

三、 spring Cache基操

SpringBoot结合Redis实现缓存管理 - 掘金 (juejin.cn)

四、使用建议

缓存的出现加快了数据查询的速度,同时增加了维护成本,建议使用在高频读低频写的数据上。

注意:使用不当可能会出现数据不一致的问题,请根据实际业务的需要进行使用。