通过使用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*')
然而,它没有用。
答案 0 :(得分:4)
我只是用
$redis->delete($redis->keys('*'));
它对我来说很好。
答案 1 :(得分:2)
不 - Redis' DEL
lete不接受通配符,您必须明确命名键。请点击此处查看可能的路线:https://stackoverflow.com/a/23399125/3160475
答案 2 :(得分:1)
$bash = 'redis-cli --scan --pattern "' . $path . '*" | xargs -L 1000 redis-cli DEL';
$res = @shell_exec($bash);
答案 3 :(得分:1)
使用phpredis
时,您可以获取前缀(phpredis自动在任何地方预先添加)并删除键的模式:
<?php
...
$prefix = $redisClient->getOption(Redis::OPT_PREFIX);
$redisClient->delete(array_map(
function ($key) use ($prefix) {
return str_replace($prefix, '', $key);
}, $redisClient->keys('*'))
);
答案 4 :(得分:0)
使用Predis,我这样做:
public function delete($key) {
$keys = $this->client->keys($key);
foreach ($keys as $key) {
$this->client->del($key);
}
}
答案 5 :(得分:0)
删除功能没有通配符。 解决方法如下,
// 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
答案 6 :(得分:-1)
Predis(->del
)也允许传递键数组。
它在这里有效,并且比del
内部的foreach
更快。
$prefix = $this->client->getOptions($this->OPT_PREFIX);
$keys = $this->client->keys("$key*");
if ($keys) $this->client->del($keys);