在不检索列表的情况下检查键是否存在于 Redis 列表中
Check if the key exists in the Redis list without retrieving the list
我正在为 PHP 使用 Redis。
我需要检查redis列表中是否存在该键,如果不存在,则添加它。现在我的代码如下所示:
$redis = Redis::connection();
$redis->pipeline(function($pipe) use ($type, $redis)
{
$list = $pipe->lRange($type.'_unique_list', 0, -1);
if(!in_array($this->uid, $list)) {
$pipe->rPush($type . '_unique_list', $this->uid);
}
});
问题是 $list
取自 $pipe
returns Redis 对象,而不是数组,in_array
不起作用。但是如果我使用 $redis->lRange
,脚本会变得太慢。
所以我的问题是,是否有可能 检查密钥是否存在于 Redis 列表中,而无需将列表 检索到脚本中?我在文档中找不到的一些特殊的 Redis 命令?或者在这种特殊情况下我可以用其他东西替换 in_array
吗?
错误答案:您可以调用 LINDEX
而不是在客户端中进行搜索。
正确答案:无论是服务器端还是客户端,扫描链表始终是一项开销很大的操作 (O(N))。考虑使用不同的数据结构,例如一个 Set,如果你的 N 很大,为此目的。
我正在为 PHP 使用 Redis。
我需要检查redis列表中是否存在该键,如果不存在,则添加它。现在我的代码如下所示:
$redis = Redis::connection();
$redis->pipeline(function($pipe) use ($type, $redis)
{
$list = $pipe->lRange($type.'_unique_list', 0, -1);
if(!in_array($this->uid, $list)) {
$pipe->rPush($type . '_unique_list', $this->uid);
}
});
问题是 $list
取自 $pipe
returns Redis 对象,而不是数组,in_array
不起作用。但是如果我使用 $redis->lRange
,脚本会变得太慢。
所以我的问题是,是否有可能 检查密钥是否存在于 Redis 列表中,而无需将列表 检索到脚本中?我在文档中找不到的一些特殊的 Redis 命令?或者在这种特殊情况下我可以用其他东西替换 in_array
吗?
错误答案:您可以调用 LINDEX
而不是在客户端中进行搜索。
正确答案:无论是服务器端还是客户端,扫描链表始终是一项开销很大的操作 (O(N))。考虑使用不同的数据结构,例如一个 Set,如果你的 N 很大,为此目的。