美文网首页Java开发周更
springboot中redis的使用(二)

springboot中redis的使用(二)

作者: 昙花未现 | 来源:发表于2018-09-28 23:28 被阅读13次

    接上一次springboot中redis的使用

    自定义RedisTemplate的配置如下:

    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            // 设置连接工厂
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            // 设置key是String序列化
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            // 设置value是json对象序列化
            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);
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
            // 设置hash key是String序列化
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            // 设置hash value是jdk序列化
            redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
            // 设置默认策略
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    }
    

    RedisTemplate操作的简介

    opsForValue() VS boundValueOps(K key)

    • ops开头的操作可以操作多个不同的key
    • bound开头的操作只可以操作一个传入的key

    使用RedisTemplate递增或者增加操作

    由于Redis自身的机制是 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
    所以当key不存在时,调用increment方法后,通过ValueOperations.get(key)或BoundValueOperations.get()获取value时会由于无法序列化而报错。
    RedisTemplate是使用的JdkSerializationRedisSerializer序列化,序列化后的值包含了对象信息,版本号,类信息等,是一串字符串,所以无法进行数值自增操作。

    • 使用jackson2JsonRedisSerializer序列化value, 通过下面方法获取自增值。
    public long getIncrValue(final String key) {
            
        return redisTemplate.execute(new RedisCallback<Long>() {
            @Override
            public Long doInRedis(RedisConnection connection) throws DataAccessException {
                RedisSerializer<String> serializer=redisTemplate.getStringSerializer();
                byte[] rowkey=serializer.serialize(key);
                byte[] rowval=connection.get(rowkey);
                try {
                    String val=serializer.deserialize(rowval);
                    return Long.parseLong(val);
                } catch (Exception e) {
                    return 0L;
                }
            }
        });
    }
    

    参考衔接

    相关文章

      网友评论

        本文标题:springboot中redis的使用(二)

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