![](/img/trans.png)
[英]Cannot connect Redis Cluster in Elasticache to PHP using phpredis library
[英]How to delete multiple redis keys with the same pattern in PHP using phpredis?
通过使用phpredis ,我在分页中保存了一些数据,如下所示:
review/itemA/1
review/itemA/2
其中1
和2
是页码。 我在文档中读到您可以使用通配符来检索多个键。
$allKeys = $redis->keys('*'); // all keys will match this.
$keyWithUserPrefix = $redis->keys('user*');
但是,当有人发布新评论时,我是否也可以使用通配符删除所有旧键? 我可以做类似的事情:
$redis->delete('review/itemA/*'); // or $redis->delete('review/itemA*')
然而它没有用。
否 - Redis 的DEL
lete 不接受通配符,您必须明确命名键。 请参阅此处了解可能的方向: https : //stackoverflow.com/a/23399125/3160475
使用phpredis
,您可以获得前缀(phpredis 会自动在任何地方添加前缀)并以这种方式删除键模式:
<?php
...
$prefix = $redisClient->getOption(Redis::OPT_PREFIX);
$redisClient->delete(array_map(
function ($key) use ($prefix) {
return str_replace($prefix, '', $key);
}, $redisClient->keys('*'))
);
$bash = 'redis-cli --scan --pattern "' . $path . '*" | xargs -L 1000 redis-cli DEL';
$res = @shell_exec($bash);
我只是用
$redis->delete($redis->keys('*'));
这对我来说很好用。
Predis ( ->del
) 也允许传递键数组。
它在这里工作并且比foreach
的del
更快。
$prefix = $this->client->getOptions($this->OPT_PREFIX);
$keys = $this->client->keys("$key*");
if ($keys) $this->client->del($keys);
使用Predis ,我这样做:
public function delete($key) {
$keys = $this->client->keys($key);
foreach ($keys as $key) {
$this->client->del($key);
}
}
删除功能没有通配符。 解决方法如下,
// returns total number of keys deleted
function delete($key) {
if (empty($key)) { // empty key can delete all
return false;
}
$keys = $redis->keys("$key*"); // keys() function returns array of key strings. `*` wild card pattern can be changed as per need
if(!$keys) {
return 0;
}
$prefix = $redis->getOption(\Redis::OPT_PREFIX); // keys already have prefix, so we clear until delete finish.
$redis->setOption(\Redis::OPT_PREFIX, '');
$count = $redis->del($keys); // del() function delete array of keys and returns number of keys deleted.
$redis->setOption(\Redis::OPT_PREFIX, $prefix);
return $count;
}
注意:正如@Akash Gangrade 所评论的,由于性能原因,不建议使用 keys()。 您可以考虑基于标签的缓存失效,如https://symfony.com/doc/current/components/cache/cache_invalidation.html#tag-aware-adapters
# The keys set in redis
/*
1) "review/itemA/5"
2) "review/itemA/2"
3) "review/itemA/3"
4) "review/itemA/1"
5) "review/itemA/4"
*/
/**
* Vars for scan
*/
$i = null;
$result = [];
/**
* Scan redis using desired pattern
*/
while ($result != 0) {
$result = $redis->scan($i, 'review/itemA/*');
if (!empty($result)) {
$all_keys[] = $result;
}
}
# Use call_user_func_array to flatten multidimensional array into indexed array
## Scan may return duplicate keys, so use array_unique
$unlink_keys = array_unique(call_user_func_array('array_merge', $all_keys));
# As of Redis 4.0 use unlink instead of del to stop blocking
$redis->unlink($unlink_keys);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.