美文网首页
springboot-redis泛型支持

springboot-redis泛型支持

作者: rock_fish | 来源:发表于2018-05-31 13:48 被阅读0次

传送门:


网上找了一些springboot操作Redis的文章,
这篇文章关于序列化有大概的讲解:https://blog.csdn.net/neosmith/article/details/46800235
redisTemplate 的基本使用:https://blog.csdn.net/ruby_one/article/details/79141940
GenericJackson2JsonRedisSerializer :https://blog.csdn.net/asdfsadfasdfsa/article/details/79962056 (这个没有测试成功!)
看到的文章中对于json方式序列化的使用基本是2中方式:
方式1.每种类型写一个Bean,比如:

@Bean
public RedisTemplate<String,Person> redisTemplate(RedisConnectionFactory factory){
...
}
@Bean
public RedisTemplate<String,School> redisTemplate(RedisConnectionFactory factory){
...
}

方式2.

@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
...
}
或者
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory){
...
}

每个get***方法得到的结果需要自己做一次强制类型转换,将Object转换为我们需要的类型.

以下这种写法实现了泛型的方式,解决了上述2个问题:

application.properties中增加redis的配置信息

spring.redis.host=10.9.36.120
spring.redis.password=****
spring.redis.port=6379
spring.redis.database=1

redis配置类

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    /*//缓存管理器
    @Bean
    public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //设置缓存过期时间
        cacheManager.setDefaultExpiration(10000);
        return cacheManager;
    }*/

    @Bean
    @ConditionalOnMissingBean(StringRedisTemplate.class)
    public StringRedisTemplate stringRedisTemplate(
            RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
//因为我的场景中Key都是普通的String,所以这里写死了String
    @Bean
    public <String,V>RedisTemplate<String, V> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, V> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        setSerializer(template);
        template.afterPropertiesSet();
        return template;
    }
    private void setSerializer(RedisTemplate template){
        //key的序列化器为string
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        //value的序列化为json格式,使用Jackson2JsonRedisSerializer
        @SuppressWarnings({ "rawtypes", "unchecked" })
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setDefaultSerializer(jackson2JsonRedisSerializer);//先 全部为json序列化
        template.setKeySerializer(stringRedisSerializer);//key为String序列化
        template.setHashKeySerializer(stringRedisSerializer);//hashKey为String序列化
    }
}

测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest( classes = MainApplication.class)
public class TestRedis {

    @Resource
    RedisTemplate<String,Student> redisTemplateStudent;
    @Resource
    RedisTemplate<String,Person> redisTemplatePerson;
    @Test
    public void TestReidsStudent(){
        ValueOperations<String, Student> valueOperations = redisTemplateStudent.opsForValue();
        Student student = new Student();
        student.setId(1L);
        student.setName("zhansan");
        student.setAge(12);
        valueOperations.set(student.getName(),student);

        Student result = valueOperations.get(student.getName());
        System.out.println(result);

    }
    @Test
    public void TestReidsPerson(){
        ValueOperations<String, Person> valueOperations = redisTemplatePerson.opsForValue();
        Person person = new Person();
        person.setName("zhansan");
        person.setAge(12);
        valueOperations.set(person.getName(),person);

        Person result = valueOperations.get(person.getName());
        System.out.println(result);

    }
}

查看结果:


image.png

相关文章

  • springboot-redis泛型支持

    传送门: ClassLoader串烧 阿里开源框架JVM-Sandbox源码梳理 Spring大观园,我有过的困惑...

  • 泛型

    一.泛型的概念 二.支持泛型的类 不支持泛型的类 支持泛型的类 三.通配符 1.? extends 2.? sup...

  • Kotlin 泛型

    Kotlin 支持泛型, 语法和 Java 类似。例如,泛型类: 泛型函数: 类型变异 Java 的泛型中,最难理...

  • Java自学-泛型 支持泛型的类

    Java 如何设计支持泛型的类 步骤 1 : 不支持泛型的Stack 以Stack栈为例子,如果不使用泛型当需要一...

  • 泛型

    与Java泛型相同,Kotlin同样提供了泛型支持。对于简单的泛型类、泛型函数的定义,Kotlin 与 Java ...

  • Java基础

    1、泛型 jdk1.5增加了泛型支持很大程度是为了让集合记住其元素的类型。知识点:泛型类、泛型接口、类型通配符、泛...

  • TypeScript(三)

    五. 泛型 泛型定义:泛型就是解决类、接口、方法的复用性,以及对不特定数据类型的支持。 可以支持不特定的数据类型,...

  • 泛型相关总结

    泛型在设计模式和源码分析中有重要的写法支持,学习设计模式和源码分析必须掌握泛型的使用原理 泛型 概述 什么是泛型?...

  • 19.AutoMapper 之开放式泛型(Open Generi

    开放式泛型(Open Generics) AutoMapper可以支持开放式泛型的映射。为开放式泛型创建映射: 你...

  • 九、泛型

    九、泛型 尽量不要写这种有能与泛型方法重载的代码,有迷惑性 限定传入 T 的类型 泛型数组 Java 不支持泛型类...

网友评论

      本文标题:springboot-redis泛型支持

      本文链接:https://www.haomeiwen.com/subject/zzjqsftx.html