Spring Boot 中 RedisTemplate 与 StringRedisTemplate 常用 Redis API 速查

目录

  • [一、StringRedisTemplate 和 RedisTemplate 区别](#一、StringRedisTemplate 和 RedisTemplate 区别)
    • [1. StringRedisTemplate](#1. StringRedisTemplate)
    • [2. RedisTemplate](#2. RedisTemplate)
    • [3. 两者对比](#3. 两者对比)
  • [二、StringRedisTemplate 常见操作](#二、StringRedisTemplate 常见操作)
    • 1.String(字符串)操作
      • [(1) set](#(1) set)
      • [(2) set(带过期时间)](#(2) set(带过期时间))
      • [(3) setIfAbsent(SETNX)](#(3) setIfAbsent(SETNX))
      • [(4) get](#(4) get)
      • [(5) getAndSet](#(5) getAndSet)
      • [(6) increment](#(6) increment)
      • [(7) decrement](#(7) decrement)
      • [(8) append](#(8) append)
      • [(9) multiGet](#(9) multiGet)
    • [2.Key 操作](#2.Key 操作)
      • [(1) hasKey](#(1) hasKey)
      • [(2) delete](#(2) delete)
      • [(3) 批量删除](#(3) 批量删除)
      • [(4) expire](#(4) expire)
      • [(5) getExpire](#(5) getExpire)
      • [(6) persist](#(6) persist)
      • [(7) rename](#(7) rename)
    • [3.Hash 操作](#3.Hash 操作)
      • [(1) put](#(1) put)
      • [(2) get](#(2) get)
      • [(3) putAll](#(3) putAll)
      • [(4) entries](#(4) entries)
      • [(5) delete](#(5) delete)
      • [(6) hasKey](#(6) hasKey)
    • [4.List 操作](#4.List 操作)
      • [(1) leftPush](#(1) leftPush)
      • [(2) rightPush](#(2) rightPush)
      • [(3) range](#(3) range)
      • [(4) leftPop](#(4) leftPop)
      • [(5) rightPop](#(5) rightPop)
      • [(6) size](#(6) size)
    • [5.Set 操作](#5.Set 操作)
      • [(1) add](#(1) add)
      • [(2) members](#(2) members)
      • [(3) isMember](#(3) isMember)
      • [(4) remove](#(4) remove)
      • [(5) size](#(5) size)
    • 6.ZSet(有序集合)操作
      • [(1) add](#(1) add)
      • [(2) incrementScore](#(2) incrementScore)
      • [(3) range](#(3) range)
      • [(4) reverseRange](#(4) reverseRange)
      • [(5) rank](#(5) rank)
  • [三、RedisTemplate 常见操作](#三、RedisTemplate 常见操作)
  • 四、总结
  • [五、开发中最常用的 Redis 场景](#五、开发中最常用的 Redis 场景)
      • [1 缓存](#1 缓存)
      • [2 分布式锁](#2 分布式锁)
      • [3 计数器](#3 计数器)
      • [4 排行榜](#4 排行榜)
      • [5 消息队列(简单场景)](#5 消息队列(简单场景))
      • [6 用户签到](#6 用户签到)

一、StringRedisTemplate 和 RedisTemplate 区别

1. StringRedisTemplate

java 复制代码
@Autowired
private StringRedisTemplate stringRedisTemplate;

特点:

  • Key 默认使用 StringRedisSerializer
  • Value 默认使用 StringRedisSerializer
  • Redis 中存储的数据可直接查看
  • 适合存储:
    • String
    • JSON字符串
    • 计数器
    • 缓存数据

例如:

java 复制代码
stringRedisTemplate.opsForValue().set("user:1", "{\"name\":\"Tom\"}");

Redis中:

text 复制代码
user:1
{"name":"Tom"}

2. RedisTemplate

java 复制代码
@Autowired
private RedisTemplate<String,Object> redisTemplate;

特点:

  • 支持存储任意对象
  • 默认使用 JDK 序列化
  • Redis 中存储的是二进制数据

例如:

java 复制代码
User user = new User();
user.setName("Tom");

redisTemplate.opsForValue().set("user:1", user);

Redis中看到:

text 复制代码
\xac\xed\x00\x05sr...

3. 两者对比

对比项 StringRedisTemplate RedisTemplate
Key类型 String 泛型
Value类型 String Object
默认序列化 StringSerializer JDKSerializer
可读性
性能 较高 较低
使用场景 缓存、计数器、Token 存储对象

二、StringRedisTemplate 常见操作


1.String(字符串)操作

获得操作对象:

java 复制代码
ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();

(1) set

设置值

java 复制代码
ops.set("name","Tom");

返回值:

java 复制代码
void

Redis:

text 复制代码
name=Tom

(2) set(带过期时间)

java 复制代码
ops.set(
    "name",
    "Tom",
    10,
    TimeUnit.MINUTES
);

说明:

  • 设置缓存
  • 10分钟后自动过期

返回值:

java 复制代码
void

(3) setIfAbsent(SETNX)

不存在才设置

java 复制代码
Boolean result = ops.setIfAbsent("lock","1");

返回:

java 复制代码
true

表示设置成功

java 复制代码
false

表示Key已存在

常用于:

  • 分布式锁

(4) get

获取值

java 复制代码
String value = ops.get("name");

返回:

java 复制代码
Tom

(5) getAndSet

获取旧值并设置新值

java 复制代码
String old = ops.getAndSet(
            "name",
            "Jerry"
        );

返回:

java 复制代码
Tom

(6) increment

自增

java 复制代码
Long result = stringRedisTemplate
            .boundValueOps("count")
            .increment(1);

返回:

java 复制代码
自增后的值

例如:

java 复制代码
1
2
3
...

(7) decrement

自减

java 复制代码
Long result =
        stringRedisTemplate
            .boundValueOps("count")
            .increment(-1);

返回:

java 复制代码
自减后的值

(8) append

追加字符串

java 复制代码
Integer length = ops.append(
            "name",
            "_java"
        );

Redis:

text 复制代码
Tom_java

返回:

java 复制代码
追加后字符串长度

(9) multiGet

批量获取

java 复制代码
List<String> list = ops.multiGet(
                Arrays.asList(
                    "k1",
                    "k2",
                    "k3"
                )
        );

返回:

java 复制代码
List<String>

2.Key 操作


(1) hasKey

判断Key是否存在

java 复制代码
Boolean exists = stringRedisTemplate.hasKey("name");

返回:

java 复制代码
true
false

(2) delete

删除Key

java 复制代码
Boolean result =
        stringRedisTemplate.delete("name");

返回:

java 复制代码
true
false

(3) 批量删除

java 复制代码
Long count = stringRedisTemplate.delete(
                Arrays.asList(
                    "k1",
                    "k2"
                )
        );

返回:

java 复制代码
删除数量

(4) expire

设置过期时间

java 复制代码
Boolean result = stringRedisTemplate.expire(
                "name",
                30,
                TimeUnit.MINUTES
        );

返回:

java 复制代码
true
false

(5) getExpire

获取剩余过期时间

java 复制代码
Long expire = stringRedisTemplate.getExpire("name");

返回:

java 复制代码

指定单位:

java 复制代码
Long expire = stringRedisTemplate.getExpire(
                "name",
                TimeUnit.MINUTES
        );

(6) persist

取消过期时间

java 复制代码
Boolean result = stringRedisTemplate.persist("name");

返回:

java 复制代码
true
false

(7) rename

重命名Key

java 复制代码
stringRedisTemplate.rename(
        "oldKey",
        "newKey"
);

返回:

java 复制代码
void

3.Hash 操作

相当于:

text 复制代码
user:1
{
  name:Tom,
  age:18
}

(1) put

java 复制代码
stringRedisTemplate.opsForHash()
        .put(
            "user:1",
            "name",
            "Tom"
        );

返回:

java 复制代码
void

(2) get

java 复制代码
Object value = stringRedisTemplate.opsForHash()
            .get(
                "user:1",
                "name"
            );

返回:

java 复制代码
Tom

(3) putAll

批量存储

java 复制代码
Map<String,String> map = new HashMap<>();

map.put("name","Tom");
map.put("age","18");

stringRedisTemplate.opsForHash().putAll("user:1",map);

(4) entries

获取整个Hash

java 复制代码
Map<Object,Object> map =
        stringRedisTemplate
                .opsForHash()
                .entries("user:1");

(5) delete

删除字段

java 复制代码
Long count = stringRedisTemplate
                .opsForHash()
                .delete(
                    "user:1",
                    "age"
                );

返回:

java 复制代码
删除数量

(6) hasKey

判断字段存在

java 复制代码
Boolean result = stringRedisTemplate
                .opsForHash()
                .hasKey(
                    "user:1",
                    "name"
                );

4.List 操作


(1) leftPush

头插

java 复制代码
Long size = stringRedisTemplate
            .opsForList()
            .leftPush(
                "list",
                "A"
            );

返回:

java 复制代码
插入后长度

(2) rightPush

尾插

java 复制代码
Long size = stringRedisTemplate
            .opsForList()
            .rightPush(
                "list",
                "B"
            );

(3) range

查询区间

java 复制代码
List<String> list = stringRedisTemplate
            .opsForList()
            .range(
                "list",
                0,
                -1
            );

返回全部元素


(4) leftPop

头出队

java 复制代码
String value = stringRedisTemplate
            .opsForList()
            .leftPop("list");

(5) rightPop

尾出队

java 复制代码
String value = stringRedisTemplate
            .opsForList()
            .rightPop("list");

(6) size

java 复制代码
Long size = stringRedisTemplate
            .opsForList()
            .size("list");

5.Set 操作


(1) add

添加元素

java 复制代码
Long count = stringRedisTemplate
            .opsForSet()
            .add(
                "user:set",
                "1",
                "2",
                "3"
            );

返回:

java 复制代码
新增成功数量

(2) members

获取全部元素

java 复制代码
Set<String> set = stringRedisTemplate
            .opsForSet()
            .members(
                "user:set"
            );

(3) isMember

判断元素是否存在

java 复制代码
Boolean result = stringRedisTemplate
            .opsForSet()
            .isMember(
                "user:set",
                "1"
            );

(4) remove

删除元素

java 复制代码
Long count = stringRedisTemplate
            .opsForSet()
            .remove(
                "user:set",
                "1"
            );

(5) size

java 复制代码
Long size = stringRedisTemplate
            .opsForSet()
            .size("user:set");

6.ZSet(有序集合)操作

适用于:

  • 排行榜
  • 热搜榜
  • 积分榜

(1) add

java 复制代码
Boolean result = stringRedisTemplate
            .opsForZSet()
            .add(
                "rank",
                "Tom",
                100
            );

score:

java 复制代码
100

(2) incrementScore

分数增加

java 复制代码
Double score = stringRedisTemplate
            .opsForZSet()
            .incrementScore(
                "rank",
                "Tom",
                10
            );

返回:

java 复制代码
最新score

(3) range

升序查询

java 复制代码
Set<String> set = stringRedisTemplate
            .opsForZSet()
            .range(
                "rank",
                0,
                9
            );

(4) reverseRange

降序查询

java 复制代码
Set<String> set = stringRedisTemplate
            .opsForZSet()
            .reverseRange(
                "rank",
                0,
                9
            );

(5) rank

获取排名

java 复制代码
Long rank = stringRedisTemplate
            .opsForZSet()
            .rank(
                "rank",
                "Tom"
            );

注意:

java 复制代码
从0开始

三、RedisTemplate 常见操作

因为 RedisTemplate 支持对象存储,所以最常见的是:

java 复制代码
RedisTemplate<String,Object>

1.存储对象

java 复制代码
User user = new User(1L, "Tom");

redisTemplate.opsForValue()
        .set(
            "user:1",
            user
        );

2.获取对象

java 复制代码
User user = (User) redisTemplate
        .opsForValue()
        .get("user:1");

3.setIfAbsent

setIfAbsent用于向 Redis 中设置一个键值对,如果该键不存在时才进行设置,同时设置这个键的过期时间,最后返回 true;如果键已经存,则不做任何修改并返回 false

下面的示例,设置键为 "lock" ,值为 UUID.randomUUID().toString() ,过期时间为 30 秒

java 复制代码
Boolean lock = redisTemplate
            .opsForValue()
            .setIfAbsent(
                "lock",
                UUID.randomUUID().toString(),
                30,
                TimeUnit.SECONDS
            );

这是分布式锁常用写法。


3.Hash存储对象

Hash 类似于 Java 中的 Map。

存值和修改值使用 put :

java 复制代码
// 相当于:
//Map<String, user> userMap = new HashMap<>();
//userMap.put(user.getId(),user);
redisTemplate.opsForHash()
        .put(
            "userMap",
            user.getId(),
            user
        );

// 相当于:
//Map<String, Object> user_1 = new HashMap<>();
//user_1.put("name","Tom");
//user_1.put("age","18");
redisTemplate.opsForHash()
        .put("user_1",
             "name",
             "Tom");

redisTemplate.opsForHash()
        .put("user_1",
             "age",
             18);
        

如果要把整个 Map 存储到 redis ,可以使用 putAll :

java 复制代码
Map<String,Object> userMap = new HashMap<>();

userMap.put("name","Tom");
userMap.put("age",18);

redisTemplate.opsForHash()
        .putAll(
            "userMap",
            map
        );

取值:

java 复制代码
Object age = redisTemplate
            .opsForHash()
            .get(
                "user_1",
                "age"
            );

实际项目常用写法

利用 Bean 转 Map:

java 复制代码
Map<String,Object> map = BeanUtil.beanToMap(user);

redisTemplate.opsForHash().putAll("user_1", map);

所以:Hash存储对象

本质上就是把Java对象拆成Redis Hash


4.multiSet批量存储

普通写法:

java 复制代码
Map<String,Object> map = new HashMap<>();

map.put("user:1","Tom");
map.put("user:2","Jerry");
map.put("user:3","Lucy");

//执行了3此设置,三次网络交互
redisTemplate.opsForValue().set("user:1","Tom");
redisTemplate.opsForValue().set("user:2","Jerry");
redisTemplate.opsForValue().set("user:3","Lucy");

批量存储:

java 复制代码
Map<String,Object> map = new HashMap<>();

map.put("user:1","Tom");
map.put("user:2","Jerry");
map.put("user:3","Lucy");

redisTemplate.opsForValue() .multiSet(map);

注意:

multiSet 是值的多个Redis键值对一次进行批量存储,不是 Hash。

5.List存储

java 复制代码
redisTemplate.opsForList()
        .rightPush(
            "orderQueue",
            "order1"
        );

redisTemplate.opsForList()
        .rightPush(
            "orderQueue",
            "order2"
        );

Redis 中:

tex 复制代码
orderQueue:
order1
order2

查询:

将范围设定为从 0-1,即提取该列表从头到尾的所有数据。如果该键不存在或对应的列表为空,则返回一个空列表。

java 复制代码
List<Object> list = redisTemplate
            .opsForList()
            .range(
                "orderQueue",
                0,
                -1
            );

四、总结

Java结构 Redis结构 Template操作
String String opsForValue()
Object String(Value) opsForValue()
Map Hash opsForHash()
List List opsForList()
Set Set opsForSet()
TreeSet/排行榜 ZSet opsForZSet()

可以记住一个核心原则:

tex 复制代码
opsForValue()
    一个Key对应一个Value

opsForHash()
    一个Key对应多个Field-Value

opsForList()
    一个Key对应一个列表

opsForSet()
    一个Key对应一个无序集合

opsForZSet()
    一个Key对应一个带分数(score)的有序集合

在实际 Spring Boot 项目里,最常用的其实是:

tex 复制代码
opsForValue()   // 缓存对象、缓存JSON
opsForHash()    // 用户信息、配置项
opsForZSet()    // 排行榜

五、开发中最常用的 Redis 场景

1 缓存

java 复制代码
ops.set(
    "product:1001",
    json,
    30,
    TimeUnit.MINUTES
);

2 分布式锁

java 复制代码
Boolean success =
    ops.setIfAbsent(
        lockKey,
        uuid,
        30,
        TimeUnit.SECONDS
    );

3 计数器

java 复制代码
ops.increment(
    "article:view:1"
);

4 排行榜

java 复制代码
opsForZSet()
    .incrementScore(
        "rank",
        userId,
        score
    );

5 消息队列(简单场景)

java 复制代码
opsForList()
    .rightPush(
        "queue",
        message
    );

6 用户签到

java 复制代码
opsForSet()
    .add(
        "sign:20260801",
        userId
    );

参考:

Springboot 操作 redis 中的String、Set、Map、List、实体类,上传文件

java中常用Redis操作

相关推荐
霸道流氓气质1 小时前
Spring Boot 微服务中“调用第三方接口 → 数据加工 → 分接口返回“的完整架构实践
spring boot·微服务·架构
阿萨德528号1 小时前
[特殊字符] CI/CD 流水线搭建实战指南:Spring Boot + GitHub Actions → 服务器自动部署
spring boot·ci/cd·github
xingyuzhisuan1 小时前
Redis 多级缓存落地聚合 API:重复请求降本 70% 实战数据
数据库·redis·缓存·ai
摇滚侠1 小时前
SpringMVC 入门到实战 域对象共享数据 33-43
java·后端·spring·intellij-idea
CodeStats1 小时前
JavaWeb 造轮者视角:Spring Boot 启动核心思想与完整链路解析
java·spring boot·后端
techdashen2 小时前
Rust 项目管理动态 — 2026 年 2 月
开发语言·后端·rust
Shawn_Shawn2 小时前
Apache Doris Ai Function学习
后端·llm
Python私教2 小时前
我准备用 AI 二开 shadcn-admin,做一个可交付的后台管理系统模板
后端
阿正的梦工坊12 小时前
【Rust】02-变量、不可变性与基础类型
开发语言·后端·rust