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

fre*_*ee斩 6 java spring caching redis

我想使用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);
}
Run Code Online (Sandbox Code Playgroud)

我有帖子请求之后

本地主机: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"
Run Code Online (Sandbox Code Playgroud)

Spring缓存

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

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

public StringRedisTemplate() {
    RedisSerializer<String> stringSerializer = new StringRedisSerializer();
    setKeySerializer(stringSerializer);
    setValueSerializer(stringSerializer);
    setHashKeySerializer(stringSerializer);
    setHashValueSerializer(stringSerializer);
}
Run Code Online (Sandbox Code Playgroud)

我的application.properties:

spring.redis.host=localhost
spring.redis.password=
spring.redis.port=6379
Run Code Online (Sandbox Code Playgroud)

的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")
}
Run Code Online (Sandbox Code Playgroud)

Roh*_*h K 8

创建一个redis模板

private RedisTemplate<String, ?> createRedisTemplateForEntity() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(getRedisConnectionFactory());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();

    return redisTemplate;
}
Run Code Online (Sandbox Code Playgroud)

为什么它会创建一个奇怪的字符串作为键?

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


mm7*_*759 4

Spring 的缓存功能允许使用不同的缓存实现。其中之一是 Redis。它可以与类一起使用RedisCacheManager。Spring 文档说:

如果 Redis 可用并已配置,则会RedisCacheManager自动配置。

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

  1. RedisCacheManager自行定义as bean。

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

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