嗨,我正在与Redis一起使用Laravel。当我试图通过get方法访问一个键时,然后得到以下错误“对持有错误类型值的键进行操作”
我使用以下代码访问键值-
我使用这段代码从redis获取数据
$values = "l_messages";
$value = $redis->HGETALL($values);
print($value);
嗨,我正在与Redis一起使用Laravel。当我试图通过get方法访问一个键时,然后得到以下错误“对持有错误类型值的键进行操作”
我使用以下代码访问键值-
我使用这段代码从redis获取数据
$values = "l_messages";
$value = $redis->HGETALL($values);
print($value);
当前回答
这不是PHP,但我在c#中有类似的问题,并使用此页作为参考来解决这个问题。
我的。net Core 3.1 web服务器的IDistributedCache。SetStringAsync实际上是将数据存储为散列而不是字符串;我使用KeyTypeAsync确认了这一点。不用说,这非常令人困惑。它似乎存储配置DistributedCacheEntryOptions作为散列的一部分,{data}是原始字符串的子键。
要解决此问题,您需要将其读取为哈希并手动访问子键,而不是将其读取为字符串。参见以下代码:
var str = (await redisConnection.GetDatabase().HashGetAllAsync("stringKey"))?.LastOrDefault()?.Value?.ToString();
其他回答
当我试图将某些东西设置为redis时,我遇到了这个问题。问题是,我以前使用“set”方法设置数据与某个键,如
$redis->set('persons', $persons)
后来我决定改为“hSet”方法,我尝试了这种方式
foreach($persons as $person){
$redis->hSet('persons', $person->id, $person);
}
然后我得到了前面提到的错误。所以,我要做的是去redis-cli,手动删除“persons”条目
del persons
它只是不能在现有的键下写不同的数据结构,所以我必须删除条目和hSet。
此错误表示您试图将错误的值推入键,这意味着已经存在相同的键,但具有不同的数据结构。
要获得所有的键做这个在redis cli
keys *
这将显示所有的键 现在要获得键存储的值的类型,请执行
type <key>
它说你可以把什么值输入键。 在我的情况下,类型是字符串(使用集),我试图使用键作为列表
这不是PHP,但我在c#中有类似的问题,并使用此页作为参考来解决这个问题。
我的。net Core 3.1 web服务器的IDistributedCache。SetStringAsync实际上是将数据存储为散列而不是字符串;我使用KeyTypeAsync确认了这一点。不用说,这非常令人困惑。它似乎存储配置DistributedCacheEntryOptions作为散列的一部分,{data}是原始字符串的子键。
要解决此问题,您需要将其读取为哈希并手动访问子键,而不是将其读取为字符串。参见以下代码:
var str = (await redisConnection.GetDatabase().HashGetAllAsync("stringKey"))?.LastOrDefault()?.Value?.ToString();
数据库索引错误
有时是因为你在一个错误的db编号。我也有同样的问题,把db改成了正确的,没有问题,它工作了!我建议你在HGETALL或任何你想要的之前,选择正确的数据库,或者至少考虑你在哪个数据库中。
这个错误意味着键“l_messages”索引的值不是散列类型,而是其他类型。在前面的代码中,您可能已经将它设置为另一个值。尝试其他各种值获取命令,从GET开始,看看哪个有效,您就会知道这里实际上是什么类型。