Используя 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->delete($redis->keys('*'));
Это прекрасно работает для меня.
Нет — редис DEL
lete не принимает подстановочные знаки, вы должны называть ключи явно. Смотрите здесь для возможных направлений: https://stackoverflow.com/a/23399125/3160475
$bash = 'redis-cli --scan --pattern "' . $path . '*" | xargs -L 1000 redis-cli DEL';
$res = @shell_exec($bash);
Когда используешь phpredis
Вы можете получить префикс (который phpredis автоматически добавляется везде) и таким образом удалить комбинацию ключей:
<?php
...
$prefix = $redisClient->getOption(Redis::OPT_PREFIX);
$redisClient->delete(array_map(
function ($key) use ($prefix) {
return str_replace($prefix, '', $key);
}, $redisClient->keys('*'))
);
С Predis, Я делаю это так:
public function delete($key) {
$keys = $this->client->keys($key);
foreach ($keys as $key) {
$this->client->del($key);
}
}
Предис (->del
) также позволяет передавать массив ключей.
Это работает здесь и быстрее, чем del
внутри foreach
,
$prefix = $this->client->getOptions($this->OPT_PREFIX);
$keys = $this->client->keys("$key*");
if ($keys) $this->client->del($keys);