当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Redis多缓存问题

贺光华
2023-03-14

我有一个简单的spring boot with redis应用程序,我正在构建该应用程序来缓存3个实体的主数据:电子邮件、产品和国家。我使用了spring boot starter依赖项

        <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-redis</artifactId>
              <version>2.1.3.RELEASE</version>
           </dependency>

我还在应用程序中使用启动配置。属性文件

  spring.cache.type=redis
  spring.redis.host=127.0.0.1
  spring.redis.port=6379
  spring.cache.redis.key-prefix=masterDataApp
  spring.cache.redis.use-key-prefix=true

可缓存方法包括

@Service
public class MasterDataService {
  @Cacheable(value="EMAILS")
    public List<Email> getEmails() {
        System.out.println(" Loading Data from getEmails");
        return  emails;
    }

    @Cacheable(value="PRODUCTS")
    public List<Product> getProducts() {
        System.out.println(" Loading Data from getProducts");
        return  products;
    }

    @Cacheable(value="COUNTRIES")
    public List<Country> getCountries() {
        System.out.println(" Loading Data from getCountries");
        return  countries;
    }
}

问题是,一旦我从这个类加载其中一个方法,其他两个方法返回与第一个方法相同的数据,即使它们返回不同的列表,并且具有不同的可缓存注释值。我做错了什么?

共有1个答案

周峻
2023-03-14

解决方案是有一个keygeneratory。并将其添加到方法的注释中。

这有助于分离缓存


    @Cacheable(value="PRODUCTS", keyGenerator = "customKeyGenerator")
    public List<Product> getProducts() {
        System.out.println(" Loading Data from getProducts");
        return  products;
    }

    @Cacheable(value="COUNTRIES", keyGenerator = "customKeyGenerator")
    public List<Country> getCountries() {
        System.out.println(" Loading Data from getCountries");
        return  countries;
    }

    @Bean("customKeyGenerator")
    public KeyGenerator keyGenerator() {
        return new CustomKeyGenerator();
    }

public class CustomKeyGenerator implements KeyGenerator {

    @Override
    public Object generate(Object target, Method method, Object... params) {
        String key = target.getClass().getSimpleName() + "_"
                + method.getName() + "_"
                + StringUtils.arrayToDelimitedString(params, "_");
        System.out.println(key);
        return key;
    }
}


但是问题仍然是注释中value的值是什么,因为它没有隔离缓存

 类似资料:
  • 主要内容:缓存穿透,缓存击穿,缓存雪崩在实际的业务场景中,Redis 一般和其他数据库搭配使用,用来减轻后端数据库的压力,比如和关系型数据库 MySQL 配合使用。 Redis 会把 MySQL 中经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到 MySQL 中去查询了,而是直接获取 Redis 中的缓存数据,从而降低了后端数据库的读取压力。如果说用户查询的数据 Redis 没有,此时用户的查询请求就会转到

  • 我是flutter应用程序开发的初学者。当我在模拟器上运行我的flutter默认项目代码时,我面临这个问题: 在调试模式下在IA仿真器上的AOSP上启动lib\main.dart...运行Gradle任务'assembleDebug'... 失败:生成失败,出现异常。 错误:无法打开设置文件“C:\Users\Administrator\StudioProjects\myapp\android\s

  • 我使用Spring缓存抽象,定义了多个缓存。有时,当数据更改时,我想逐出多个缓存。是否可以使用Spring的CacheExit注释逐出多个缓存?

  • 主要内容:本节引言:,1.缓存的分类:,2.为WebView开启缓存功能,3.删除WebView的缓存数据,4.示例代码下载:,5.本节小结:本节引言: 现在很多门户类信息网站,比如虎嗅,ifanr,钛媒体等等的APP,简单点说是信息阅读类的APP,很多 都是直接嵌套一个WebView用来显示相关资讯的,这可能就涉及到了WebView的缓存了! 所谓的页面缓存 就是指:保存加载一个网页时所需的HTML,JS,CSS等页面相关的数据以及其他资源,当没网的时候或者 网络状态较差的时候,加载本地保存好

  • 我正在使用链接到S3桶的AWS云前线来托管静态(反应)网站。除了我将更改的文件上传到桶中之外,一切似乎都正常。我知道设计云前线会缓存文件,你必须使更改的文件无效,以便云前线尽快获取新的更改。然而,每当我浏览网站(在不同的设备上)时,我仍然会得到旧版本的文件。有时,我会看到网页的最新版本,但后来当我浏览到同一个页面时,它会得到旧版本(即使在清除缓存或隐姓埋名浏览之后)?!非常奇怪。 关于我的设置,我