Java开发周更

springboot中redis的使用(二)

2018-09-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)

使用RedisTemplate递增或者增加操作

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

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;
            }
        }
    });
}

参考衔接

上一篇下一篇

猜你喜欢

热点阅读