综合

redis获取key的类型

时间:2010-12-5 17:23:32  作者:热点   来源:热点  查看:  评论:0
内容摘要: Redis里存的数据,类型决定了你能对它做什么。很多人栽跟头就栽在这——明明存了个字符串,却拿它当哈希使,结果返回错误,一脸懵。 要查类型,最简单的办法就是TYPE key。连上redis-cli,

Redis里存的数据,类型决定了你能对它做什么。很多人栽跟头就栽在这——明明存了个字符串,却拿它当哈希使,结果返回错误,一脸懵。

要查类型,最简单的办法就是TYPE key。连上redis-cli,敲进去,回车,它直接告诉你答案:string、list、hash、set、zset,或者none(表示这key不存在)。这命令快得很,O(1)复杂度,不伤性能,随便用。

但有个坑你得知道——TYPE返回的是key的底层编码类型,不是逻辑类型。啥意思?比如你用SET存了个整数,Redis可能用int编码存,但TYPE照样返回string,因为逻辑上它就是字符串。真正想看底层编码,得用OBJECT ENCODING key,这个返回的是int、embstr、raw、ziplist、hashtable这些玩意儿。不过说实话,日常调试用不到这么深,除非你在做性能优化或者排查内存异常。

还有一种情况——你拿到一个key,不确定它是不是你要的类型,又不想先查再操作,那可以用EXPIRE配合TTL先探探路?不行,这跟类型没关系。更好的做法是直接用对应类型的命令去试探,比如HGET key field如果报错WRONGTYPE,说明它不是哈希。这种方法虽然粗暴,但胜在直接,省一次RTT。

我见过一个真实案例。有个哥们儿用SET存了个JSON字符串,后来想单独改里面某个字段,直接HGET,报错。他愣了半天,最后发现存错了类型。要是他当时先敲个TYPE,三秒钟就发现问题。这玩意儿就是防呆用的,别嫌麻烦。

还有一点容易被忽略——TYPE对不存在的key返回none,但如果你用了EXISTS先判断,再查类型,中间这key可能被别的线程删了,或者类型被改了。Redis单线程处理命令,但命令之间不是原子的,所以如果你在写脚本,最好用TYPE返回的结果直接做逻辑判断,别分两步走,否则会有竞态条件。

最后提醒个冷知识:Redis 6.0之后支持了TYPE的批量版本吗?没有,它不支持批量。你要查多个key,只能循环,或者用pipeline。但pipeline里每个命令还是独立返回的,不影响。

所以,记住一句话——凡是操作key之前,先问一句它是什么类型。这习惯养成了,能少踩一半的坑。别问我另一半坑在哪,那得看你的数据怎么写了。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap