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();}}三、注意事项
- 序列化问题:务必配置
RedisTemplate序列化规则,否则会出现 key 乱码(如\xAC\xED\x00\x05t\x00\x03key)。 - 过期时间:
setIfAbsent建议直接设置过期时间,避免死锁(Redis 2.6.12+ 支持)。 - 性能优化:
- 批量操作使用
deleteBatch、mGet等批量 API,减少网络往返; - 避免使用
keys *等模糊查询,生产环境推荐scan命令;
- 批量操作使用
- 数据类型匹配:操作 API 需与 Redis 实际数据类型匹配(如用
opsForHash操作 String 类型 Key 会报错)。 - 连接池配置:生产环境务必配置 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);}}