热点

redis判断key是否存在

字号+ 作者:烟消火灭网 来源:知识 2026-10-17 09:05:11 我要评论(0)

打开 redis-cli,敲下 EXISTS mykey,返回 1 或 0。就这么简单。但简单背后有几个坑,踩过的人不少。 先说最基本的。Redis 的 EXISTS 命令用来判断一个 key 是否存

打开 redis-cli,否存敲下 EXISTS mykey,否存返回 1 或 0。否存就这么简单。否存但简单背后有几个坑,否存踩过的否存人不少。

先说最基本的否存。Redis 的否存 EXISTS 命令用来判断一个 key 是否存在于当前数据库中。语法是否存 EXISTS key [key ...],从 Redis 3.0.3 开始支持一次查多个 key,否存返回值是否存存在 key 的数量。注意,否存是否存数量,不是否存布尔值。查一个 key 返回 1 或 0,否存查三个 key 可能返回 0 到 3 之间的任意整数。我见过有人写 if (EXISTS k1 k2) { ...} 然后以为返回的是布尔值,结果 k1 不存在、k2 存在时返回 2,逻辑直接跑飞。用单个 key 的时候没问题,批量查的时候得记住这一点。

时间复杂度是 O(1)。因为 Redis 的 key 查找就是哈希表操作,跟 key 的数量无关,单个 key 的判断几乎不花时间。但批量查 N 个 key 就是 O(N),这个不用多解释。

有个容易忽略的细节:EXISTS 不区分 key 的数据类型。不管这个 key 是 string、list、hash 还是 set,只要存在就返回 1。它只关心 key 本身在不在,不关心 value 是什么。所以你不能用 EXISTS 来判断某个 key 是不是特定的类型。想知道类型,用 TYPE 命令,返回的是 string、list、set、zset、hash 或者 none。

另外一个坑跟过期时间有关。EXISTS 判断的是 key 当前是否有效。如果 key 设了 TTL 并且已经到期,Redis 会把它当作不存在。但这里有个微妙的地方:Redis 的过期删除策略是惰性删除加定期删除,不是到期瞬间就物理删除。也就是说,一个 key 在 TTL 到期后,可能还占着内存,但 EXISTS 会返回 0。逻辑上它已经死了,物理上还没埋。这个区别在排查内存问题时经常让人困惑——DBSIZE 显示的 key 数量和实际逻辑上有效的 key 数量可能对不上。

实际写代码的时候,很多人用 EXISTS 做缓存穿透的防护。比如查用户信息,先看 Redis 里有没有,没有就查数据库再写回 Redis。这个思路没问题,但有个并发场景要注意:两个请求同时判断 key 不存在,同时去查数据库,同时写 Redis。浪费了一次数据库查询,虽然结果不会错,但在高并发下这种重复查询会放大。解决办法是用 SETNX 或者分布式锁来控制,不过那是另一个话题了。

Python 的 redis-py 客户端里,exists 方法返回的是整数。如果传多个 key,返回的也是整数——存在的 key 的数量。Java 的 Jedis 也一样,exists 返回 Boolean(单 key)或 Long(多 key)。用的时候看清楚 API 签名,别想当然。

还有一点,EXISTS 在 Redis 集群模式下只查当前节点。如果用了 Redis Cluster,key 被分散在不同的槽位上,EXISTS 不会跨节点查询。你得确保操作的 key 在同一个节点上,或者用 hash tag 把它们绑到一起。不然查出来的结果可能不完整。这个在单机版 Redis 上不会遇到,但上了集群就容易出问题。

总结一下实际使用中的几个要点:单 key 返回 0/1,多 key 返回存在数量;不区分数据类型;过期但未删除的 key 返回 0;集群模式下只查当前节点。记住这些,基本就不会踩坑了。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 网页怎么发布到网上

    网页怎么发布到网上

    2026-10-17 08:34

  • 酒店网站设计

    酒店网站设计

    2026-10-17 07:37

  • 网站接入协议

    网站接入协议

    2026-10-17 07:18

  • godaddyy邮箱要域名解析吗

    godaddyy邮箱要域名解析吗

    2026-10-17 06:28

网友点评