SpringBoot中RedisTemplate与StringRedisTemplate常用Redis API速查

 更新时间:2026年06月12日 08:53:10   作者:西凉的悲伤  
这篇文章主要介绍了StringRedisTemplate、RedisTemplate和Redis操作,概括了StringRedisTemplate与RedisTemplate的区别、常见操作及应用场景,特别强调了StringRedisTemplate在字符串操作中的优势和常用操作如set、get、increment等,适合用于缓存、计数器和Token存储等

一、StringRedisTemplate 和 RedisTemplate 区别

1. StringRedisTemplate

@Autowired
private StringRedisTemplate stringRedisTemplate;

特点:

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

例如:

stringRedisTemplate.opsForValue().set("user:1", "{\"name\":\"Tom\"}");

Redis中:

user:1
{"name":"Tom"}

2. RedisTemplate

@Autowired
private RedisTemplate<String,Object> redisTemplate;

特点:

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

例如:

User user = new User();
user.setName("Tom");

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

Redis中看到:

\xac\xed\x00\x05sr...

3. 两者对比

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

二、StringRedisTemplate 常见操作

1.String(字符串)操作

获得操作对象:

ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();

(1) set

设置值

ops.set("name","Tom");

返回值:

void

Redis:

name=Tom

(2) set(带过期时间)

ops.set(
    "name",
    "Tom",
    10,
    TimeUnit.MINUTES
);

说明:

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

返回值:

void

(3) setIfAbsent(SETNX)

不存在才设置

Boolean result = ops.setIfAbsent("lock","1");

返回:

true

表示设置成功

false

表示Key已存在

常用于:

  • 分布式锁

(4) get

获取值

String value = ops.get("name");

返回:

Tom

(5) getAndSet

获取旧值并设置新值

String old = ops.getAndSet(
            "name",
            "Jerry"
        );

返回:

Tom

(6) increment

自增

Long result = stringRedisTemplate
            .boundValueOps("count")
            .increment(1);

返回:

自增后的值

例如:

1
2
3
...

(7) decrement

自减

Long result =
        stringRedisTemplate
            .boundValueOps("count")
            .increment(-1);

返回:

自减后的值

(8) append

追加字符串

Integer length = ops.append(
            "name",
            "_java"
        );

Redis:

Tom_java

返回:

追加后字符串长度

(9) multiGet

批量获取

List<String> list = ops.multiGet(
                Arrays.asList(
                    "k1",
                    "k2",
                    "k3"
                )
        );

返回:

List<String>

2.Key 操作

(1) hasKey

判断Key是否存在

Boolean exists = stringRedisTemplate.hasKey("name");

返回:

true
false

(2) delete

删除Key

Boolean result =
        stringRedisTemplate.delete("name");

返回:

true
false

(3) 批量删除

Long count = stringRedisTemplate.delete(
                Arrays.asList(
                    "k1",
                    "k2"
                )
        );

返回:

删除数量

(4) expire

设置过期时间

Boolean result = stringRedisTemplate.expire(
                "name",
                30,
                TimeUnit.MINUTES
        );

返回:

true
false

(5) getExpire

获取剩余过期时间

Long expire = stringRedisTemplate.getExpire("name");

返回:

指定单位:

Long expire = stringRedisTemplate.getExpire(
                "name",
                TimeUnit.MINUTES
        );

(6) persist

取消过期时间

Boolean result = stringRedisTemplate.persist("name");

返回:

true
false

(7) rename

重命名Key

stringRedisTemplate.rename(
        "oldKey",
        "newKey"
);

返回:

void

3.Hash 操作

相当于:

user:1
{
  name:Tom,
  age:18
}

(1) put

stringRedisTemplate.opsForHash()
        .put(
            "user:1",
            "name",
            "Tom"
        );

返回:

void

(2) get

Object value = stringRedisTemplate.opsForHash()
            .get(
                "user:1",
                "name"
            );

返回:

Tom

(3) putAll

批量存储

Map<String,String> map = new HashMap<>();

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

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

