StringRedisTemplate和RedisTemplate的区别和联系

两者之间的联系:

StringRedisTemplate和RedisTemplate都是spring框架下的reids操作工具,springboot项目使用时只需使用maven依赖包spring-boot-starter-data-redis即可,使用时将其注册为组件,如

@Autowired
StringRedisTemplate  stringRedisTemplate;
//或者
//@Autowired
//RedisTemplate  redisTemplate;

或者自己封装一层类,并且用@Service等将其注册为组件

又或者手动装载类,如

RedisTemplate redisTemplate= (RedisTemplate)SpringContextUtil.getBean("redisTemplate",RedisTemplate.class);

另外,我们看StringRedisTemplate的源码会发现,它继承了RedisTemplate类,并对其序列化方式做了修改.

/**
 * String-focused extension of RedisTemplate. Since most operations against Redis are String based, this class provides
 * a dedicated class that minimizes configuration of its more generic {@link RedisTemplate template} especially in terms
 * of serializers.
 * 

* Note that this template exposes the {@link RedisConnection} used by the {@link RedisCallback} as a * {@link StringRedisConnection}. * * @author Costin Leau */ public class StringRedisTemplate extends RedisTemplate { /** * Constructs a new StringRedisTemplate instance. {@link #setConnectionFactory(RedisConnectionFactory)} * and {@link #afterPropertiesSet()} still need to be called. */ public StringRedisTemplate() { RedisSerializer stringSerializer = new StringRedisSerializer(); setKeySerializer(stringSerializer); setValueSerializer(stringSerializer); setHashKeySerializer(stringSerializer); setHashValueSerializer(stringSerializer); } /** * Constructs a new StringRedisTemplate instance ready to be used. * * @param connectionFactory connection factory for creating new connections */ public StringRedisTemplate(RedisConnectionFactory connectionFactory) { this(); setConnectionFactory(connectionFactory); afterPropertiesSet(); } protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) { return new DefaultStringRedisConnection(connection); } }

两者之间的区别:

       从上面的StringRedisTemplate的实现方式和RedisTemplate实现源码中我们就能看出,两者使用的序列化方式有所不同,一种是String的序列化策略(StringRedisTemplate),一种是默认的JDK的序列化策略(RedisTemplate)。StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

 RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示。当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,RedisTemplate就无法获取导数据,这个时候获取到的值就是NULL。这个时候StringRedisTempate就派上了用场。当Redis当中的数据值是以可读的形式显示出来的时候,只能使用StringRedisTemplate才能获取到里面的数据。所以当你使用RedisTemplate获取不到数据的时候请检查一下是不是Redis里面的数据是可读形式而非字节数组。

        因此,当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可,但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

 

参考资料:

https://www.jianshu.com/p/55616179c9d5

https://www.cnblogs.com/MyYJ/p/10778874.html

你可能感兴趣的:(redis,redis)