redis在存储数据的时候会有乱码前缀。
分析:
之所以会有这个乱码前缀是因为,redis序列化的问题。
默认使用的是JDK序列化,我们要改成字符串序列化
测试代码:
package com.lc.redistest.justtest;
import com.lc.redistest.RedisTestApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.concurrent.TimeUnit;
/**
* @Author LC
* @Date 2021/7/28
*/
@Component
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = RedisTestApplication.class)
public class JustTest {
@Autowired
private RedisTemplate redisTemplate;
// 1、添加 @Test注解 包路径是 import org.junit.Test;注意不要导错包,
// 2、方法类型必须是 void,没有返回值
// 3、注意一个坑,和本Test单元测试同类中的其他测试方法也不能添加带返回值的方法,方法类型也必须是void
@Test
public void test() {
// RedisTemplate redisTemplate = new RedisTemplate();
Object execute = redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
operations.opsForValue().set("key1", "set1", 100L, TimeUnit.SECONDS);
Object key1 = operations.opsForValue().get("key1");
return key1;
}
});
System.out.println(execute.toString());
}
}
##解决方法
方法一:设定Redistemplate的类型
@Autowired
private RedisTemplate<String, String> redisTemplate;
但是这样会有局限性,就相当于注入的是StringRedisTEmplate了
方法二:自定义一个Redistemplate的配置类
自定义一个Redistemplate的配置类,然后在正常注入是用。
package com.lc.redistest.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.*;
import java.time.Duration;
/**
* @Author LC
* @Date 2021/7/28
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
{
RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
template.setConnectionFactory(redisConnectionFactory);
//使用JSON格式的序列化,保存
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory)
{
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ZERO)
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}