使用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。 它可以与RedisCacheManager
类RedisCacheManager
。 Spring文档说:
如果Redis可用且已配置,
RedisCacheManager
自动配置RedisCacheManager
。
这是我建议影响Redis的方法 – 缓存 – 集成:
-
将
RedisCacheManager
定义为您自己的bean。 -
将
RedisTemplate
传递给RedisTemplate
的构造RedisCacheManager
。
我在互联网上找到了一个使用prigrammmatic配置的例子。 还有一个使用基于XML的配置的示例 。
像mm759的答案:
-
将RedisCacheManager定义为您自己的bean。
- 将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读取缓存值的方式。