在Spring启动时启用Redis缓存

时间:2017-01-14 06:21:33

标签: spring-boot redis spring-data-redis spring-cache

我的弹簧启动项目有以下配置。

@SpringBootApplication
@EnableTransactionManagement
@EnableCaching
@EnableScheduling
@EnableAsync
public class Application {

    String redisHost = "localhost";
    int redisPort = 6379;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(redisHost);
        factory.setPort(redisPort);
        factory.setUsePool(true);
        return factory;
    }
    @Bean
    RedisTemplate<Object, Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }
    @Bean
    public CacheManager cacheManager() {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate());
        return cacheManager;
    }
}

此外,我对pom的maven依赖。

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

我在定义端口上的本地计算机上运行了一个单独的redis服务器。另外在我的服务类中,我有@Cacheable,@ CachePut等注释来支持缓存。

我可以毫无错误地启动Spring启动应用程序,CRUD操作也可以。但似乎它没有使用定义的redis缓存。我使用了#redi桌面管理器&#39;浏览工具,无法在redis上找到任何数据。此外,我尝试通过redis cli命令监视redis服务器&#39; monitor&#39;,我无法在监视器上看到任何更改。

所以我认为redis缓存仍然不能用于我的spring启动应用程序。有人可以帮我弄清楚这个问题吗?

我正在使用spring boot版本1.4.2.RELEASE

谢谢!

4 个答案:

答案 0 :(得分:9)

鉴于您正在使用 Spring Boot ,因为 Spring Boot 提供&#34; 自动配置&,因此您的大部分Redis配置都是不必要的#34;支持Redis,包括data sourcecaching provider

您还没有具体说明您正在使用的 Spring Boot 版本(例如1.5.0.RC1)来运行您的应用程序,或者您的应用程序中是否有application.properties #39;类路径,如果你明确指定spring.cache.type(设置为&#34; redis&#34;以外的其他东西)可能会有所不同。

但是,一般情况下,我的Redis或 Spring Cache @Configuration类并没有太多错误。但是,如果没有明确设置cacheManager.setUsePrefix(true),似乎确实存在问题。当我设置此RedisCacheManager属性(&#39; usePrefix`)时,一切都按预期工作。

我不是(Spring Data)Redis专家,所以我不确定为什么需要这样做。但是,我的测试配置基于 Spring Boot&#39> <{em> "auto-configuration" support for Redis caching以及您的@Configuration&#34;应用程序&#34;上课,如上所示。

并且,因为您可以消除大部分显式配置并使用 Spring Boot "auto-configuration" support for Redis作为数据源,所以我添加了"AutoRedisConfiguration" { {1}}我的测试类的类。即你可以使用它来配置Redis而不是我的其他@Configuration类(@Configuration),它使用你的配置+ 修复

以下是完整的测试示例......

"CustomRedisConfiguration"

希望这有帮助!

干杯, 约翰

答案 1 :(得分:0)

我正在使用Spring Boot 2.0,它使用Redis非常简单,用于简单的缓存目的。

  1. 使用@EnableCaching注释Spring引导应用程序
  2. 在您的应用程序中。属性具有这些属性

    spring.cache.type = redis redis.host.url = redis.host.port =

  3. 使用@Cacheable注释方法。

就是这样!

如果您使用的是AWS Elasticache,并且已经检查了传输中的加密,则需要添加RedisConfiguration文件以将ssl设置为true。

Spring Boot 2.0现在使用LettuceConnectionFactory。

要执行上述操作,只需添加一个类,并使用@Configuration批注对其进行标记,然后添加以下bean

@Bean
  public LettuceConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
    configuration.setHostName(redisHost);
    configuration.setPort(redisPort);
    return new LettuceConnectionFactory(configuration,            LettuceClientConfiguration.builder().useSsl().disablePeerVerification().build());
  }

答案 2 :(得分:0)

您可以使用redis-cli中的命令检查redis中密钥的存在:密钥*

如果有您的钥匙,就可以了:)

答案 3 :(得分:0)

您的类的方法应为@Cacheable。与@CachePut一起使用时,应将@CacheEvict与键及其delete方法的值一起使用以刷新资源。在application.properties文件中还需要主机,端口,类型和密码。

`spring.redis.password= password`

`spring.cache.type=redis`
`spring.redis.host=localhost`
`spring.redis.port=6379`

还根据要求添加其他一些属性。

`spring.cache.redis.time-to-live=600000`
`spring.cache.redis.cache-null-values=false`
`spring.cache.redis.use-key-prefix=true