StringRedisTemplate和RedisTemplate

一、spring-data-redis

1、spring-data-redis是什么

spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都属于redis的java客户端,他们之间是无法兼容的,如果你在一个项目中使用了jedis,然后后来决定弃用掉改用jdbc-redis就比较麻烦了。而spring-data-redis提供了redis的java客户端的抽象,在开发中可以忽略掉切换具体的客户端所带来的影响,而且他本身就属于spring的一部分,比起单纯的使用jedis,更加稳定,管理起来更加自动化。

2、spring-data-redis的特性

1)自动管理连接池,提供了一个高度封装的RedisTemplate类

2)针对jedis客户端的大量api进行了归类封装,把同一类型的操作封装成了Operation接口,支持redis中的五种数据类型的操作。

3)针对数据的"序列化与反序列化"提供了多种可以选择的策略(RedisSerializer)

  • JdkSerializationRedisSerializer:当需要存储java对象时使用
  • StringRedisSerializer:当需要存储string类型的字符串时使用
  • JacksonJsonRedisSerializer:将对象序列化成json的格式存储在redis中,需要jackson-json工具的支持

二、StringRedisTemplate和RedisTemplate

1、RedisTemplate和StringRedisTemplate区别

1)StringRedisTemplate继承RedisTemplate。

2)RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出这个类是做什么的 ,它跟JdbcTemplate一样封装了对Redis的一些常用的操作,当然StringRedisTemplate跟RedisTemplate功能类似那么肯定就会有人问,为什么会需要两个Template呢,一个不就够了吗?其实他们两者之间的区别主要在于他们使用的序列化类是不同的。

  • StringRedisTemplate的API假定所有的数据类型化都是字符类型,即key和value都是字符串类型。默认采用的是String的序列化策略,即StringRedisSerializer,保存的key和value都是采用此策略序列化保存的。
  • RedisTemplate默认采用的是JDK的序列化策略,即JdkSerializationRedisSerializer,保存的key和value都是采用此策略序列化保存的。
2、RedisTemplate常用方法

redisTemplate有两个方法经常用到,一个是opsForXXX一个是boundXXXOps,XXX是value的类型,前者获取到一个Opercation,但是没有指定操作的key,可以在一个连接(事务)内操作多个key以及对应的value;后者会获取到一个指定了key的operation,在一个连接内只操作这个key对应的value。
 
redisTemplate的5个常用方法如下:

redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

看下ValueOperation和BoundValueOperation的区别

ValueOperations valueOperations = redisTemplate.opsForValue();
BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps("key");

三、具体使用

spring-boot-autoconfigure-2.0.4.RELEASE.jar包中RedisAutoConfiguration.java已经自动声明了两个redis操作bean:

RedisAutoConfiguration.java源码:

@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

因此我们只要在使用的地方注入使用即可:

@Autowired
StringRedisTemplate stringRedisTemplate; //操作 k-v 字符串
@Autowired
RedisTemplate redisTemplate;  //k- v 都是对象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章