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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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 就可以了,由于代码篇幅较长,在此,就不演示了,


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
21天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
22天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
1天前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
8 2
|
5天前
|
存储 缓存 NoSQL
解决Redis缓存击穿问题的技术方法
解决Redis缓存击穿问题的技术方法
19 2
|
5天前
|
缓存 NoSQL Redis
解决 Redis 缓存穿透问题的有效方法
解决 Redis 缓存穿透问题的有效方法
17 2
|
2天前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
6 0
|
1月前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
64 2
|
2月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
|
2月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
|
2月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
60 0
下一篇
无影云桌面