当前位置: 首页 > 知识库问答 >
问题:

使用redis的Spring Boot缓存,密钥为\xac\xed\x00\x05t\x00\x06

通迪
2023-03-14

我想使用Spring cache@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);
}

在我收到发帖请求

本地主机: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钥匙和spring数据绝地武士

如何设置@Cacheable的序列化程序,如StringRedisTemplate默认值:

public StringRedisTemplate() {
    RedisSerializer<String> 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")
}

共有3个答案

贝自怡
2023-03-14

就像mm759的回答:

>

  • 将RedisCacheManager定义为自己的bean。

    此代码将解决我的问题:

    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商店是这样的:

  • 孟杰
    2023-03-14

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

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

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

    >

  • 将RedisCacheManager定义为自己的bean。

    RedisTem板传递给RedisCacheManager的构造函数。

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

  • 钱稳
    2023-03-14

    创建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;
    }
    

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

    键是基于方法中的参数属性创建的,该属性被标注为可缓存。这就是spring从redis读取缓存值的方式。

     类似资料:
    • 问题内容: 我想使用Spring cache @Cacheable来管理器缓存。真正的缓存是redis。 我的代码是这样的: 在我有职位要求后 本地主机:8080 / post?key = key&value = value Redis服务器出现一个奇怪的密钥 spring缓存 如何设置@Cacheable的StringRedisTemplate之类的序列化器默认值: 我的application.

    • 在尝试向列添加一些内容后,我得到了 问题出在哪里?

    • Springboot 项目使用 RMapCache 保存数据,发现值出现 \x00 \#1 使用 StringRedisTemplate 保存数据,可用 \#2 使用 RMapCache 保存数据, 出现\x00, 不可用 大致结构如下 demo project springboot: 2.7.18 redisson: 3.26.1 / 3.21.0 redis: Redis-x64-5.0.14

    • 本文向大家介绍SpringBoot使用Redis缓存的实现方法,包括了SpringBoot使用Redis缓存的实现方法的使用技巧和注意事项,需要的朋友参考一下 (1)pom.xml引入jar包,如下:   (2)修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下:   (3)application.properties中配置Redis连接信息,如下:   (4)新建Redis

    • 我按照web上一些教程使用redis设置Spring缓存,

    • 问题内容: 我在for循环中解组json时遇到此错误。第一次通过循环可以很好地进行编组,但是在下一次迭代中,我会收到此错误。 我是golang的新手,并且此错误消息尚不清楚。有人可以解释在什么情况下会发生此错误,以及如何避免该错误。 问题答案: 谢谢你回答我的问题。 此错误是由于错误的json导致的,在此之前没有更多的故事了, 我有一个json.RawMessage类型的字段 详细信息 ,我有一个