• [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

  • 相关阅读:
    FlowDroid安装初体验
    动静态库的使用与制作
    分布式ID生成系统之雪花算法详解
    【vue实战项目】通用管理系统:登录页
    QT+OSG/osgEarth编译之十六:libxml2+Qt编译(一套代码、一套框架,跨平台编译,版本:libxml2-2.10.3)
    pic 回归线性模型 多元回归分析 线性回归分析 lasso logistic
    k8s手撕架构图+详解
    快速从0-1完成聊天室开发——环信ChatroomUIKit功能详解
    【python学习】基础篇-常用函数-sorted() 对可迭代对象进行排序
    OS | 【一 概述】强化阶段 —— 应用题总结
  • 原文地址:https://blog.csdn.net/HeyVIrBbox/article/details/127789451