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 脚本等高级特性。
参考资源:
Redis 官方文档
Spring Data Redis Reference
