欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用RedisTemplate操作Redis遇到的坑

 更新時間:2023年12月20日 09:28:50   作者:trusause  
這篇文章主要介紹了Java使用RedisTemplate操作Redis遇到的坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

坑一

方法:

直接使用注入的方式       

@AutoWired
private RedisTemplate redisTemplate;

異?,F(xiàn)象:

key會出現(xiàn)亂碼

127.0.0.1:6379> keys *

1) "\xac\xed\x00\x05t\x00\x04name"

原因:

spring-data-redis的RedisTemplate<K, V>模板類在操作redis時默認(rèn)使用JdkSerializationRedisSerializer來進(jìn)行序列化

解決:

自定義RestTemplate,使用GenericJackson2JsonRedisSerializer解決序列化問題,注入的@AutoWired private RedisTemplate redisTemplate;其實是自定義的RestTemplate,

注意事項:

@Bean注入的bean是方法名,所以要目方法名寫成restTemplate,要么寫自定義的(如restTemplateInit()),在注入的時候就要用@Resources(name="restTemplateInit")

package com.example.demo.config;
 
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
 
@Data
@Component
@Configuration
@Slf4j
public class RedisConfig {
 
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
 
//        // 使用Jackson2JsonRedisSerialize 替換默認(rèn)序列化
//        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//
//        ObjectMapper objectMapper = new ObjectMapper();
//        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//
//        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
 
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
 
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
 
        // 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
 
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
 
        redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setEnableDefaultSerializer(true);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
 
}

坑二、用StringRedisTemplate和RedisTemplate取值賦值問題

redisTemplate.opsForValue().set("test1", "123");
redisTemplate.opsForValue().set("test2", ayUser);
//stringRedisTemplate.opsForValue().set("test3", "{\"name\":\"jack\"}");
//value設(shè)置成{\"name\":\"jack\"}這樣的json也沒用,需要帶上序列化的類,像下面這樣
stringRedisTemplate.opsForValue().set("test3", "{\"@class\":\"com.example.demo.model.AyUser\",\"id\":null,\"name\":\"shenzhen\",\"password\":null}");
 
System.out.println((String) redisTemplate.opsForValue().get("test1"));//123
System.out.println(stringRedisTemplate.opsForValue().get("test1"));//"123"
System.out.println((AyUser) redisTemplate.opsForValue().get("test2"));//AyUser(id=null, name=shenzhen, password=null)
System.out.println(redisTemplate.opsForValue().get("test3"));//AyUser(id=null, name=shenzhen, password=null)
System.out.println(stringRedisTemplate.opsForValue().get("test3"));//{"@class":"com.example.demo.model.AyUser","id":null,"name":"shenzhen","password":null}

使用上面注入的自定義的RedisTemplate都是可以反序列化成功的,如下!

但是使用的stringRedisTemplate雖然set的是返祖json格式的且?guī)蛄谢?,但是不能直接通過強轉(zhuǎn)實現(xiàn)(AyUser),需要通過com.alibaba.fastjson.JSON去反序列化

AyUser ayUser_3_0 = JSON.parseObject(stringRedisTemplate.opsForValue().get("test3_0"), AyUser.class);

通過ayUser_3_0.getName()就可以取到。

AyUser ayUser_2 = (AyUser) redisTemplate.opsForValue().get("test2");//ayUser_2.getName()
AyUser ayUser_3 = (AyUser) redisTemplate.opsForValue().get("test3");//ayUser_3.getName()

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論