如何在具有限制和参数搜索的 Web 应用程序中正确使用 Memcache?

How to properly use Memcache in web applications with limit and parametric search?

提问人:Basil 提问时间:10/26/2023 更新时间:10/26/2023 访问量:30

问:

鉴于工具的选择 - memcache,我不确定我的问题最初是否正确,也许我需要看看 Redis,但只要我的项目使用 memcache,那么问题就会在这个工具的上下文中。

所以,我在 PHP 中有一个项目,在那里我使用 memcache 如下所示:

    public function findById(int $id): Model
    {
        $memcacheKey = md5(implode('', [__METHOD__, $id]));
        
        if ($data = memcache()->get($memcacheKey)) {
            return $data;
        }

        // getting data from db
        $data = ....;

        memcache()->set($memcacheKey, $data, false, 60 * 60 * 24 * 30);

        return $data;
    }
   public function findList(array $params): ModelList
    {
        // big sql query use $params array
        $sql = 'SELECT ... LIMIT ...';

        $memcacheKey = md5(implode('', [__METHOD__, serialize($params)]));
        if ($data = memcache()->get($memcacheKey)) {
            return $data;
        }

        // getting data from db use $params array
        $data = ....;

        memcache()->set($memcacheKey, $data, false, 60 * 10);

        return $data;
    }

我不确定我是否正确或有效地使用缓存。

如果数据库中的一条记录被更新,该怎么办? 我可以手动删除该键下的缓存(因为我可以生成该键的名称)并重新生成该条目的缓存。md5(implode('', ["findById", $id]))

但是条目列表的缓存将保持旧状态,并且仅在缓存过期后才会更新。

我在哪里可以读到如何在 memcache 中解决这个问题? 将参数搜索选择的结果放在 memcache 中通常是否正确? 还是我应该忘记 memcache 并关注 Redis?

php redis memcached

评论

1赞 Sammitch 10/26/2023
我建议对于列表,您不要在列表中缓存除 ID 以外的任何内容,然后回退到结果上。这样一来,您就不必在每次更新基础数据时都使所有列表失效,并防止在列表和单数缓存中对条目进行双重缓存。即便如此,根据数据完整性要求,添加/删除条目也可能会使列表失效,因此在非常短的 TTL 之外,缓存列表本身可能会有问题。findById()
0赞 Basil 10/26/2023
有趣的报价。我的理解是它应该看起来像这样: 1.进行SQL查询以获取标识符列表(或从memcache获取它们)。2. 对于每个收到的标识符,通过 findById 发出一个请求?只是如果缓存坏了,那么我将对数据库进行另外 50 个单一查询,而不是像我这样对选择进行一个 SQL 查询......select ... limit 0, 50
0赞 Sammitch 10/27/2023
可以选择在后台预热缓存,而不是完全拉通模型。或者轮询缓存以查找存在的 ID,并对不存在的 ID 发出批处理查询,例如:findByIds(array $ids) { ... }

答: 暂无答案