WRONGTYPE 针对持有错误类型值的键进行操作 php

问题描述 投票:0回答:9

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

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

我使用此代码从redis获取数据

$values = "l_messages";
$value = $redis->HGETALL($values);
print($value);
php redis
9个回答
965
投票

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

以下是检索键值的命令:

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

使用

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

  • 类型
    <key>

30
投票

此错误表明您正在尝试将错误的值推入密钥,这意味着已经存在相同的密钥但具有不同的数据结构。

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

keys *

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

type <key>

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


13
投票

此错误意味着键“l_messages”索引的值不是

hash
类型,而是其他类型。您可能已经在代码中将其设置为其他值。尝试各种其他值获取命令,从 GET 开始,看看哪一个有效,然后您就会知道这里实际上是什么类型。


5
投票

我在尝试向 Redis 设置某些内容时遇到了这个问题。问题是我之前使用“set”方法用某个键设置数据,比如

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

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

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

然后我得到了上述错误。所以,我要做的就是转到 redis-cli 并使用

手动删除“persons”条目
del persons

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


3
投票

这不是 PHP,但我在 C# 中遇到了类似的问题,并使用此页面作为解决问题的参考。

我的 .Net Core 3.1 Web 服务器的

IDistributedCache.SetStringAsync
实际上将数据存储为
hash
而不是
string
;我用
KeyTypeAsync
确认了这一点。不用说,这非常令人困惑。它似乎将配置
DistributedCacheEntryOptions
存储为哈希的一部分,而
{data}
是原始字符串的子键。

要解决此问题,您需要将其读取为哈希值并手动访问子密钥,而不是将其读取为字符串。请参阅以下代码:

var str = (await redisConnection.GetDatabase().HashGetAllAsync("stringKey"))?.FirstOrDefault(ele => ele.Name == "data")?.Value?.ToString();

编辑:子哈希键的顺序在最新版本的 REDIS 中不再一致,因此您不能再依赖最后一项作为实际数据。确保如上所述匹配

ele.Name
以避免意外错误。


2
投票

我遇到了这个问题,并发现已经存在另一个具有相同名称但类型不同的密钥。已经存在的钥匙是

string
,而我期待的是
hash


0
投票

数据库索引错误

有时是因为您的数据库编号错误。我遇到了同样的问题,并将数据库更改为正确的数据库,没有问题并且有效!我建议你在 HGETALL 或任何你想要的东西之前,选择正确的数据库或至少考虑你所在的数据库。


0
投票

我尝试使用最初使用

GET
存储的普通
JSON.SET
获取值时遇到此错误。我只需要确保我始终使用正确的命令。

这是在 Node.js 中,所以修复是从:

await client.get(key);

致:

await client.json.get(key);

0
投票

我在将密钥

test
传递给
HSET
时遇到了这个问题:

127.0.0.1:6379> HSET test f1 v1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
127.0.0.1:6379> HGETALL test
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>

test
不是有效的密钥名称。

© www.soinside.com 2019 - 2024. All rights reserved.