WRONGTYPE 对持有错误值 php 的键的操作

Posted

技术标签:

【中文标题】WRONGTYPE 对持有错误值 php 的键的操作【英文标题】:WRONGTYPE Operation against a key holding the wrong kind of value php 【发布时间】:2016-10-23 12:13:25 【问题描述】:

您好,我正在将 Laravel 与 Redis 一起使用。当我尝试通过 get 方法访问密钥时,会出现以下错误“针对持有错误类型值的密钥的 WRONGTYPE 操作”

我正在使用以下代码来访问键值 -

我用这段代码从redis获取数据

$values = "l_messages";
$value = $redis->HGETALL($values);
print($value);

【问题讨论】:

【参考方案1】:

Redis 支持 6 种数据类型。您需要知道键映射到什么类型的值,对于每种数据类型,检索它的命令是不同的。

以下是检索键值的命令:

如果值是字符串类型-> GET <key> 如果值是散列类型 -> HGETALL <key> 如果值是列表类型-> lrange <key> <start> <end> 如果值是集合类型-> smembers <key> 如果值是排序集类型-> ZRANGEBYSCORE <key> <min> <max> 如果值是流类型 -> xread 计数 <count><key> <ID>。 https://redis.io/commands/xread

使用TYPE 命令检查键映射到的值的类型:

输入<key>

【讨论】:

你拯救了这一天:-) 那么当你使用直接写/读byte[]的方法时,使用的是哪一个呢? 为什么我不能只使用hget作为哈希类型? 感谢您的回答! @alramdein 您可以使用 HGET 并指定“存储在键处的哈希中的字段”。 'HGET ' 或 HGETALL 查看所有字段【参考方案2】:

此错误表示键“l_messages”索引的值不是hash 类型,而是其他类型。您可能已在代码的前面将其设置为其他值。尝试从 GET 开始的各种其他 value-getter 命令,看看哪一个有效,你就会知道这里实际上是什么类型。

【讨论】:

实际上,print($redis->TYPE($values)); 会告诉您,无需猜测 ;) 太棒了 :) 不知道这个命令,从来没用过。这是文档:redis.io/commands/type【参考方案3】:

此错误表示您试图将错误的值推送到键中,这意味着已经存在相同的键但具有不同的数据结构。

要获取所有密钥,请在 redis cli 中执行此操作

keys *

这应该显示所有的键 现在要获取密钥存储的值的类型,请执行

type <key>

所以它说明了您可以将什么值放入密钥中。 在我的情况下,类型是字符串(使用集合),我试图将键用作列表

【讨论】:

【参考方案4】:

我在尝试将某些内容设置为 redis 时遇到了这个问题。问题是我之前使用“set”方法来设置带有某个键的数据,比如

$redis->set('persons', $persons)

后来我决定改成“hSet”方法,就这样试了

foreach($persons as $person)
    $redis->hSet('persons', $person->id, $person);

然后我得到了上述错误。所以,我要做的就是去 redis-cli 并手动删除“persons”条目

del persons

它根本无法在现有键下写入不同的数据结构,所以我不得不删除条目和hSet。

【讨论】:

以上是关于WRONGTYPE 对持有错误值 php 的键的操作的主要内容,如果未能解决你的问题,请参考以下文章

WRONGTYPE Operation against a key holding the wrong kind of value

如何使用hiredis 运行Redis sadd 命令

iOS/Facebook 登录错误:此类与键的键值编码不兼容

编辑核心数据会产生错误,此类与键的键值编码不兼容

此类不是键的键值编码兼容的键

将项目从情节提要更改为 xib 文件时出现“此类与键的键值编码不兼容”错误