把ruoyi-vue前后端分离项目的redis缓存改为本地缓存cache

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 把ruoyi-vue前后端分离项目的redis缓存改为本地缓存cache

场景

ruoyi-vue前后端分离项目使用的是redis缓存,现在要把redis缓存,改为本地缓存,即内存中存储,不使用redis了。

思路

开发一个本地缓存的工具类来替代 RedisCache类,然后把涉及的地方改一下即可

开始改造

由于ruoyi中使用redis的地方较多,所以需要仔细改造

1、首先去掉redis的maven依赖

注意:是去掉,不是加上

<!-- redis 缓存操作 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、开发一个本地缓存工具类,类似于redis

开发本地缓存类Localcache.java,放在ruoyi-common工程中

package com.ruoyi.common.core.cache;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
/**
 * 本地缓存方式
 *
 */
@SuppressWarnings(value = { "unchecked" })
@Component
public class Localcache {
  private Map<String,Object> persistentCache;
  /**
   * token认证cache - 会自动过期的map
   */
  private Cache<String, Object> tokenCache;
  /**
   * 防止重复提交
   */
  private Cache<String, Object> repeatSubmitCache;
  /**
   * 验证码服务
   */
  private Cache<String, Object> captchaCache;
  @PostConstruct
  public void init() {
    persistentCache = new ConcurrentHashMap<String, Object>(1024);
    tokenCache = Caffeine.newBuilder()
        .expireAfterWrite(30, TimeUnit.MINUTES)   //30分钟
        .initialCapacity(100)
        .maximumSize(10000)
        .build();
    repeatSubmitCache = Caffeine.newBuilder()
            .expireAfterWrite(10, TimeUnit.SECONDS)   //10秒
            .initialCapacity(100)
            .maximumSize(10000)
            .build();
    captchaCache = Caffeine.newBuilder()
            .expireAfterWrite(2, TimeUnit.MINUTES)    //2分钟
            .initialCapacity(100)
            .maximumSize(10000)
            .build();
  }
  /**
   * Get方法, 转换结果类型并屏蔽异常, 仅返回Null.
   */
  public <T> T get(String key) {
    try {
      Object obj = persistentCache.get(key);
      if( null == obj ) {
        obj = tokenCache.getIfPresent(key);
      }
      if( null == obj ) {
        obj = captchaCache.getIfPresent(key);
      }
      if( null == obj ) {
        obj = repeatSubmitCache.getIfPresent(key);
      }
      return (T) obj;
    } catch (RuntimeException e) {
      return (T)null;
    }
  }
  public List<String> keys(String key){
    List<String> keyList = new ArrayList<String>();
    List<String> keys = new ArrayList<String>(persistentCache.keySet());
    for(int i=0;i<keys.size();i++){
      if(keys.get(i).startsWith(key)){
        keyList.add(keys.get(i));
      }
    }
    return keyList;
  }
  /**
   * 异步Set方法, 不考虑执行结果.
   * @param key
   * @param value
   * @param expiredTime 单位:秒
   */
  public void set(String key, Object value, int expiredTime ) {
    if( 0 == expiredTime ) {
      persistentCache.put(key,value);
    }else if( expiredTime <= 60 ) {   //TTL少于1分钟
      repeatSubmitCache.put(key, value);
    }else if( expiredTime <= 300 ) {  //TTL少于5分钟
      captchaCache.put(key, value);
    }else {
      tokenCache.put(key, value);
    }
  }
  /**
   * 持久化保存
   * @param key
   * @param value
   */
  public void set(String key, Object value) {
    try {
      this.set(key, value, 0 );
    } catch (Exception e) {
    }
  }
  /**
   * 异步 Delete方法, 不考虑执行结果.
   */
  public void delete(final String key) {
    persistentCache.remove(key);
    captchaCache.invalidate(key);
    tokenCache.invalidate(key);
    //防止重复提交和token过期,不存在删除的方法
  }
  public void delete(final Collection<String> keys) {
    for( String key : keys ) {
      delete(key);
    }
  }
}

3、接下来就把所有使用到RedisCache的地方,改成Localcache 就可以了,由于代码篇幅较长,在此,就不演示了,


相关文章
|
30天前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
492 10
|
2月前
|
存储 缓存 NoSQL
Redis 核心知识与项目实践解析
本文围绕 Redis 展开,涵盖其在项目中的应用(热点数据缓存、存储业务数据、实现分布式锁)、基础数据类型(string 等 5 种)、持久化策略(RDB、AOF 及混合持久化)、过期策略(惰性 + 定期删除)、淘汰策略(8 种分类)。 还介绍了集群方案(主从复制、哨兵、Cluster 分片)及主从同步机制,分片集群数据存储的哈希槽算法。对比了 Redis 与 Memcached 的区别,说明了内存用完的情况及与 MySQL 数据一致性的保证方案。 此外,详解了缓存穿透、击穿、雪崩的概念及解决办法,如何保证 Redis 中是热点数据,Redis 分布式锁的实现及问题解决,以及项目中分布式锁
|
2月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
281 0
|
10月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
233 4
|
11月前
|
缓存 JavaScript 搜索推荐
vue中的一个内置组件Keep-Alive的作用及使用方法介绍——缓存不活动的组件实例
vue中的一个内置组件Keep-Alive的作用及使用方法介绍——缓存不活动的组件实例
712 1
|
8月前
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
252 36
|
9月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
565 26
|
10月前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
356 4
|
10月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
258 0
|
11月前
|
缓存 开发框架 移动开发
uni-app:下载使用uni&创建项目&和小程序链接&数据缓存&小程序打包 (一)
uni-app 是一个跨平台的开发框架,它允许开发者使用 Vue.js 来构建应用程序,并能够同时发布到多个平台,如微信小程序、支付宝小程序、H5、App(通过DCloud的打包服务)等。uni-app 的目标是通过统一的代码库,简化多平台开发过程,提高开发效率。 在这一部分中,我们将逐步介绍如何下载和使用uni-app、创建一个新的项目、如何将项目链接到小程序,以及实现数据缓存的基本方法。
286 0