1.去除redis相关依赖

common模块:

2.新建本地缓存

添加依赖:

        <!--        本地缓存-->
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>

代码说明:

对业务缓存进行拆分

新建并初始化,下方缓存:

数据字典 dictCache;
系统配置 sysConfigCache;
token认证 cachetokenCache;
防止重复提交 repeatSubmitCache;
验证码服务 captchaCache;

增加一下基础方法。

使用implements ApplicationRunner,重写run方式进行初始化。

详细代码如下:

@SuppressWarnings(value = {"unchecked", "rawtypes"})
@Component
@Order(1)
public class LocalCache implements ApplicationRunner {

    private static final Logger log = LoggerFactory.getLogger(LocalCache.class);

    @Value("${token.expireTime}")
    private int tokenExpireTime;

    private Map<String, Object> dictCache;

    private Map<String, Object> sysConfigCache;

    /**
     * token认证cache - 会自动过期的map
     */
    private Cache<String, Object> tokenCache;

    /**
     * 防止重复提交
     */
    private Cache<String, Object> repeatSubmitCache;

    /**
     * 验证码服务
     */
    private Cache<String, Object> captchaCache;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        sysConfigCache = new ConcurrentHashMap<String, Object>(1024);

        dictCache = new ConcurrentHashMap<String, Object>(1024);

        tokenCache = Caffeine.newBuilder()
                .expireAfterWrite(tokenExpireTime, TimeUnit.MINUTES)
                .initialCapacity(100)
                .maximumSize(1000)
                .build();

        repeatSubmitCache = Caffeine.newBuilder()
                .expireAfterWrite(Constants.REPEAT_SUBMIT_INTERVAL, TimeUnit.MILLISECONDS)
                .initialCapacity(100)
                .maximumSize(1000)
                .build();

        captchaCache = Caffeine.newBuilder()
                .expireAfterWrite(Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES)
                .initialCapacity(100)
                .maximumSize(1000)
                .build();
    }

    public void deleteAllDictCacheObject() {
        dictCache.clear();
    }
    public void deleteAllSysConfigCacheObject() {
        sysConfigCache.clear();
    }

    public void deleteTokenCacheObject(String key) {
        tokenCache.invalidate(key);
    }

    public void deleteRepeatSubmitCacheObject(String key) {
        repeatSubmitCache.invalidate(key);
    }

    public void deleteCaptchaCacheObject(String key) {
        captchaCache.invalidate(key);
    }

    public void deleteSysConfigCacheObject(String key) {
        sysConfigCache.remove(key);
    }

    public void deleteDictCacheObject(String key) {
        dictCache.remove(key);
    }

    public <T> T getTokenCacheObject(String key) {
        return (T) tokenCache.getIfPresent(key);
    }

    public <T> T getRepeatSubmitCacheObject(String key) {
        return (T) repeatSubmitCache.getIfPresent(key);
    }

    public <T> T getCaptchaCacheObject(String key) {
        return (T) captchaCache.getIfPresent(key);
    }

    public <T> T getSysConfigCacheObject(String key) {
        return (T) sysConfigCache.get(key);
    }

    public <T> T getDictCacheObject(String key) {
        return (T) dictCache.get(key);
    }


    public void setTokenCacheObject(String key, Object value) {
        tokenCache.put(key, value);
    }

    public void setRepeatSubmitCacheObject(String key, Object value) {
        repeatSubmitCache.put(key, value);
    }

    public void setCaptchaCacheObject(String key, Object value) {
        captchaCache.put(key, value);
    }

    public void setSysConfigCacheObject(String key, Object value) {
        sysConfigCache.put(key, value);
    }

    public void setDictCacheObject(String key, Object value) {
        dictCache.put(key, value);
    }

    public Collection<String> getTokenCacheKeys() {
        return tokenCache.asMap().keySet();
    }

    public Collection<String> getDictCacheKeys() {
        return dictCache.keySet();
    }

    public Collection<String> getSysConfigCacheKeys() {
        return sysConfigCache.keySet();
    }
}

3.方法替换

替换业务中RedisCache中方法的调用。

4.清理代码

清理redis相关代码与yml配置。

tip

对于使用@PostConstruct初始化,有部分导致空指针问题,采用@Order 和 implements ApplicationRunner进行替换。

序列化问题报错修复:

JSONArray arrayCache = JSONArray.from(SpringUtils.getBean(LocalCache.class).getDictCacheObject(getCacheKey(key)));

参考:把ruoyi-vue前后端分离项目的redis缓存改为本地缓存cache_ruoyi redis-CSDN博客
https://blog.csdn.net/weixin_43860634/article/details/131402382

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