这是一份面向初学者的 Redis 基础学习文档,涵盖了 Redis 核心数据结构、Spring Data Redis 框架、RedisTemplate 的快速入门、序列化机制以及 StringRedisTemplate 的使用。


Redis 基础学习文档

1. Redis 简介与常见数据结构

Redis(REmote DIctionary Server)是一款开源的、基于内存的键值存储系统,常用作缓存、消息队列和短暂数据存储。它支持多种数据结构,读写性能极高(可达 10 万+ QPS)。

1.1 String(字符串)

  • 最基本类型,二进制安全,可存储文本、整数、JSON 等。

  • 常用命令:SETGETINCRMSETMGET

SET user:1 "Alice"
GET user:1          # "Alice"
INCR page_views     # 原子递增

1.2 Hash(哈希)

  • 适合存储对象,如用户信息、配置项。

  • 常用命令:HSETHGETHGETALLHMSET

HSET user:2 name "Bob" age 25
HGET user:2 name    # "Bob"
HGETALL user:2

1.3 List(列表)

  • 双向链表,可作栈或队列。

  • 常用命令:LPUSHRPUSHLPOPRPOPLRANGE

LPUSH tasks "task1"   # 头部添加
RPUSH tasks "task2"   # 尾部添加
LRANGE tasks 0 -1     # 查看全部

1.4 Set(集合)

  • 无序、唯一,支持交、并、差运算。

  • 常用命令:SADDSMEMBERSSISMEMBERSINTER

SADD tags "redis" "spring"
SMEMBERS tags
SISMEMBER tags "redis"   # 1 (存在)

1.5 Sorted Set(有序集合)

  • 每个元素关联一个分数(score),按分数排序。

  • 常用命令:ZADDZRANGEZREVRANGEZRANK

ZADD leaderboard 100 "Alice" 95 "Bob"
ZRANGE leaderboard 0 -1 WITHSCORES

1.6 其他结构

  • Bitmap:位图,适合记录签到、在线状态。

  • HyperLogLog:基数统计,近似去重计数。

  • Geospatial:地理坐标存储与计算。


2. Spring Data Redis 介绍

Spring Data Redis 是 Spring 框架下的一个子项目,用于简化与 Redis 的交互。它提供了:

  • 统一的模板类 RedisTemplateStringRedisTemplate

  • 将底层 Redis 连接抽象为 RedisConnectionFactory

  • 支持多种序列化策略

  • 提供异常转换、发布订阅、Lua 脚本等功能

核心思想:通过 RedisTemplate 直接操作 Java 对象,而不必手动处理连接、字节转换等底层细节。


3. RedisTemplate 快速入门

3.1 添加依赖(Maven)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>   <!-- 连接池支持 -->
</dependency>

3.2 配置连接工厂

application.yml 中配置 Redis 连接:

spring:
  redis:
    host: localhost
    port: 6379
    password:   # 无密码可不写
    database: 0
    lettuce:
      pool:
        max-active: 8
        max-idle: 8

Spring Boot 会自动配置 RedisConnectionFactory,通常无需手动创建 Bean。

3.3 编写示例代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
​
@Component
public class RedisDemo {
​
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
​
    public void demo() {
        // 存储字符串
        redisTemplate.opsForValue().set("name", "张三");
        String name = (String) redisTemplate.opsForValue().get("name");
​
        // 存储 Hash
        redisTemplate.opsForHash().put("user:3", "name", "李四");
        redisTemplate.opsForHash().put("user:3", "age", 28);
​
        // 存储 List
        redisTemplate.opsForList().rightPush("logs", "login success");
        redisTemplate.opsForList().rightPush("logs", "logout");
​
        // 存储 Set
        redisTemplate.opsForSet().add("hobbies", "basketball", "football");
​
        // 存储 ZSet
        redisTemplate.opsForZSet().add("rank", "playerA", 99.5);
    }
}

注意:直接使用 RedisTemplate<String, Object> 时,值默认使用 JDK 序列化(存储为二进制),可读性差且占用空间大,通常需要自定义序列化。


