美文网首页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