(4) entries

获取整个Hash

Map<Object,Object> map =
        stringRedisTemplate
                .opsForHash()
                .entries("user:1");

(5) delete

删除字段

Long count = stringRedisTemplate
                .opsForHash()
                .delete(
                    "user:1",
                    "age"
                );

返回:

删除数量

(6) hasKey

判断字段存在

Boolean result = stringRedisTemplate
                .opsForHash()
                .hasKey(
                    "user:1",
                    "name"
                );

4.List 操作

(1) leftPush

头插

Long size = stringRedisTemplate
            .opsForList()
            .leftPush(
                "list",
                "A"
            );

返回:

插入后长度

(2) rightPush

尾插

Long size = stringRedisTemplate
            .opsForList()
            .rightPush(
                "list",
                "B"
            );

(3) range

查询区间

List<String> list = stringRedisTemplate
            .opsForList()
            .range(
                "list",
                0,
                -1
            );

返回全部元素

(4) leftPop

头出队

String value = stringRedisTemplate
            .opsForList()
            .leftPop("list");

(5) rightPop

尾出队

String value = stringRedisTemplate
            .opsForList()
            .rightPop("list");

(6) size

Long size = stringRedisTemplate
            .opsForList()
            .size("list");

5.Set 操作

(1) add

添加元素

Long count = stringRedisTemplate
            .opsForSet()
            .add(
                "user:set",
                "1",
                "2",
                "3"
            );

返回:

新增成功数量

(2) members

获取全部元素

Set<String> set = stringRedisTemplate
            .opsForSet()
            .members(
                "user:set"
            );

(3) isMember

判断元素是否存在

Boolean result = stringRedisTemplate
            .opsForSet()
            .isMember(
                "user:set",
                "1"
            );

(4) remove

删除元素

Long count = stringRedisTemplate
            .opsForSet()
            .remove(
                "user:set",
                "1"
            );

(5) size

Long size = stringRedisTemplate
            .opsForSet()
            .size("user:set");

6.ZSet(有序集合)操作

适用于:

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

(1) add

Boolean result = stringRedisTemplate
            .opsForZSet()
            .add(
                "rank",
                "Tom",
                100
            );

score:

100

(2) incrementScore

分数增加

Double score = stringRedisTemplate
            .opsForZSet()
            .incrementScore(
                "rank",
                "Tom",
                10
            );

返回:

最新score

(3) range

升序查询

Set<String> set = stringRedisTemplate
            .opsForZSet()
            .range(
                "rank",
                0,
                9
            );

(4) reverseRange

降序查询

Set<String> set = stringRedisTemplate
            .opsForZSet()
            .reverseRange(
                "rank",
                0,
                9
            );

(5) rank

获取排名

Long rank = stringRedisTemplate
            .opsForZSet()
            .rank(
                "rank",
                "Tom"
            );

注意:

从0开始

三、RedisTemplate 常见操作

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

RedisTemplate<String,Object>

1.存储对象

User user = new User(1L, "Tom");

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

2.获取对象

User user = (User) redisTemplate
        .opsForValue()
        .get("user:1");

3.setIfAbsent

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

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

Boolean lock = redisTemplate
            .opsForValue()
            .setIfAbsent(
                "lock",
                UUID.randomUUID().toString(),
                30,
                TimeUnit.SECONDS
            );

这是分布式锁常用写法。

3.Hash存储对象

Hash 类似于 Java 中的 Map。

存值和修改值使用 put :

// 相当于:
//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 :

Map<String,Object> userMap = new HashMap<>();

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

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

取值:

Object age = redisTemplate
            .opsForHash()
            .get(
                "user_1",
                "age"
            );

实际项目常用写法

利用 Bean 转 Map:

Map<String,Object> map = BeanUtil.beanToMap(user);

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

所以:Hash存储对象
本质上就是把Java对象拆成Redis Hash

4.multiSet批量存储

普通写法:

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");

批量存储:

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存储

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

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

Redis 中:

