@Service public class RedisUtil<T> { private RedisTemplate<String, T> redisTemplate; private ValueOperations<String, T> valueOperations; public RedisUtil(RedisTemplate<String, T> redisTemplate) { this.redisTemplate = redisTemplate; this.valueOperations = redisTemplate.opsForValue(); } // 堆代码 duidaima.com // 设置方法,通过该方法可以往Redis中放值 public void put(String key, T value) { this.valueOperations.set(key, value); } // 通过该方法可以获取key对于的value public T get(String key) { return this.valueOperations.get(key); } }如上所示,在RedisUtil添加了put和get方法,用于存放数据和获取数据。这样配置完后,就可以通过在使用的地方注入该类即可使用其方法。但是,在后续的排查Bug的时候就遇到了难题,默认情况下RedisTemplate使用的默认的序列化方法。
if (this.keySerializer == null) { this.keySerializer = this.defaultSerializer; defaultUsed = true; }如源码所示,当没有指定序列化时,使用的默认方法;其默认是一个JDK自带的序列化器。这个序列化器可以将任何实现了java.io.Serializable接口的对象序列化成字节数组,然后存储到Redis中。
@Configuration public class Config{ @Bean RedisUtil<Object> redistUtil(RedisConnectionFactory factory) { // 堆代码 duidaima.com // 初始化RedisTemplate RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); // 采用UTF-8实现字符串序列化方法, 用户key StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // 对value进行序列化 GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // 设置连接 template.setConnectionFactory(factory); // 设置序列化方法 template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); // 当template进行实例化后,对template进行初始化 template.afterPropertiesSet(); return new RedisDao<Object>(template); } }
在如上的代码中,实例化了template,并且使用StringRedisSerializer对key进行序列化;使用GenericJackson2JsonRedisSerializer对value进行序列化。在最后,使用了afterPropertiesSet方法初始化 Redis 连接池、RedisTemplate 等相关配置。这样可以保证 Redis 相关的配置在 bean 实例化后都已经完成。
通过以上的配置,在获取key的时候就能清晰展示,并且其value值经过序列化后,也可以请求看到里面的数据。就能实现key为:playback:status:182518930214498,和程序里面的key对应起来,方便日志排查。