SpringDataRedis 操作 redis

Spring Data Redis 完全按照 Redis 的数据类型做了模块化封装,和原生命令一一对应。

下面我按「通用Key操作 + 5大核心数据类型」分类整理,每个方法都标注等价的 Redis 原生命令和可直接运行的代码示例,方便你对照记忆。


一、通用 Key 操作(所有数据类型通用)

这部分是所有数据类型共用的基础操作,直接通过 redisTemplate 调用,不需要先获取 ops 操作器。

Java 方法 功能说明 等价 Redis 原生命令 代码示例
hasKey(key) 判断 key 是否存在 EXISTS key redisTemplate.hasKey("demo:name")
delete(key) 删除指定 key DEL key redisTemplate.delete("demo:name")
expire(key, 时间, 单位) 给 key 设置过期时间 EXPIRE key 秒数 redisTemplate.expire("demo:name", 60, TimeUnit.SECONDS)
getExpire(key) 获取 key 剩余过期时间(秒) TTL key redisTemplate.getExpire("demo:name")
persist(key) 移除 key 的过期时间,永久保存 PERSIST key redisTemplate.persist("demo:name")
rename(oldKey, newKey) 修改 key 名称 RENAME oldKey newKey redisTemplate.rename("demo:name", "demo:username")
type(key) 返回 key 存储的数据类型 TYPE key redisTemplate.type("demo:name")

二、字符串类型 String → opsForValue()

对应 Redis 最基础的 String 类型,支持普通字符串、数字、序列化对象存储,是开发中最常用的类型。

操作入口redisTemplate.opsForValue()

Java 方法 功能说明 等价 Redis 原生命令 代码示例
set(key, value) 普通存入键值对 SET key value ops.set("demo:name", "张三")
set(key, value, 时间, 单位) 存入并设置过期时间 SET key value EX 秒数 / SETEX ops.set("demo:name", "张三", 60, TimeUnit.SECONDS)
setIfAbsent(key, value) key 不存在时才存入(分布式锁核心) SETNX key value ops.setIfAbsent("lock:order", "1", 30, TimeUnit.SECONDS)
setIfPresent(key, value) key 存在时才存入 SET key value XX ops.setIfPresent("demo:name", "李四")
get(key) 获取 key 对应的值 GET key ops.get("demo:name")
getAndSet(key, value) 获取旧值并设置新值 GETSET key value ops.getAndSet("demo:name", "王五")
increment(key, 步长) 数值原子递增(用于计数) INCRBY key 步长 ops.increment("demo:viewCount", 1)
decrement(key, 步长) 数值原子递减 DECRBY key 步长 ops.decrement("demo:stock", 1)
multiSet(Map) 批量设置多个键值对 MSET ops.multiSet(Map.of("k1","v1","k2","v2"))
multiGet(Collection) 批量获取多个 key 的值 MGET ops.multiGet(List.of("k1", "k2"))

小提示:increment 是原子操作,非常适合做点赞数、浏览量、库存扣减等计数场景。


三、哈希类型 Hash → opsForHash()

对应 Redis Hash 类型,类似 Java 的 Map,适合存储对象的字段属性,不用序列化整个对象,可单独修改单个字段。

操作入口redisTemplate.opsForHash()

Java 方法 功能说明 等价 Redis 原生命令 代码示例
put(key, field, value) 存入单个字段 HSET key field value ops.put("demo:user", "name", "张三")
putAll(key, Map) 批量存入多个字段 HMSET key field1 value1... ops.putAll("demo:user", Map.of("age",20,"gender","男"))
get(key, field) 获取单个字段的值 HGET key field ops.get("demo:user", "name")
entries(key) 获取所有字段和值 HGETALL key ops.entries("demo:user")
keys(key) 获取所有字段名 HKEYS key ops.keys("demo:user")
values(key) 获取所有字段值 HVALS key ops.values("demo:user")
delete(key, fields...) 删除指定字段 HDEL key field1 field2 ops.delete("demo:user", "age", "gender")
hasKey(key, field) 判断字段是否存在 HEXISTS key field ops.hasKey("demo:user", "name")
increment(key, field, 步长) 指定字段数值递增 HINCRBY key field 步长 ops.increment("demo:user", "score", 5)
size(key) 获取字段数量 HLEN key ops.size("demo:user")

四、列表类型 List → opsForList()

对应 Redis List 类型,有序、可重复,支持两端插入弹出,适合实现简单队列、栈、最新列表等场景。

操作入口redisTemplate.opsForList()

Java 方法 功能说明 等价 Redis 原生命令 代码示例
leftPush(key, value) 从列表左侧(头部)插入元素 LPUSH key value ops.leftPush("demo:msgList", "消息1")
rightPush(key, value) 从列表右侧(尾部)插入元素 RPUSH key value ops.rightPush("demo:msgList", "消息2")
leftPop(key) 从左侧弹出一个元素 LPOP key ops.leftPop("demo:msgList")
rightPop(key) 从右侧弹出一个元素 RPOP key ops.rightPop("demo:msgList")
range(key, start, end) 按索引范围获取元素(0到-1是全部) LRANGE key start end ops.range("demo:msgList", 0, -1)
size(key) 获取列表长度 LLEN key ops.size("demo:msgList")
index(key, index) 获取指定索引位置的元素 LINDEX key index ops.index("demo:msgList", 0)
remove(key, count, value) 删除指定个数的匹配元素 LREM key count value ops.remove("demo:msgList", 1, "消息1")
trim(key, start, end) 截取列表,保留指定范围 LTRIM key start end ops.trim("demo:msgList", 0, 9)