orderQueue:
order1
order2

查询:

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

List<Object> list = redisTemplate
            .opsForList()
            .range(
                "orderQueue",
                0,
                -1
            );

四、总结

Java结构Redis结构Template操作
StringStringopsForValue()
ObjectString(Value)opsForValue()
MapHashopsForHash()
ListListopsForList()
SetSetopsForSet()
TreeSet/排行榜ZSetopsForZSet()

可以记住一个核心原则:

opsForValue()
    一个Key对应一个Value

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

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

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

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

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

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

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

1 缓存

ops.set(
    "product:1001",
    json,
    30,
    TimeUnit.MINUTES
);

2 分布式锁

Boolean success =
    ops.setIfAbsent(
        lockKey,
        uuid,
        30,
        TimeUnit.SECONDS
    );

3 计数器

ops.increment(
    "article:view:1"
);

4 排行榜

opsForZSet()
    .incrementScore(
        "rank",
        userId,
        score
    );

5 消息队列(简单场景)

opsForList()
    .rightPush(
        "queue",
        message
    );

6 用户签到

opsForSet()
    .add(
        "sign:20260801",
        userId
    );

以上就是SpringBoot中RedisTemplate与StringRedisTemplate常用Redis API速查的详细内容,更多关于SpringBoot常用Redis API速查的资料请关注脚本之家其它相关文章!

相关文章

  • 一个Java中BigDecimal的问题记录

    一个Java中BigDecimal的问题记录

    这篇文章主要给大家介绍了关于Java中一个BigDecimal问题的相关资料,通过文中介绍的方法可以很方便的解决BigDecimal进行计算的时候不管怎么计算,最后得到的值都没有变化的问题,需要的朋友可以参考下
    2021-11-11
  • Java线程队列LinkedBlockingQueue的使用

    Java线程队列LinkedBlockingQueue的使用

    本文主要介绍了Java线程队列LinkedBlockingQueue的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • idea中javaweb的jsp页面图片加载不出来问题及解决

    idea中javaweb的jsp页面图片加载不出来问题及解决

    这篇文章主要介绍了idea中javaweb的jsp页面图片加载不出来问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 高可用架构etcd选主故障主备秒级切换实现

    高可用架构etcd选主故障主备秒级切换实现

    这篇文章主要为大家介绍了高可用架构etcd选主故障主备秒级切换的实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • mybatis模糊查询、分页和别名配置的方法

    mybatis模糊查询、分页和别名配置的方法

    这篇文章主要介绍了mybatis模糊查询、分页和别名配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java Socket实现多人聊天系统

    Java Socket实现多人聊天系统

    这篇文章主要为大家详细介绍了Java Socket实现多人聊天系统,具有图形界面,实现文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java集合Iterator迭代的实现方法

    Java集合Iterator迭代的实现方法

    这篇文章主要介绍了Java集合Iterator迭代接口的实现方法,非常不错,具有参考借鉴家,对Java 结合iterator知识感兴趣的朋友一起看看吧
    2016-08-08
  • 在IDEA里Git特别慢的问题及解决过程

    在IDEA里Git特别慢的问题及解决过程

    IDEA中Git操作慢的问题可以通过重命名`runnerw.exe`和`runnerw64.exe`文件来解决,这可能是由于杀毒软件或防火墙拦截导致的
    2025-12-12
  • Java 动态代理你真的懂了吗(动态和代理)

    Java 动态代理你真的懂了吗(动态和代理)

    动态代理分两部分,动态和代理,今天通过本文给大家普及代码模式及动态代理的概念及示例代码,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Spring Cloud实现5分钟级区域切换的操作方法

    Spring Cloud实现5分钟级区域切换的操作方法

    Spring Cloud 2023.x通过智能路由预热、多活数据同步和自动化流量切换,实现5分钟内完成跨区域故障转移,本文以某电商平台从AWS亚太切换至阿里云华东的实战为例,详解关键技术路径,需要的朋友可以参考下
    2025-04-04

最新评论