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") |
开发必知注意点
- 序列化问题
你代码中用的RedisTemplate<String, Object>默认是 JDK 序列化,存入 Redis 后是二进制乱码,可读性很差。实际开发中建议配置 Jackson JSON 序列化器,把对象存成 JSON 格式,兼顾可读性和自动转换。 - StringRedisTemplate
如果只操作字符串,优先用StringRedisTemplate,它默认就是字符串序列化,不需要额外配置,是业务开发中更常用的版本。 - 命名规范
推荐用业务模块:功能:id的冒号分隔命名,比如user:info:1001,在 Redis 可视化工具中会自动分层显示,结构更清晰。