当前位置:首页 > 问答 > 正文

Redis查询结果全是空白,搞得我一头雾水,不知道问题到底出在哪儿

(引用来源:用户提问)“Redis查询结果全是空白,搞得我一头雾水,不知道问题到底出在哪儿”

这事儿确实挺让人头疼的,你兴冲冲地打开Redis,敲入一个自以为万无一失的命令,满心期待着一排排数据跳出来,结果终端上只给你回了一个冷漠的(nil)或者干脆是一片空白,啥也没有,那种感觉,就像你用力推一扇门,结果发现根本没上锁,轻飘飘地就开了,反而让你自己一个趔趄,愣在原地,别急,这种事儿几乎每个用过Redis的人都遇到过,咱们一步步来捋一捋,看看问题可能藏在哪里。

Redis查询结果全是空白,搞得我一头雾水,不知道问题到底出在哪儿

最最常见,也最容易被自己蠢哭的一个原因就是:你进错“房间”了,Redis有个叫做“数据库”的概念,虽然不像关系型数据库那么复杂,但它默认有16个(编号从0到15),你可以把它想象成一栋楼里的16个房间,你可能在“0号房间”存了数据,但连接的时候,不小心跑到了“1号房间”去找,那肯定是找不到的,检查一下你用的连接工具或者代码里,是不是指定了正确的database编号,通常默认是0号,你可以用SELECT命令来切换房间,比如SELECT 0回到0号库,再看看数据在不在。

你可能记错了钥匙的名字,Redis是基于键值对的,你得用正确的“键”(Key)才能打开对应的“值”(Value),你是不是把键名记错了?比如大小写弄混了,或者多打了一个空格?键名在Redis里是严格区分的,usernameUserName会被当成两个完全不同的键,有个很实用的命令叫KEYS pattern,你可以用KEYS *来列出当前数据库里所有的键(生产环境慎用,数据量大的话可能会卡),看看你以为存在的那个键到底在不在这个列表里,如果在,那你可能就是记错名字了;如果不在,那问题可能出在别处。

Redis查询结果全是空白,搞得我一头雾水,不知道问题到底出在哪儿

要考虑一个“隐身”的情况:数据过期了,Redis可以给数据设置一个存活时间(TTL),就像给食物贴个保质期标签,时间一到,Redis就会自动把这条数据清理掉,干干净净,仿佛从未存在过,你可能之前设置了数据,但同时也设置了一个过期时间,比如60秒,然后你过了好几分钟才去查询,那数据自然就消失了,你可以用TTL key_name这个命令来查看一个键还剩多少秒过期,如果返回的是-2,那就说明这个键已经因为过期而被删除了,所以你查不到。

还有一种可能是,你根本就没存成功,回头检查一下你之前执行插入或更新数据的那个操作,它真的成功了吗?有时候网络闪断,或者命令本身有语法错误,导致你以为存进去了,实际上Redis根本没收到正确的指令,看看当时操作的返回结果是不是OK或者一个表示成功的数字,如果当时就报错了,那查询不到就是必然的。

如果你的数据类型是那种比较复杂的,比如哈希(Hash)或者集合(Set),那还得注意一下查询命令用对了没有,你用一个GET命令去查一个哈希类型的键,那肯定是不行的,因为GET是用来查字符串类型的,这就好比你想用开门的钥匙去发动汽车,肯定不对路,你得用HGET或者HGETALL这样的命令才行,确认一下你存数据时用的数据类型和你查询时用的命令是否匹配。

也不能排除一些更“底层”的问题,你是不是连接错了Redis服务器?也许你本地搭了一个测试的Redis,但你的程序却连到了远程的服务器上,或者,Redis服务器是不是重启过了?如果你没有配置数据持久化,重启后内存里的数据可就全没了,再或者,是不是有别的程序或人为操作,不小心把你用的那个键给删掉了?

你看,从一个简单的“查不到数据”出发,能想到的可能性还真不少,从进错门、拿错钥匙,到数据自己“蒸发”、压根没存上,再到用错了方法,甚至找错了服务器,下次再遇到这种一片空白的情况,别先晕,就按照这个思路,像个侦探一样从上到下排查一遍,多半就能找到那个让你一头雾水的“元凶”了。

Redis查询结果全是空白,搞得我一头雾水,不知道问题到底出在哪儿