Spring 中使用 Redis

引入

  • Maven
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.0.9.RELEASE</version>
</dependency>

連接 Redis
使用 Lettuce 或者 Jedis

  • Lettuce Connector
@Configuration
class AppConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
    }
}
  • Jedis Connector
@Configuration
class AppConfig {

    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
    }
}

使用 RedisTemplate
Spring 提供了 RedisTemplate 類來操作 Redis,它高度抽象了 Redis 的各種操作, 根據不同的數據類型提供了對應的 operation,常用的如

  • ValueOperations 字符串
  • ListOperations 列表
  • SetOperations 集合
  • HashOperations 哈希表

因爲我們通常使用 String 作爲 key 和 value,所以 Spring 提供了 StringRedisTemplate 類,該類使用 StringRedisSerializer 進行序列化.

一個例子:

public class Example {

    @Autowired
    private StringRedisTemplate redisTemplate;

    public void addLink(String userId, URL url) {
        redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
    }
}

序列化
Spring 提供了多種序列化方式

  • JdkSerializationRedisSerializer RedisTemplate 默認序列化器,使用 JDK 原生序列化方式
  • StringRedisSerializer
  • Jackson2JsonRedisSerializer 使用 Jackson, 以 JSON 格式存儲數據
  • GenericJackson2JsonRedisSerializer 使用 Jackson, 以 JSON 格式存儲數據, JSON 中會存儲對象類型

我們在 Java 中經常要存儲對象, 此時可配置 Jackson2JsonRedisSerializer 或者 GenericJackson2JsonRedisSerializer

@Bean
public RedisTemplate<String, Person> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisTemplate<String, Person> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Person.class));

    return redisTemplate;
}

或者

@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

    return redisTemplate;
}

兩者的區別是 GenericJackson2JsonRedisSerializer 在構造時不需要指定一個 Java 對象類型,當你需要存儲不同的 Java 對象,又不想配置多個 RedisTemplate 的時候,就可以使用 GenericJackson2JsonRedisSerializer,在 Redis 中查看數據,可以發現 GenericJackson2JsonRedisSerializer 存儲的 JSON 數據會多一個 @Class 的鍵,存儲了該 JSON 對應的 Java 數據類型.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章