常用场景:左进右出 = 队列(先进先出);左进左出 = 栈(先进后出);trim 常用来保留最新的N条记录。


五、集合类型 Set → opsForSet()

对应 Redis Set 类型,无序、不可重复,支持交集、并集、差集运算,适合去重、标签、共同好友等场景。

操作入口redisTemplate.opsForSet()

Java 方法 功能说明 等价 Redis 原生命令 代码示例
add(key, values...) 添加一个或多个元素 SADD key v1 v2 ops.add("demo:tags", "Java", "Spring", "Redis")
remove(key, values...) 删除一个或多个元素 SREM key v1 v2 ops.remove("demo:tags", "Redis")
isMember(key, value) 判断元素是否在集合中 SISMEMBER key value ops.isMember("demo:tags", "Java")
members(key) 获取集合中所有元素 SMEMBERS key ops.members("demo:tags")
size(key) 获取集合元素个数 SCARD key ops.size("demo:tags")
intersect(key1, key2) 两个集合的交集 SINTER key1 key2 ops.intersect("user1:tags", "user2:tags")
union(key1, key2) 两个集合的并集 SUNION key1 key2 ops.union("user1:tags", "user2:tags")
difference(key1, key2) 两个集合的差集 SDIFF key1 key2 ops.difference("user1:tags", "user2:tags")
randomMember(key) 随机获取一个元素 SRANDMEMBER key ops.randomMember("demo:tags")

六、有序集合类型 ZSet → opsForZSet()

对应 Redis ZSet 类型,不可重复、每个元素带一个分数(score),按分数自动排序,是实现排行榜、热度排名的首选。

操作入口redisTemplate.opsForZSet()

Java 方法 功能说明 等价 Redis 原生命令 代码示例
add(key, value, score) 添加元素+分数 ZADD key score value ops.add("demo:rank", "张三", 95)
remove(key, values...) 删除元素 ZREM key v1 v2 ops.remove("demo:rank", "张三")
range(key, start, end) 按索引升序获取元素 ZRANGE key start end ops.range("demo:rank", 0, -1)
reverseRange(key, start, end) 按索引降序获取元素 ZREVRANGE key start end ops.reverseRange("demo:rank", 0, 9)
rangeByScore(key, min, max) 按分数范围升序获取 ZRANGEBYSCORE key min max ops.rangeByScore("demo:rank", 60, 100)
rank(key, value) 获取元素升序排名(从0开始) ZRANK key value ops.rank("demo:rank", "张三")
reverseRank(key, value) 获取元素降序排名 ZREVRANK key value ops.reverseRank("demo:rank", "张三")
incrementScore(key, value, delta) 增加元素的分数 ZINCRBY key delta value ops.incrementScore("demo:rank", "张三", 5)
size(key) 获取集合元素个数 ZCARD key ops.size("demo:rank")

开发必知注意点

  1. 序列化问题
    你代码中用的 RedisTemplate<String, Object> 默认是 JDK 序列化,存入 Redis 后是二进制乱码,可读性很差。实际开发中建议配置 Jackson JSON 序列化器,把对象存成 JSON 格式,兼顾可读性和自动转换。
  2. StringRedisTemplate
    如果只操作字符串,优先用 StringRedisTemplate,它默认就是字符串序列化,不需要额外配置,是业务开发中更常用的版本。
  3. 命名规范
    推荐用 业务模块:功能:id 的冒号分隔命名,比如 user:info:1001,在 Redis 可视化工具中会自动分层显示,结构更清晰。
相关推荐
JasmineWr1 小时前
Spring BeanDefinition 与 Bean 生命周期、循环依赖解析
java·后端·spring
dzl843941 小时前
微服务基座
java
QQ_21696290961 小时前
【项目编号:project86564】SpringBoot供应链管理系统:采购、供应商、库存、销售、统计报表一体化实战
java·spring boot·后端
m0_587383001 小时前
课程培训系统开发实战:从技术选型到核心模块设计
java·spring boot·架构·系统架构
lskblog1 小时前
Ubuntu 18.04 安装 LibreOffice(用于 Word 在线预览转换)
java·linux·python·ubuntu·word·php·laravel
TO_ZRG1 小时前
Unity 编辑器之 SettingsProvider、Hierarchy、Project、SearchField
java·unity·编辑器
吴声子夜歌2 小时前
Java面试——Spark原理及应用(二)
java·面试·spark
敲上瘾2 小时前
Redis持久化存储机制:从RDB到AOF再到混合持久化的配置与实践
linux·数据库·redis·缓存
吴声子夜歌2 小时前
Java面试——Spark原理及应用(一)
java·面试·spark