laravel redis缓存前缀不匹配

wf82jlnq  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(467)

我使用redis作为我的缓存驱动程序,我想扩展功能,按模式删除密钥。
当我在redis cli中列出缓存时,我得到:

127.0.0.1:6379[1]> keys *
1) "workspace_database_workspace_cache:table_def_workspace_items"
2) "workspace_database_workspace_cache:table_def_workspaces"

但是当我抛尸的时候 $this->prefixIlluminate\Cache\RedisStore 我得到:

"workspace_cache:"

由于某些原因,我的删除不起作用。当我尝试使用以下方法获取密钥时:

public function keys($pattern = '*')
{
    return $this->connection()->keys($pattern);
}

我如期拿回了钥匙。
但是,如果我试图删除它们,我没有这样做(打电话时) Cache::forgetByPattern('*items') :

public function forgetByPattern($key)
{
    foreach ($this->keys($key) as $item) {
        $this->connection()->del($item);
    }

    return true;
}

此处的项目转储显示 workspace_database_workspace_cache:table_def_workspace_items .
如果我通过在前缀后面提供精确的键来删除(就像原来的 forget() 方法函数):

$this->connection()->del($this->prefix.'table_def_workspace_items');

它确实删除了密钥。
我也试过做一个:

$this->connection()->del('*items');

$this->connection()->del($this->prefix.'*items');

编辑:重新检查文档,redis不提供delby模式。
但这些都不管用。为什么会失败,为什么会添加额外的前缀?

a6b3iqyw

a6b3iqyw1#

厄索伊带我走上了正确的道路 monitor 功能。这是最终的产品,有效:

public function forgetByPattern($key)
{
    foreach ($this->keys($key) as $item) {
        $item = explode(':', $item);
        $this->forget($item[1]);
    }

    return true;
}

而且,我困惑的前缀来自 database.php 配置文件位于 redis.options.prefix 钥匙。

相关问题