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 此错误表示键“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