Redis 中常用的操作方法(基于 Java 生态常用的 Redis 客户端,如 Spring Data Redis/BladeRedis),按功能分类 梳理,覆盖和 keys 同类型的键操作、以及字符串、哈希、列表、集合、有序集合等核心数据结构的常用方法,方便你对照使用。
一、键(Key)相关操作(和 keys 同类型)
这是和你提到的 keys 方法最相关的一类,主要用于操作 Redis 的键本身,而非键对应的数据:
| 方法 | 作用 | 示例(BladeRedis/Spring Data Redis) | 注意事项 |
|---|---|---|---|
keys(pattern) |
匹配符合规则的所有键(如 user:*) |
Set<String> keys = bladeRedis.keys("user:*"); |
线上慎用!遍历全库,数据量大时阻塞 Redis |
exists(keys...) |
判断一个/多个键是否存在 | Boolean exists = bladeRedis.exists("user:1001"); Long count = bladeRedis.exists("user:1001", "order:2002"); |
多键时返回存在的键的数量 |
del(keys...) |
删除一个/多个键 | Long delCount = bladeRedis.del("user:1001", "order:2002"); |
返回成功删除的键的数量 |
expire(key, seconds) |
设置键的过期时间(秒) | Boolean success = bladeRedis.expire("user:1001", 3600); |
返回是否设置成功 |
expireAt(key, timestamp) |
设置键在指定时间戳过期(毫秒/秒,看客户端) | bladeRedis.expireAt("user:1001", System.currentTimeMillis() + 3600*1000); |
时间戳单位需和客户端匹配 |
ttl(key) |
获取键的剩余过期时间(秒) | Long ttl = bladeRedis.ttl("user:1001"); |
返回 -1=永不过期,-2=键不存在 |
pttl(key) |
获取键的剩余过期时间(毫秒) | Long pttl = bladeRedis.pttl("user:1001"); |
精度更高,同上 |
type(key) |
获取键对应的值类型 | String type = bladeRedis.type("user:1001"); |
返回:string/hash/list/set/zset 等 |
rename(oldKey, newKey) |
重命名键(新键存在则覆盖) | bladeRedis.rename("user:1001", "user:new1001"); |
覆盖风险,慎用 |
renamenx(oldKey, newKey) |
重命名键(新键不存在时才成功) | Boolean success = bladeRedis.renamenx("user:1001", "user:new1001"); |
更安全,避免覆盖 |
scan(cursor, pattern) |
迭代式遍历键(替代 keys,非阻塞) | ScanResult<String> result = bladeRedis.scan("0", ScanArgs.Builder.matches("user:*").count(100)); |
线上推荐用,分批遍历,无阻塞 |
二、字符串(String)操作(最常用的数据结构)
Redis 最基础的键值对类型,值为字符串(也可存数字、二进制):
| 方法 | 作用 | 示例 |
|---|---|---|
set(key, value) |
设置键值对 | bladeRedis.set("user:1001:name", "张三"); |
setnx(key, value) |
仅当键不存在时设置 | Boolean success = bladeRedis.setnx("user:1001:name", "张三"); |
setex(key, seconds, value) |
设置键值对并指定过期时间 | bladeRedis.setex("user:1001:token", 3600, "abc123"); |
get(key) |
获取键对应的值 | String name = bladeRedis.get("user:1001:name"); |
getset(key, value) |
获取旧值并设置新值 | String oldToken = bladeRedis.getset("user:1001:token", "def456"); |
incr(key) |
数字值自增 1 | Long num = bladeRedis.incr("counter:login"); |
incrby(key, delta) |
数字值自增指定步长 | Long num = bladeRedis.incrby("counter:login", 5); |
decr(key) |
数字值自减 1 | Long num = bladeRedis.decr("counter:stock"); |
decrby(key, delta) |
数字值自减指定步长 | Long num = bladeRedis.decrby("counter:stock", 2); |
append(key, value) |
追加字符串到值末尾 | Long newLen = bladeRedis.append("user:1001:desc", " - 会员"); |
三、哈希(Hash)操作(适合存对象)
值是键值对集合,适合存储结构化数据(如用户信息),无需序列化:
| 方法 | 作用 | 示例 |
|---|---|---|
hset(key, field, value) |
设置哈希中指定字段的值 | bladeRedis.hset("user:1001", "name", "张三"); |
hsetnx(key, field, value) |
仅当字段不存在时设置 | Boolean success = bladeRedis.hsetnx("user:1001", "age", "20"); |
hget(key, field) |
获取哈希中指定字段的值 | String name = bladeRedis.hget("user:1001", "name"); |
hmget(key, fields...) |
获取哈希中多个字段的值 | List<String> values = bladeRedis.hmget("user:1001", "name", "age"); |
hmset(key, map) |
批量设置哈希的字段和值 | Map<String, String> map = new HashMap<>(); map.put("name", "张三"); map.put("age", "20"); bladeRedis.hmset("user:1001", map); |
hkeys(key) |
获取哈希中所有字段 | Set<String> fields = bladeRedis.hkeys("user:1001"); |
hvals(key) |
获取哈希中所有值 | List<String> values = bladeRedis.hvals("user:1001"); |
hdel(key, fields...) |
删除哈希中指定字段 | Long delCount = bladeRedis.hdel("user:1001", "age", "desc"); |
hexists(key, field) |
判断哈希中字段是否存在 | Boolean exists = bladeRedis.hexists("user:1001", "name"); |
hincrby(key, field, delta) |
哈希字段值自增指定步长 | Long num = bladeRedis.hincrby("user:1001", "score", 10); |
四、列表(List)操作(有序、可重复)
基于双向链表实现,适合做队列、栈、消息列表等:
| 方法 | 作用 | 示例 |
|---|---|---|
lpush(key, values...) |
从列表左侧(头部)添加元素 | Long len = bladeRedis.lpush("list:msg", "msg1", "msg2"); |
rpush(key, values...) |
从列表右侧(尾部)添加元素 | Long len = bladeRedis.rpush("list:msg", "msg3", "msg4"); |
lpop(key) |
从列表左侧弹出元素 | String msg = bladeRedis.lpop("list:msg"); |
rpop(key) |
从列表右侧弹出元素 | String msg = bladeRedis.rpop("list:msg"); |
lrange(key, start, end) |
获取列表指定范围的元素 | List<String> msgs = bladeRedis.lrange("list:msg", 0, -1); |
llen(key) |
获取列表长度 | Long len = bladeRedis.llen("list:msg"); |
lrem(key, count, value) |
删除列表中指定元素 | Long delCount = bladeRedis.lrem("list:msg", 2, "msg1"); |
lindex(key, index) |
获取列表指定索引的元素 | String msg = bladeRedis.lindex("list:msg", 1); |
五、集合(Set)操作(无序、不可重复)
基于哈希表实现,适合做去重、交集/并集/差集计算:
| 方法 | 作用 | 示例 |
|---|---|---|
sadd(key, members...) |
向集合添加元素 | Long addCount = bladeRedis.sadd("set:user:1001:tags", "运动", "音乐"); |
smembers(key) |
获取集合所有元素 | Set<String> tags = bladeRedis.smembers("set:user:1001:tags"); |
srem(key, members...) |
删除集合中指定元素 | Long delCount = bladeRedis.srem("set:user:1001:tags", "运动"); |
sismember(key, member) |
判断元素是否在集合中 | Boolean exists = bladeRedis.sismember("set:user:1001:tags", "音乐"); |
scard(key) |
获取集合元素个数 | Long size = bladeRedis.scard("set:user:1001:tags"); |
sinter(keys...) |
求多个集合的交集 | Set<String> common = bladeRedis.sinter("set:user:1001:tags", "set:user:1002:tags"); |
sunion(keys...) |
求多个集合的并集 | Set<String> all = bladeRedis.sunion("set:user:1001:tags", "set:user:1002:tags"); |
sdiff(keys...) |
求多个集合的差集 | Set<String> diff = bladeRedis.sdiff("set:user:1001:tags", "set:user:1002:tags"); |
六、有序集合(ZSet)操作(有序、不可重复,带分值)
在 Set 基础上增加了分值(score),可按分值排序,适合做排行榜、权重排序:
| 方法 | 作用 | 示例 |
|---|---|---|
zadd(key, score, member) |
向有序集合添加元素(带分值) | Boolean success = bladeRedis.zadd("zset:rank", 95.0, "张三"); |
zrange(key, start, end) |
按分值升序获取指定范围元素 | Set<String> rank = bladeRedis.zrange("zset:rank", 0, 9); |
zrevrange(key, start, end) |
按分值降序获取指定范围元素 | Set<String> top10 = bladeRedis.zrevrange("zset:rank", 0, 9); |
zscore(key, member) |
获取元素的分值 | Double score = bladeRedis.zscore("zset:rank", "张三"); |
zrem(key, members...) |
删除有序集合中指定元素 | Long delCount = bladeRedis.zrem("zset:rank", "张三", "李四"); |
zcard(key) |
获取有序集合元素个数 | Long size = bladeRedis.zcard("zset:rank"); |
zincrby(key, increment, member) |
给元素的分值增加指定值 | Double newScore = bladeRedis.zincrby("zset:rank", 5.0, "张三"); |
总结
- 键操作核心 :
keys慎用,线上优先用scan;exists/del/expire是日常高频键操作; - 数据结构选择:字符串(简单键值)、哈希(结构化对象)、列表(队列/栈)、集合(去重/集合运算)、有序集合(排行榜)是 Redis 最常用的5类结构;
- 性能注意 :
keys、hkeys、smembers等全量遍历方法,数据量大时会阻塞 Redis,优先用分批/迭代方法(如scan)。