首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-boot-starter data-redis不起作用

spring-boot-starter data-redis不起作用
EN

Stack Overflow用户
提问于 2016-10-27 10:18:50
回答 2查看 5.3K关注 0票数 4

我使用spring 1.4.1,所以我的spring-boot-starter-data-redis在我的

这样的pom.xml文件:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

这是主要的课程:

代码语言:javascript
复制
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        new SpringApplicationBuilder(App.class).web(true).run(args);
    }
}

这是用于测试的控制器类:

代码语言:javascript
复制
@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。为什么?

下面是代码URL:https://github.com/eacdy/test2

你能帮我一下吗?经常这样。

EN

回答 2

Stack Overflow用户

发布于 2018-02-20 16:53:46

我从spring 1.3.7.RELEASE升级到1.5.10 upgraded。

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
</dependency>

至:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
票数 0
EN

Stack Overflow用户

发布于 2018-03-17 09:04:05

我使用了来自弹簧-引导-数据-红-启动官方样本的代码,有一个不同之处:

代码语言:javascript
复制
@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以查看keys *提供了什么。

结果

  1. 这两个模板都存储了它们的K。
  2. RedisTemplate以二进制形式存储K(偶数字符串)(大部分不能打印)
  3. RedisTemplate hasKey(K)确实给出了正确的结果,尽管RedisTemplate keys("*")给出了0的结果,而不管键的类型(字符串还是二进制)。
  4. StringRedisTemplate键(“*”)列出了存储在redis中的所有键。
  5. redis停止打印,一旦它触及一个二进制项目,这意味着即使是可打印的K之后,这个项目将‘隐藏’。

结论结论RedisTemplate,无论是StringRedisTemplate还是原始RedisTemplate,其K均保存在redis服务器上。虽然原始的RedisTemplate键给出了0的结果,而且Redis keys *在二进制K开始时停止,但这两种情况都使它看起来像是RedisTemplate无法保存。

解决方案: RedisTemplate以不需要的二进制形式存储字符串K。像StringRedisTemplate一样,实现一个StringObjectRedisTemplate,而不是注入一个原始RedisTemplate,而是使用StringObjectRedisTemplate

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40282057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档