使用 Java 操作 Redis

語言: CN / TW / HK

Jedis

1. 概述

Jedis 是一款使用 Java 操作 Redis 的工具,有點類似於 JDBC

2. 引入依賴

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

3. 操作

// 建立 jedis 客戶端物件
Jedis jedis = new Jedis("39.108.6.119", 6379);
// 選擇使用一個庫,預設 0 號庫
jedis.select(0);
// 清空當前庫
jedis.flushDB();
//設定 redis 字串資料
jedis.set("key", "value");
//儲存資料到列表中
jedis.lpush("list", "value1");
jedis.lpush("list", "value2");
jedis.lpush("list", "value3");
// 更多操作
...
// 釋放資源
jedis.close();

具體 API 參考官網文件: https://www.javadoc.io/doc/redis.clients/jedis/latest/index.html

SpringBoot 整合 Redis

1. 概述

SpringData 提供了 RedisTemplate 和 StringRedisTemplate,後者是前者的子集。兩個模板基本一致,不同之處體現在操作的資料型別不同。RedisTemplate 中 key 和 value 泛型都是 Object,可以儲存一個物件。而 StringRedisTemplate 的兩個泛型都是 String,只能儲存字串

2. 引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3. 操作

@SpringBootTest(classes = RedisSpringbootApplication.class)
@RunWith(SpringRunner.class)
public class TestRedisTemplate {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void test() {
        stringRedisTemplate.opsForValue().set("name", "jack");
        String name = stringRedisTemplate.opsForValue().get("name");
        // 更多操作...
    }
}

具體 API 參考官網文件: https://docs.spring.io/spring-data/redis/docs/current/api/

4. 序列化

無論使用 StringRedisTemplate 還是 RedisTemplate,都會對 key 和 value 進行序列化

Spring-Data-Redis 的序列化方式是通過實現 RedisSerializer 介面,每一種實現都對應不同的序列化方式

4.1 JDK 序列化

org.springframework.data.redis.serializer.JdkSerializationRedisSerializer ,RedisTemplate 的預設序列化方式,序列化物件需實現 Serializable 介面,絕大多數情況下,不推薦使用該方式,因為這種方式序列化之後儲存的是位元組序列,對閱讀不友好

4.2 String 序列化

org.springframework.data.redis.serializer.StringRedisSerializer ,StringRedisTemplate 的預設序列化方式,這種實現方式比較輕量與高效,但只能對字串序列化,無法對普通物件序列化

4.3 Json 序列化

org.springframework.data.redis.serializer.Jackson2JsonRedisSerializerorg.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer ,兩者都是使用 Jackson 實現 JSON 的序列化方式,不同的是,前者必須在構造序列化物件時傳入物件的型別,後者則不需要,並且序列化時將物件型別也儲存了

4.4 修改序列化方案

// 以修改序列化方案為 StringRedisSerializer 為例
// 修改 key 序列化方案
redisTemplate.setKeySerializer(RedisSerializer.string());
// 修改 value 序列化方案
redisTemplate.setValueSerializer(RedisSerializer.string());
// 修改 hash key 序列化方案
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// 修改 hash value 序列化方案
redisTemplate.setHashValueSerializer(RedisSerializer.string());