spring-boot-starter-data-redis无效

时间:2016-10-27 10:18:51

标签: spring-boot

我使用spring boot 1.4.1,所以我的

中有spring-boot-starter-data-redis
  像这样的

pom.xml文件:

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

这是主要课程:

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        new SpringApplicationBuilder(App.class).web(true).run(args);
    }
}
  

这是测试的控制器类:

@RestController
public class CommonTestCtrl {
    @Autowired
    private RedisTemplate<Object, Object> template;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping(value = "/redisGet", method = RequestMethod.GET)
    public String getRedisValue(@RequestParam(value = "key", required = false) String key) {
        // not OK
        this.template.opsForValue().set(888888, 188);
        // OK
        this.stringRedisTemplate.opsForValue().set(key + "String", "stringRedisTemplate");
        return "";
    }
}

我发现this.template.opsForValue()。set(888888,188);不会保存任何东西到redis。为什么?

以下是CODE网址:https://github.com/eacdy/test2

  你可以帮帮我吗? THX很多。

2 个答案:

答案 0 :(得分:0)

我从spring-boot 1.3.7.RELEASE升级到1.5.10.RELEASE。工件名称已更改为:

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

要:

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

答案 1 :(得分:0)

我使用了spring-boot-data-redis-starter official sample中的代码,区别于:

@Autowired
private StringRedisTemplate template;

@Autowired
private RedisTemplate redisTemplate;

@Override
public void run(String... args) throws Exception {
    {
        ValueOperations<String, Integer> stringIntegerValueOperations = this.redisTemplate.opsForValue();
        String key = "hello";
        int v = 100;
        if (!this.redisTemplate.hasKey(key)) {
            System.out.println("write redisTemplate"); // stored in redis.
            stringIntegerValueOperations.set(key, v);
        }
        Set<String> keys = this.redisTemplate.keys("*");
        System.out.println(String.join(",", keys)); // 0 result.
    }
    {
        ValueOperations<String, String> ops = this.template.opsForValue();
        String key = "spring.boot.redis.test";
        if (!this.template.hasKey(key)) {
            ops.set(key, "foo"); // stored in redis server.
            System.out.println("write stringTemplate");
        }
        Set<String> keys = this.template.keys("*"); // all data even ones stored by redisTemplate
        System.out.println(String.join(",", keys));
    }

}

同时我启动了一个redis CLI来查看keys *给出的内容。

<强>结果

  1. 两个模板都存储了K V.
  2. RedisTemplate以二进制形式存储K(偶数字符串)(通常不可打印)
  3. RedisTemplate hasKey(K)确实给出了正确的结果,尽管RedisTemplate keys("*")给出0结果而不管键的类型(字符串或二进制)
  4. StringRedisTemplate键(&#34; *&#34;)列出以redis格式存储的所有键。
  5. redis CLI一旦触及二进制项目就会停止打印,这意味着在此项目之后即使是可打印的K V也会隐藏&#39;。
  6. <强>结论RedisTemplate无论哪种格式(StringRedisTemplate或原始格式:RedisTemplate)都将其K V保存在redis服务器中。虽然原始RedisTemplate键给出0结果,但Redis CLI keys *在第一个二进制K V处停止。这两个都使RedisTemplate看起来无法保存。

    <强>解决方案: RedisTemplate以二进制形式存储字符串K,这是不期望的。与StringRedisTemplate一样,实施StringObjectRedisTemplate而不是注入原始RedisTemplate,请使用StringObjectRedisTemplate