zoukankan      html  css  js  c++  java
  • redis的java客户端StringRedisTemplate、RedisTemplate的用法及区别

    简单记录一下java处理redis的几种序列化策略,这里使用的环境是springboot 2.0.4

    springboot中提供了StringRedisTemplate和RedisTemplate两种序列化类,它们都只能读自己存的数据,即数据互不相通。

    主要区别如下:

    1、采用的序列化策略不同

    StringRedisTemplate采用的是String的序列化策略;RedisTemplate默认采用的是jdk的序列化策略

    2、存的数据形式不同

    StringRedisTemplate存的是字符串;RedisTemplate存的是字节数组,在redis-cli中看好像乱码

    3、使用范围不同

    StringRedisTemplate只能处理字符串类型的数据,如果存取复杂的对象,又不想做额外的处理,最好用RedisTemplate

    4、RedisTemplate可以根据需要设置序列化策略

    默认的是jdk的JdkSerializationRedisSerializer,常用的还有Jackson2JsonRedisSerializer等,下面说一下它俩的用法:

    默认jdk策略的RedisTemplate

    ... ...
    @Autowired
    private RedisTemplate redisTemplate;
    
    public void testSetUser() {
        User user=new User(1,"哈哈",20);
        redisTemplate.opsForValue().set("user",user);
    }
            
    public User testGetUser() {
        User user=(User)redisTemplate.opsForValue().get("user");
        return user;
    }

    使用redis-cli客户端查看如下:

     改成Jackson2策略的RedisTemplate

    @Configuration
    public class RedisConfig {
    
        @Bean
        @ConditionalOnMissingBean(name = "redisTemplate")
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            
            RedisTemplate<Object, Object> template = new RedisTemplate<>();
            
            //使用fastjson序列化
            Jackson2JsonRedisSerializer<Object> fastJsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
            //value的序列化采用fastJsonRedisSerializer
            template.setValueSerializer(fastJsonRedisSerializer);
            template.setHashValueSerializer(fastJsonRedisSerializer);
            
            //key的序列化采用StringRedisSerializer
            template.setKeySerializer(new StringRedisSerializer());
            template.setHashKeySerializer(new StringRedisSerializer());
     
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
    }
    public void testSetUser() {
        User user=new User(1,"哈哈",20);
        redisTemplate.opsForValue().set("user",user);
    }
        
    public User testGetUser() throws JsonProcessingException {
        //获取的是obj是java.util.LinkedHashMap类型
        Object obj = redisTemplate.opsForValue().get("user");
        ObjectMapper objectMapper = new ObjectMapper();
        //将map转化为json字符串
        String objStr = objectMapper.writeValueAsString(obj);
        User user = null;
        try {
            //将json字符串转化为对象
            user = objectMapper.readValue(objStr,User.class);
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return user;
    }    

    使用redis-cli客户端查看如下:

     关于Jdk与Jackson2序列化策略的说明: 

    1、使用jdk序列化对象必须实现序列化接口;使用Jackson2无需实现序列化接口(内部实现了)

    2、jdk序列化到redis中,key显示类似于乱码,Jackson2的key显示设置的值(创建RedisTemplate时设置了key的序列化)

    3、jdk的反序列化很好,直接转化为对象,Jackson2的读出来是Map,需要将Map转为json串,再转化为类对象

    4、如果使用Jackson2读出来直接转化为类对象,需要创建RedisTemplate时重新设置(后面补充上)

      

  • 相关阅读:
    swiper把左右箭头放到外侧
    vue复制地址栏链接:clipboard
    移动端适配rem.js
    vue登录弹框
    vue使用vue-aplayer(还用了SiriWave波形动画插件)
    vue 锚点定位,并平滑过渡
    vue引入scss报错:scss版本太高
    Kylin |3.Cube的优化
    Kylin |2.ModuleProject
    算法| 高级动态规划
  • 原文地址:https://www.cnblogs.com/javasl/p/13629149.html
Copyright © 2011-2022 走看看