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 都是對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章