使用redis进行Spring启动缓存,密钥有\ xac \ xed \ x00 \ x05t \ x00 \ x06

我想使用Spring缓存@Cacheable来管理缓存。 真正的缓存是redis。

我的代码是这样的:

@PostMapping("/post") @CachePut(value = "abc", key = "#key") public String putInRedis(@RequestParam String key, @RequestParam String value) { saveInDB(key, value); return value; } @GetMapping("/get") @Cacheable(value = "abc", key = "#key") public String queryRedis(@RequestParam String key) { return findByKey(key); } 

我有post请求之后

本地主机:8080 /后键=键和值=价值?

redis服务器看起来很奇怪

 127.0.0.1:6379> keys * 1) "abc:\xac\xed\x00\x05t\x00\x03key" 127.0.0.1:6379> GET "abc:\xac\xed\x00\x05t\x00\x03key" "\xac\xed\x00\x05t\x00\x05value" 

Spring缓存

奇怪,Redis的琴键与弹簧-数据jedis

如何将@ Cacheable的Serializer设置为StringRedisTemplate默认值:

 public StringRedisTemplate() { RedisSerializer stringSerializer = new StringRedisSerializer(); setKeySerializer(stringSerializer); setValueSerializer(stringSerializer); setHashKeySerializer(stringSerializer); setHashValueSerializer(stringSerializer); } 

我的application.properties:

 spring.redis.host=localhost spring.redis.password= spring.redis.port=6379 

的build.gradle

 group 'io.freezhan' version '1.0-SNAPSHOT' buildscript { repositories { maven { url 'https://plugins.gradle.org/m2/' } } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE' } } task wrapper(type: Wrapper) { gradleVersion = '2.13' distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip" } apply plugin: 'java' apply plugin: 'spring-boot' sourceCompatibility = 1.5 repositories { mavenCentral() } dependencies { compile("org.springframework.boot:spring-boot-starter-web") { exclude module: "spring-boot-starter-tomcat" } compile("org.springframework.boot:spring-boot-starter-data-redis") compile("org.springframework.boot:spring-boot-starter-jetty") compile("org.springframework.boot:spring-boot-starter-actuator") compile 'org.projectlombok:lombok:1.16.10' testCompile("junit:junit") } 

Spring的缓存 – function允许使用不同的缓存 – 实现。 其中一个是Redis。 它可以与RedisCacheManagerRedisCacheManager 。 Spring文档说:

如果Redis可用且已配置, RedisCacheManager自动配置RedisCacheManager

这是我建议影响Redis的方法 – 缓存 – 集成:

  1. RedisCacheManager定义为您自己的bean。

  2. RedisTemplate传递给RedisTemplate的构造RedisCacheManager

我在互联网上找到了一个使用prigrammmatic配置的例子。 还有一个使用基于XML的配置的示例 。

像mm759的答案:

  1. 将RedisCacheManager定义为您自己的bean。

    1. 将RedisTemplate传递给RedisCacheManager的构造函数。

这段代码将解决我的问题:

 package io; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * Created by freezhan on 16/9/5. */ @Configuration public class CacheConfig { @Autowired private StringRedisTemplate redisTemplate; @Bean public CacheManager cacheManager() { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); return cacheManager; } } 

和redis商店这样:

在此处输入图像描述

创建一个redis模板

 private RedisTemplate createRedisTemplateForEntity() { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(getRedisConnectionFactory()); redisTemplate.setHashValueSerializer(new StringRedisSerializer()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } 

为什么创作是一个奇怪的钥匙?

密钥是根据方法中存在的参数属性创建的,该参数属性被注释为可缓存。 这就是spring从redis读取缓存值的方式。