Redis 中常用的操作方法

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, "张三");

总结

  1. 键操作核心keys 慎用,线上优先用 scanexists/del/expire 是日常高频键操作;
  2. 数据结构选择:字符串(简单键值)、哈希(结构化对象)、列表(队列/栈)、集合(去重/集合运算)、有序集合(排行榜)是 Redis 最常用的5类结构;
  3. 性能注意keyshkeyssmembers 等全量遍历方法,数据量大时会阻塞 Redis,优先用分批/迭代方法(如 scan)。
相关推荐
white-persist2 小时前
【红队渗透】Cobalt Strike(CS)红队详细用法实战手册
java·网络·数据结构·python·算法·安全·web安全
Arya_aa2 小时前
编程题:实现汽车租赁公司汽车出租方案
java
geovindu2 小时前
python: Adapter Pattern
java·python·设计模式·适配器模式
蜜獾云2 小时前
设计模式之工厂方法模式(5):稍微复杂一点的工厂模式
java·设计模式·工厂方法模式
Voyager_42 小时前
吃透设计模式:从原理到落地(如何选型),Java/Spring开发场景
java·spring·设计模式
技术人生黄勇2 小时前
微信接入|企业微信官方插件支持 OpenClaw 3步快速接入(实操版)
java·前端·人工智能·微信·企业微信
崔小汤2 小时前
SpringAI实战之结构化输出
java·ai
qq_246839752 小时前
Redis lua 执行性能优化
redis·性能优化·lua
倔强的石头_2 小时前
MySQL 兼容性深度解析:从内核级优化到“零修改”迁移工程实践
前端·数据库