自定义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;
}
}
});
}
参考衔接
网友评论