介绍

StringRedisTemplate 是 Spring Data Redis 提供的专门操作 Redis 字符串数据的模板类,其键(key)和值(value)默认采用字符串序列化(StringRedisSerializer),无需额外配置即可高效处理文本数据。适用于缓存、会话管理等场景

StringRedisTemplate 和 RedisTemplate 是 Spring Data Redis 中两个核心操作类,二者为继承关系StringRedisTemplate 继承 RedisTemplate),但在序列化机制、数据存储格式及适用场景上有显著区别。以下从多个维度详细说明其关系与差异:

特性StringRedisTemplateRedisTemplate
继承关系子类(继承 RedisTemplate父类(泛型类,支持任意类型)
键序列化器StringRedisSerializer默认 JdkSerializationRedisSerializer
值序列化器StringRedisSerializer默认 JdkSerializationRedisSerializer
数据存储格式字符串(可读性强,如 "user:1000"JDK 二进制序列化(不可读,如 \xac\xed\x00\x05t...
跨语言兼容性高(通用字符串格式)低(依赖 Java 反序列化)
可视化友好性✅ Redis CLI 可直接查看数据❌ 二进制数据不可读

核心特性与优势

序列化简化

  • 默认使用 StringRedisSerializer,键值均为字符串,避免 JDK 序列化(如 RedisTemplate 的字节数组格式),数据在 Redis 中可读性更强。
  • 节省内存:不存储类信息(Class Metadata),降低内存占用。

开箱即用

  • 无需自定义序列化,注入即可操作:
@Autowired
     private StringRedisTemplate stringRedisTemplate;

多数据类型支持

通过不同接口操作 Redis 的五种核心数据结构:sda

opsForValue();    // 操作字符串
opsForHash();     // 操作哈希表
opsForList();     // 操作列表
opsForSet();      // 操作集合
opsForZSet();     // 操作有序集合

使用场景对比

数据类型优势适用场景典型 API
字符串(String)简单高效,支持原子增减缓存、计数器、令牌管理set(), get(), increment()
哈希(Hash)结构化存储对象属性用户信息、商品详情put(), entries(), get()
列表(List)有序元素,支持双向操作消息队列、操作日志leftPush(), range(), leftPop()
集合(Set)元素唯一性,快速查找标签系统、好友关系add(), members(), isMember()

常用 API 分类详解

字符串(String)操作

方法作用示例
set(key, value)存储键值对stringRedisTemplate.opsForValue().set("user:1", "Alice")
set(key, value, timeout, timeUnit)存值并设置过期时间opsForValue().set("token", "xyz", 30, TimeUnit.MINUTES)
get(key)根据键获取值String name = opsForValue().get("user:1")
increment(key, delta)值递增(整数)opsForValue().increment("counter", 1)
decrement(key, delta)值递减(整数)opsForValue().decrement("stock", 10)
setIfAbsent(key, value)仅当键不存在时存储Boolean success = opsForValue().setIfAbsent("lock", "1")

哈希(Hash)操作

方法作用示例
put(key, hashKey, value)向哈希表添加字段opsForHash().put("user:100", "age", "25")
get(key, hashKey)获取哈希表字段值String age = opsForHash().get("user:100", "age")
entries(key)获取整个哈希表Map user = opsForHash().entries("user:100")
delete(key, hashKeys)删除哈希表字段opsForHash().delete("user:100", "address")

列表(List)操作

方法作用示例
leftPush(key, value)从左侧插入元素opsForList().leftPush("queue", "task1")
rightPush(key, value)从右侧插入元素opsForList().rightPush("log", "error1")
leftPop(key)从左侧弹出元素String task = opsForList().leftPop("queue")
range(key, start, end)获取列表区间元素List logs = opsForList().range("log", 0, 10)

通用操作

方法作用示例
delete(key)删除键stringRedisTemplate.delete("user:1")
hasKey(key)检查键是否存在Boolean exists = stringRedisTemplate.hasKey("token")
getExpire(key)获取键的剩余时间(秒)Long ttl = stringRedisTemplate.getExpire("token")
expire(key, timeout, timeUnit)设置键过期时间stringRedisTemplate.expire("session", 10, TimeUnit.MINUTES)

配置与序列化说明

依赖与配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
  redis:
    host: localhost
    port: 6379
    password: 123456
    timeout: 3000

序列化对比

  • StringRedisTemplate:键值强制转为字符串(StringRedisSerializer),数据在 Redis 中以可读文本存储(如 "user:1")。
  • RedisTemplate:默认 JDK 序列化(JdkSerializationRedisSerializer),数据为字节数组(如 \xac\xed\x00\x05t\x00\x05user),需手动配置 JSON 序列化。
最后修改:2025 年 08 月 01 日
如果觉得我的文章对你有用,请随意赞赏