news 2025/12/18 15:26:21

redis入门全网最详细:Spring Data Redis 常用 API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
redis入门全网最详细:Spring Data Redis 常用 API

Spring Data Redis 常用 API 整理

本文整理 Spring Data Redis 核心操作 API,基于 Spring Boot 环境,代码可直接复制使用,涵盖字符串、哈希、列表、集合、有序集合及通用操作等核心场景。

一、基础准备

1.1 依赖引入(Maven)

<!-- Spring Data Redis 核心依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 可选:Lettuce 连接池(默认内置,需配置连接池依赖) --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

1.2 核心配置(RedisTemplate 序列化配置)

默认RedisTemplate序列化会导致 key/value 乱码,建议自定义配置:

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;@ConfigurationpublicclassRedisConfig{@BeanpublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryconnectionFactory){RedisTemplate<String,Object>redisTemplate=newRedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);// Key 序列化:String 序列化StringRedisSerializerstringRedisSerializer=newStringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);// Value 序列化:JSON 序列化(支持对象)GenericJackson2JsonRedisSerializerjsonRedisSerializer=newGenericJackson2JsonRedisSerializer();redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);redisTemplate.afterPropertiesSet();returnredisTemplate;}

1.3 核心组件说明

组件用途
RedisTemplate通用 Redis 操作模板,支持任意类型 Key/Value(需配置序列化)
StringRedisTemplate专用字符串操作模板,默认 String 序列化,无需额外配置,适合纯字符串场景

二、核心 API 示例

2.1 字符串(String)- 最常用

适用于:缓存单个值、计数器、分布式锁等场景。

importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Component;importjavax.annotation.Resource;importjava.util.concurrent.TimeUnit;@ComponentpublicclassRedisStringDemo{@ResourceprivateRedisTemplate<String,Object>redisTemplate;// ========== 基础操作 ==========// 1. 设置值(无过期时间)publicvoidset(Stringkey,Objectvalue){redisTemplate.opsForValue().set(key,value);}// 2. 设置值 + 过期时间publicvoidsetWithExpire(Stringkey,Objectvalue,longtimeout,TimeUnitunit){redisTemplate.opsForValue().set(key,value,timeout,unit);}// 3. 获取值publicObjectget(Stringkey){returnredisTemplate.opsForValue().get(key);}// 4. 删除值publicBooleandelete(Stringkey){returnredisTemplate.delete(key);}// ========== 进阶操作 ==========// 5. 仅当 key 不存在时设置(分布式锁核心)publicBooleansetIfAbsent(Stringkey,Objectvalue,longtimeout,TimeUnitunit){returnredisTemplate.opsForValue().setIfAbsent(key,value,timeout,unit);}// 6. 数值递增(计数器)publicLongincrement(Stringkey,longdelta){returnredisTemplate.opsForValue().increment(key,delta);}// 7. 数值递减publicLongdecrement(Stringkey,longdelta){returnredisTemplate.opsForValue().decrement(key,delta);}// 8. 获取字符串长度publicLongsize(Stringkey){returnredisTemplate.opsForValue().size(key);}}

2.2 哈希(Hash)

适用于:缓存对象(如用户信息)、结构化数据,无需序列化整个对象,可单独操作字段。

@ComponentpublicclassRedisHashDemo{@ResourceprivateRedisTemplate<String,Object>redisTemplate;// ========== 基础操作 ==========// 1. 设置哈希字段值publicvoidhSet(Stringkey,StringhashKey,Objectvalue){redisTemplate.opsForHash().put(key,hashKey,value);}// 2. 获取哈希字段值publicObjecthGet(Stringkey,StringhashKey){returnredisTemplate.opsForHash().get(key,hashKey);}// 3. 获取哈希所有字段和值publicObjecthGetAll(Stringkey){returnredisTemplate.opsForHash().entries(key);}// 4. 获取哈希所有字段名publicSet<Object>hKeys(Stringkey){returnredisTemplate.opsForHash().keys(key);}// 5. 获取哈希所有值publicList<Object>hVals(Stringkey){returnredisTemplate.opsForHash().values(key);}// ========== 进阶操作 ==========// 6. 删除哈希指定字段publicLonghDelete(Stringkey,Object...hashKeys){returnredisTemplate.opsForHash().delete(key,hashKeys);}// 7. 判断哈希字段是否存在publicBooleanhExists(Stringkey,StringhashKey){returnredisTemplate.opsForHash().hasKey(key,hashKey);}// 8. 哈希字段数值递增publicLonghIncrement(Stringkey,StringhashKey,longdelta){returnredisTemplate.opsForHash().increment(key,hashKey,delta);}}

2.3 列表(List)

适用于:队列、栈、消息列表等场景(有序、可重复)。

@ComponentpublicclassRedisListDemo{@ResourceprivateRedisTemplate<String,Object>redisTemplate;// ========== 基础操作 ==========// 1. 左压入(队列头部)publicLonglPush(Stringkey,Object...values){returnredisTemplate.opsForList().leftPushAll(key,values);}// 2. 右压入(队列尾部)publicLongrPush(Stringkey,Object...values){returnredisTemplate.opsForList().rightPushAll(key,values);}// 3. 左弹出(队列头部)publicObjectlPop(Stringkey){returnredisTemplate.opsForList().leftPop(key);}// 4. 右弹出(队列尾部)publicObjectrPop(Stringkey){returnredisTemplate.opsForList().rightPop(key);}// 5. 获取列表指定范围元素(start=0, end=-1 表示所有)publicList<Object>lRange(Stringkey,longstart,longend){returnredisTemplate.opsForList().range(key,start,end);}// ========== 进阶操作 ==========// 6. 获取列表长度publicLonglSize(Stringkey){returnredisTemplate.opsForList().size(key);}// 7. 根据索引获取元素publicObjectlIndex(Stringkey,longindex){returnredisTemplate.opsForList().index(key,index);}// 8. 删除列表中指定值(count=0 删除所有,count>0 删前N个,count<0 删后N个)publicLonglRemove(Stringkey,longcount,Objectvalue){returnredisTemplate.opsForList().remove(key,count,value);}}

2.4 集合(Set)

适用于:去重、交集/并集/差集计算(如共同好友、标签)。

@ComponentpublicclassRedisSetDemo{@ResourceprivateRedisTemplate<String,Object>redisTemplate;// ========== 基础操作 ==========// 1. 添加元素publicLongsAdd(Stringkey,Object...values){returnredisTemplate.opsForSet().add(key,values);}// 2. 获取集合所有元素publicSet<Object>sMembers(Stringkey){returnredisTemplate.opsForSet().members(key);}// 3. 判断元素是否在集合中publicBooleansIsMember(Stringkey,Objectvalue){returnredisTemplate.opsForSet().isMember(key,value);}// 4. 删除元素publicLongsRemove(Stringkey,Object...values){returnredisTemplate.opsForSet().remove(key,values);}// ========== 进阶操作 ==========// 5. 获取集合大小publicLongsSize(Stringkey){returnredisTemplate.opsForSet().size(key);}// 6. 计算两个集合的交集publicSet<Object>sIntersect(Stringkey1,Stringkey2){returnredisTemplate.opsForSet().intersect(key1,key2);}// 7. 计算两个集合的并集publicSet<Object>sUnion(Stringkey1,Stringkey2){returnredisTemplate.opsForSet().union(key1,key2);}// 8. 计算两个集合的差集(key1 有,key2 无)publicSet<Object>sDifference(Stringkey1,Stringkey2){returnredisTemplate.opsForSet().difference(key1,key2);}}

2.5 有序集合(ZSet)

适用于:排行榜、带权重的排序场景(如积分排名、热度排序)。

@ComponentpublicclassRedisZSetDemo{@ResourceprivateRedisTemplate<String,Object>redisTemplate;// ========== 基础操作 ==========// 1. 添加元素(带分数)publicBooleanzAdd(Stringkey,Objectvalue,doublescore){returnredisTemplate.opsForZSet().add(key,value,score);}// 2. 按分数升序获取指定范围元素(start=0, end=-1 表示所有)publicSet<Object>zRange(Stringkey,longstart,longend){returnredisTemplate.opsForZSet().range(key,start,end);}// 3. 按分数降序获取指定范围元素publicSet<Object>zReverseRange(Stringkey,longstart,longend){returnredisTemplate.opsForZSet().reverseRange(key,start,end);}// 4. 获取元素的分数publicDoublezScore(Stringkey,Objectvalue){returnredisTemplate.opsForZSet().score(key,value);}// ========== 进阶操作 ==========// 5. 删除元素publicLongzRemove(Stringkey,Object...values){returnredisTemplate.opsForZSet().remove(key,values);}// 6. 获取集合大小publicLongzSize(Stringkey){returnredisTemplate.opsForZSet().size(key);}// 7. 元素分数递增publicDoublezIncrementScore(Stringkey,Objectvalue,doubledelta){returnredisTemplate.opsForZSet().incrementScore(key,value,delta);}// 8. 获取元素的排名(升序,从0开始)publicLongzRank(Stringkey,Objectvalue){returnredisTemplate.opsForZSet().rank(key,value);}}

2.6 通用操作

适用于:所有类型 Key 的通用管理(过期时间、存在性、删除等)。

@ComponentpublicclassRedisCommonDemo{@ResourceprivateRedisTemplate<String,Object>redisTemplate;// 1. 设置Key过期时间publicBooleanexpire(Stringkey,longtimeout,TimeUnitunit){returnredisTemplate.expire(key,timeout,unit);}// 2. 获取Key过期时间(返回秒数,-1=永不过期,-2=不存在)publicLonggetExpire(Stringkey){returnredisTemplate.getExpire(key);}// 3. 判断Key是否存在publicBooleanexists(Stringkey){returnredisTemplate.hasKey(key);}// 4. 删除多个KeypublicLongdeleteBatch(String...keys){returnredisTemplate.delete(keys);}// 5. 模糊查询Key(慎用!生产环境keys命令会阻塞Redis)publicSet<String>keys(Stringpattern){returnredisTemplate.keys(pattern);}// 6. 移除Key的过期时间(设为永不过期)publicBooleanpersist(Stringkey){returnredisTemplate.persist(key);}// 7. 获取Key的类型(string/hash/list/set/zset)publicStringtype(Stringkey){returnredisTemplate.type(key).name();}}

三、注意事项

  1. 序列化问题:务必配置RedisTemplate序列化规则,否则会出现 key 乱码(如\xAC\xED\x00\x05t\x00\x03key)。
  2. 过期时间setIfAbsent建议直接设置过期时间,避免死锁(Redis 2.6.12+ 支持)。
  3. 性能优化
    • 批量操作使用deleteBatchmGet等批量 API,减少网络往返;
    • 避免使用keys *等模糊查询,生产环境推荐scan命令;
  4. 数据类型匹配:操作 API 需与 Redis 实际数据类型匹配(如用opsForHash操作 String 类型 Key 会报错)。
  5. 连接池配置:生产环境务必配置 Lettuce 连接池,避免频繁创建/销毁连接:
    spring:redis:host:127.0.0.1port:6379password:123456lettuce:pool:max-active:8# 最大连接数max-idle:8# 最大空闲连接min-idle:0# 最小空闲连接max-wait:-1ms# 连接等待时间

四、StringRedisTemplate 简化示例

若仅操作字符串,可直接使用StringRedisTemplate,无需配置序列化:

@ComponentpublicclassStringRedisDemo{@ResourceprivateStringRedisTemplatestringRedisTemplate;publicvoidstringOps(){// 设置值stringRedisTemplate.opsForValue().set("name","张三");// 获取值Stringname=stringRedisTemplate.opsForValue().get("name");// 设置过期时间stringRedisTemplate.opsForValue().set("age","20",1,TimeUnit.HOURS);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/17 3:34:45

LobeChat产品演示视频文案

LobeChat&#xff1a;打造现代化AI聊天应用的开源基石 在大语言模型&#xff08;LLM&#xff09;席卷全球的今天&#xff0c;我们早已不再满足于“能对话”的AI——用户期待的是流畅、智能、个性化的交互体验。而开发者面临的挑战也愈发清晰&#xff1a;如何将强大的后端模型能…

作者头像 李华
网站建设 2025/12/17 3:34:07

Ofd2Pdf完整教程:OFD转PDF的终极解决方案

Ofd2Pdf完整教程&#xff1a;OFD转PDF的终极解决方案 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 还在为OFD文件无法直接查看而烦恼吗&#xff1f;Ofd2Pdf这款文档转换工具能够帮你轻松解决这个问…

作者头像 李华
网站建设 2025/12/17 3:33:38

浏览器下载管理革命:如何用Motrix扩展告别龟速下载时代

浏览器下载管理革命&#xff1a;如何用Motrix扩展告别龟速下载时代 【免费下载链接】motrix-webextension A browser extension for the Motrix Download Manager 项目地址: https://gitcode.com/gh_mirrors/mo/motrix-webextension 还在忍受浏览器下载的缓慢速度吗&…

作者头像 李华
网站建设 2025/12/17 3:32:54

7、量子世界:奇异粒子、费曼图与对称性的奥秘

量子世界:奇异粒子、费曼图与对称性的奥秘 1. 虚拟粒子的奇异特性 在量子场论的世界里,虚拟粒子是一种极为奇特的存在。在费曼图中,入射和出射粒子被称为“壳上”粒子,因为它们符合爱因斯坦能量、动量和质量方程所描绘的“质量壳”结构。与之相对,费曼图中入射和出射轨迹…

作者头像 李华
网站建设 2025/12/17 3:32:31

21、量子计算高级算法:无结构搜索与整数分解

量子计算高级算法:无结构搜索与整数分解 扩展练习 以下是一些量子计算相关的扩展练习题目及解析: 1. 选择对合门 :从列表(S, T, X, Y, H)中选择3个对合门(对合门满足其自身等于其逆,即M = M⁻)。 2. T门的相位值 :T门作为相位门,其相位值是多少? 3. 使量子…

作者头像 李华
网站建设 2025/12/17 3:31:35

LobeChat视频号标题优化建议

LobeChat&#xff1a;如何打造一个真正“好用”的AI交互平台&#xff1f; 在今天&#xff0c;大语言模型的能力已经强到让人惊叹——写代码、写文章、做推理&#xff0c;样样精通。但你有没有遇到过这样的情况&#xff1a;好不容易跑通了一个本地模型&#xff0c;结果面对一片空…

作者头像 李华