嗨,我正在将 Laravel 与 Redis 一起使用。当我尝试通过 get 方法访问密钥时,出现以下错误“针对持有错误类型值的密钥的 WRONGTYPE 操作”
我正在使用以下代码来访问键值-
我使用此代码从redis获取数据
$values = "l_messages";
$value = $redis->HGETALL($values);
print($value);
Redis 支持 6 种数据类型。您需要知道键映射到什么类型的值,对于每种数据类型,检索它的命令都不同。
以下是检索键值的命令:
<key>
<key>
<key> <start> <end>
<key>
<key> <min> <max>
<count>
流<key>
<ID>
。 https://redis.io/commands/xreadTYPE
命令检查键映射到的值的类型:
<key>
此错误表明您正在尝试将错误的值推入密钥,这意味着已经存在相同的密钥但具有不同的数据结构。
要获取所有密钥,请在 redis cli 中执行此操作
keys *
这应该显示所有键 现在要获取密钥存储的值的类型,请执行以下操作
type <key>
所以它说明了您可以将什么值推入密钥中。 在我的例子中,类型是字符串(使用集合),我试图将键用作列表
此错误意味着键“l_messages”索引的值不是
hash
类型,而是其他类型。您可能已经在代码中将其设置为其他值。尝试各种其他值获取命令,从 GET 开始,看看哪一个有效,然后您就会知道这里实际上是什么类型。
我在尝试向 Redis 设置某些内容时遇到了这个问题。问题是我之前使用“set”方法用某个键设置数据,比如
$redis->set('persons', $persons)
后来我决定改成“hSet”方法,就这样尝试了
foreach($persons as $person){
$redis->hSet('persons', $person->id, $person);
}
然后我得到了上述错误。所以,我要做的就是转到 redis-cli 并使用
手动删除“persons”条目del persons
它根本无法在现有密钥下写入不同的数据结构,所以我不得不删除该条目和 hSet。
这不是 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
以避免意外错误。
我遇到了这个问题,并发现已经存在另一个具有相同名称但类型不同的密钥。已经存在的钥匙是
string
,而我期待的是 hash
。
数据库索引错误
有时是因为您的数据库编号错误。我遇到了同样的问题,并将数据库更改为正确的数据库,没有问题并且有效!我建议你在 HGETALL 或任何你想要的东西之前,选择正确的数据库或至少考虑你所在的数据库。
我尝试使用最初使用
GET
存储的普通 JSON.SET
获取值时遇到此错误。我只需要确保我始终使用正确的命令。
这是在 Node.js 中,所以修复是从:
await client.get(key);
致:
await client.json.get(key);
我在将密钥
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
不是有效的密钥名称。