我使用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很多。
答案 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 *
给出的内容。
<强>结果强>:
RedisTemplate
以二进制形式存储K(偶数字符串)(通常不可打印)RedisTemplate hasKey(K)
确实给出了正确的结果,尽管RedisTemplate keys("*")
给出0结果而不管键的类型(字符串或二进制) <强>结论强>:
RedisTemplate
无论哪种格式(StringRedisTemplate
或原始格式:RedisTemplate
)都将其K V保存在redis服务器中。虽然原始RedisTemplate
键给出0结果,但Redis CLI keys *
在第一个二进制K V处停止。这两个都使RedisTemplate
看起来无法保存。
<强>解决方案:强>
RedisTemplate以二进制形式存储字符串K,这是不期望的。与StringRedisTemplate
一样,实施StringObjectRedisTemplate
而不是注入原始RedisTemplate
,请使用StringObjectRedisTemplate
。