4. RedisTemplate 的各种序列化方式

4.1 默认序列化问题

默认使用 JdkSerializationRedisSerializer,会将对象序列化为字节流,并在 key/value 前添加额外字符(如 \xAC\xED...),导致:

  • Redis 命令行查看时乱码

  • 跨语言应用无法解析

  • 内存占用较高

4.2 常用序列化器

序列化器 特点
StringRedisSerializer 字符串/数值直接存储,适合 key
Jackson2JsonRedisSerializer JSON 格式,可读性好,跨语言
GenericJackson2JsonRedisSerializer 支持类型信息,反序列化为具体类型
JdkSerializationRedisSerializer 默认,不推荐

4.3 自定义 RedisTemplate 序列化配置

推荐 key 用 StringRedisSerializer,value 用 Jackson2JsonRedisSerializer

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // key 使用 StringRedisSerializer
        StringRedisSerializer stringSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringSerializer);
        template.setHashKeySerializer(stringSerializer);

        // value 使用 Jackson2JsonRedisSerializer
        Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // 存储类型信息
        jsonSerializer.setObjectMapper(objectMapper);

        template.setValueSerializer(jsonSerializer);
        template.setHashValueSerializer(jsonSerializer);

        template.afterPropertiesSet();
        return template;
    }
}

使用示例:存入 Java 对象时会自动转为 JSON,命令行可读:

SET user:4 '{"name":"王五","age":30}'

4.4 不同场景的序列化选择

  • Key 统一用字符串:便于管理、调试。

  • Value

    • 简单类型(String、Long) → StringRedisSerializer

    • 复杂对象且只被 Java 使用 → GenericJackson2JsonRedisSerializer(存储 @class 信息)

    • 跨语言/前端直接使用 → Jackson2JsonRedisSerializer + 统一对象结构


5. StringRedisTemplate

StringRedisTemplateRedisTemplate<String, String> 的特化版本,其 key 和 value 的序列化器均为 StringRedisSerializer

5.1 特点

  • key/value 都是字符串,可直接读写普通文本、数字、JSON 字符串。

  • 无需配置,Spring Boot 自动配置,可直接注入使用。

  • 性能略高(避免序列化开销),但无法直接存取 Java 对象(需手动转为 JSON)。

5.2 快速使用

@Autowired
private StringRedisTemplate stringRedisTemplate;

public void demo() {
    // 存字符串
    stringRedisTemplate.opsForValue().set("city", "Shanghai");
    String city = stringRedisTemplate.opsForValue().get("city");

    // 存 JSON 字符串
    User user = new User("赵六", 35);
    String json = new ObjectMapper().writeValueAsString(user);
    stringRedisTemplate.opsForValue().set("user:6", json);
}

5.3 与 RedisTemplate 对比

特性 RedisTemplate<String, Object> StringRedisTemplate
Key 序列化 可自定义,常用 StringRedisSerializer 固定 StringRedisSerializer
Value 序列化 可自定义(JSON/Java/...) 固定 StringRedisSerializer
存储 Java 对象 直接存,序列化器处理 需手动转 JSON / 字符串
适用场景 业务对象缓存、高灵活性 简单键值、计数器、纯文本内容

实际开发建议

  • 若只存字符串、整数、JSON 字符串,使用 StringRedisTemplate 更轻量。

  • 若需要自动序列化复杂对象,配置自定义 RedisTemplate


6. 总结

  • Redis 提供了丰富的数据结构,分别适用于不同业务模式。

  • Spring Data Redis 通过 RedisTemplate 将底层操作封装为 Java API,极大提升开发效率。

  • 序列化是使用 RedisTemplate 的关键点,根据数据格式选择合适的序列化器。

  • StringRedisTemplate 是专门处理字符串的模板,简单高效。

掌握以上内容后,你可以在 Spring Boot 项目中熟练使用 Redis 进行缓存、计数、排行榜等操作。继续深入可学习事务、管道、发布订阅以及 Lua 脚本等高级特性。


参考资源

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