Redis基础介绍与SpringDataRedis的基础使用
这是一份面向初学者的 Redis 基础学习文档,涵盖了 Redis 核心数据结构、Spring Data Redis 框架、RedisTemplate 的快速入门、序列化机制以及 StringRedisTemplate 的使用。
Redis 基础学习文档
1. Redis 简介与常见数据结构
Redis(REmote DIctionary Server)是一款开源的、基于内存的键值存储系统,常用作缓存、消息队列和短暂数据存储。它支持多种数据结构,读写性能极高(可达 10 万+ QPS)。
1.1 String(字符串)
-
最基本类型,二进制安全,可存储文本、整数、JSON 等。
-
常用命令:
SET、GET、INCR、MSET、MGET。
SET user:1 "Alice" GET user:1 # "Alice" INCR page_views # 原子递增
1.2 Hash(哈希)
-
适合存储对象,如用户信息、配置项。
-
常用命令:
HSET、HGET、HGETALL、HMSET。
HSET user:2 name "Bob" age 25 HGET user:2 name # "Bob" HGETALL user:2
1.3 List(列表)
-
双向链表,可作栈或队列。
-
常用命令:
LPUSH、RPUSH、LPOP、RPOP、LRANGE。
LPUSH tasks "task1" # 头部添加 RPUSH tasks "task2" # 尾部添加 LRANGE tasks 0 -1 # 查看全部
1.4 Set(集合)
-
无序、唯一,支持交、并、差运算。
-
常用命令:
SADD、SMEMBERS、SISMEMBER、SINTER。
SADD tags "redis" "spring" SMEMBERS tags SISMEMBER tags "redis" # 1 (存在)
1.5 Sorted Set(有序集合)
-
每个元素关联一个分数(score),按分数排序。
-
常用命令:
ZADD、ZRANGE、ZREVRANGE、ZRANK。
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 的交互。它提供了:
-
统一的模板类
RedisTemplate和StringRedisTemplate -
将底层 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
StringRedisTemplate 是 RedisTemplate<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 脚本等高级特性。
参考资源:
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)