• [Redis] Spring Boot 使用Redis---RedisTemplate泛型约束乱码问题


    ✨✨个人主页:沫洺的主页

    📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                               📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

                               📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏     

    💖💖如果文章对你有所帮助请留下三连✨✨

    🎨RedisTemplate泛型使用

    RedisTemplate与StringRedisTemplate底层对象是同一个

     RedisTemplate泛型不同,对象不同

    既然是泛型就可以指定类型,通常K为String,V为对象或其他类型

    User类(可序列化)

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @Builder
    5. public class User implements Serializable {
    6. private String name;
    7. private int age;
    8. }

    @Autowired 与 @Resource 区别

    • @Autowired注解由Spring提供,只按照byType注入;
    • @Resource注解由J2EE提供,默认按照byName自动注入,按照名字如果找不到,再按照类型byType去找
    • @Autowired默认按类型进行装配,
    • @Resource默认按照名称进行装配。
    1. //@Autowired 按类型找不到会报错,找不到bean
    2. //@Resource 按名称redisTemplate找,若找不到按照类型也找不到则报错
    3. @Resource(name = "redisTemplate")//不设置name默认安装方法名找
    4. private RedisTemplate redisTemplate;

    因此使用@Resource(name = "redisTemplate")来注入bean

    1. @Resource(name = "redisTemplate")
    2. private RedisTemplate redisTemplate;
    3. @Test
    4. public void test1(){
    5. User user1 = User.builder().name("张三").age(23).build();
    6. //会出现乱码问题
    7. redisTemplate.opsForValue().set("user1", user1);
    8. //可以正常获取
    9. User user = redisTemplate.opsForValue().get("user1");
    10. System.out.println(user);
    11. }

    乱码问题分析

    StringRedisTemplate不会乱码是因为底层使用的是StringRedisSerializer序列化工具

    RedisTemplate乱码原因是没有使用序列化工具,底层默认使用原生的jdk序列化工具JdkSerializationRedisSerializer从而乱码

     具体原因就是出在JdkSerializationRedisSerializer上

    解决乱码问题

    自定义RedisConfig

    1. @Configuration
    2. public class RedisConfig {
    3. @Bean
    4. public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    5. RedisTemplate template = new RedisTemplate<>();
    6. template.setConnectionFactory(redisConnectionFactory);
    7. //配置序列化工具
    8. //json序列化工具 对象使用此序列化
    9. Jackson2JsonRedisSerializer jsonSerializer = new Jackson2JsonRedisSerializer(Object.class);
    10. //类型转换
    11. ObjectMapper objectMapper = new ObjectMapper();
    12. //设置所有属性可见性序列化
    13. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    14. //默认键入全包名
    15. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    16. jsonSerializer.setObjectMapper(objectMapper);
    17. //string序列化工具 string使用此序列化
    18. StringRedisSerializer stringSerializer = new StringRedisSerializer();
    19. //设置KEY/key的序列化工具为stringSerializer
    20. template.setKeySerializer(stringSerializer);
    21. //设置值的序列化工具为jsonSerializer
    22. template.setValueSerializer(jsonSerializer);
    23. //设置hash的小key的序列化工具为stringSerializer
    24. template.setHashKeySerializer(stringSerializer);
    25. //设置hash的值的序列化工具为jsonSerializer
    26. template.setHashValueSerializer(jsonSerializer);
    27. template.afterPropertiesSet();
    28. return template;
    29. }
    30. }

    对象使用json序列化工具Jackson2JsonRedisSerializer

    String还是使用StringRedisSerializer序列化工具

    之所以我们自定义的RedisTemplate类型的bean会覆盖官方底层源码的bean,是因为官方设置了当没有注册redistemplate这个bean时,才使用此官方的bean

    @ConditionalOnMissingBean( name = {"redisTemplate"})

     解决乱码问题后再执行test1

  • 相关阅读:
    复杂高维医学数据挖掘与疾病风险分类研究
    【计算机网络】IP协议
    【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+差分)
    Win11暂停更新点不了怎么办?Win11暂停更新是灰色的如何解决?
    nacos实现Java和.NetCore的服务注册和调用
    学习开发一个RISC-V上的操作系统(汪辰老师) — 环境配置
    RocketMQ源码阅读(七)ConsumeQueue和IndexFile
    Django之视图层
    远程代码执行漏洞
    Git使用学习记录(一、前置知识)
  • 原文地址:https://blog.csdn.net/HeyVIrBbox/article/details/127789451