Php 具有APC缓存的关键组

Php 具有APC缓存的关键组,php,arrays,caching,apc,Php,Arrays,Caching,Apc,APC允许您在密钥内存储数据,但不能对这些密钥进行分组 所以,如果我想要一个名为“articles”的组,并且在这个组中,我会有以articleid的形式出现的键,我很难做到这一点 articles -> 5 -> cached data -> 10 -> cached data -> 17 -> cached data ... 我可以在密钥前面加上“组”名称,如: article_5 -&

APC允许您在密钥内存储数据,但不能对这些密钥进行分组

所以,如果我想要一个名为“articles”的组,并且在这个组中,我会有以articleid的形式出现的键,我很难做到这一点

articles -> 5   -> cached data
         -> 10  -> cached data
         -> 17  -> cached data

         ...
我可以在密钥前面加上“组”名称,如:

article_5   -> cached data
article_10  -> cached data
article_17  -> cached data

 ...
但如果我想:(

一个可行的解决方案是存储多维数组(这就是我现在正在做的),但我认为这并不好,因为当我想访问/删除缓存数据时,我需要首先获取整个组。因此,如果组中有无数的文章,你可以想象我将迭代和搜索什么样的数组

你有没有更好的办法让我实现团队合作



编辑:找到了另一个解决方案,不确定它是否更好,因为我不知道它有多可靠。我正在添加一个名为
\uu paths
的特殊密钥,它基本上是一个多维数组,包含缓存中所有其他项的完整前缀密钥路径。当我请求或删除缓存时,我使用这个数组作为快速查找需要删除的密钥(或密钥组)的参考,我不必存储数组并通过所有密钥进行迭代…

我曾经在memcached中遇到过此问题,我通过在密钥中使用版本号解决了此问题,如下所示:

version -> 5
article_5_5 -> cached data
article_10_5 -> cached data
article_17_5 -> cached data
只需更改版本号,该组将有效地“消失”

memcached使用最近最少使用的策略来删除旧数据,以便在需要空间时将旧版本组从缓存中删除。我不知道APC是否具有相同的功能


据了解,这不适用于APC。请阅读他的帖子,并记住我的帖子,仅适用于使用最近最少使用的策略(非APC)的其他缓存系统。

您可以使用,它似乎特别适用于以下任务:

version -> 5
article_5_5 -> cached data
article_10_5 -> cached data
article_17_5 -> cached data
APC迭代器类使在大型APC缓存上进行迭代变得更容易。这很有帮助,因为它允许在大型缓存上逐步进行迭代


根据您的观察,我查看了的缓存模型(
apc_cache.C
)的底层C实现,以了解我能找到什么

该消息来源证实了您的观察,即备份数据存储中不存在分组结构,因此任何松散分组的对象集合都需要基于某些命名空间约束或对缓存层本身的修改来完成。我希望找到一些依赖于通过链表的键链的后门,但不可更改可调地,似乎通过直接重新分配碰撞时隙而不是通过重新分配来协调碰撞

进一步混淆这个问题的是,APC似乎对用户条目使用显式缓存模型,防止它们老化。因此,不幸的是,依赖memcached的模型将不起作用

在不修改APC本身的源代码的情况下,我会这样做:

  • 定义条目符合的名称空间约束。正如您最初在上面定义的,这类似于在每个条目前面加上
    article

  • 在此集合中定义一个单独的元素列表。实际上,这将是您上面描述的
    5
    10
    17
    方案,但在这种情况下,您可以使用一些数字类型,使其比存储大量字符串值更有效

  • 定义一个接口来更新这组指针并将它们与后备内存缓存协调,包括(至少)方法
    insert
    delete
    clear
    。调用
    clear
    时,遍历每个指针,重建备份数据存储中使用的密钥,并从缓存中刷新每个密钥

  • 我在这里提倡的是一个定义良好的对象,它可以有效地执行您所寻求的操作。它与子缓存中的条目数成线性关系,但由于您对每个元素使用的是数字类型,因此在您开始体验真正的内存痛苦之前,您需要超过1亿条目数,例如例如,几百兆字节


    Tamas Imrei击败了我,我已经在记录过程中,但这有一些主要的缺陷,我想讨论一下

    正如C代码中所定义的,在执行搜索(使用其构造函数,
    public\u构造(字符串$cache[,mixed$search=null…])时,是对整个数据集的线性时间操作。

    在您正在搜索的支持元素只占总数据的一小部分的情况下,这显然是不可取的,因为它会遍历缓存中的每个元素以找到您想要的元素。引用
    apc\u cache.c

    /* {{{ apc_cache_user_find */
    apc_cache_entry_t* apc_cache_user_find(apc_cache_t* cache, char *strkey, \
      int keylen, time_t t TSRMLS_DC)
    {
        slot_t** slot;
        ...
        slot = &cache->slots[h % cache->num_slots];
        while (*slot) {
            ...
            slot = &(*slot)->next;
        }
    }
    
    因此,我强烈建议您使用一种高效的、基于指针的虚拟分组解决方案来解决上述问题。尽管在内存严重受限的情况下,迭代器方法可能最正确,可以以牺牲计算为代价,尽可能节省内存


    祝你的应用程序好运。

    不幸的是,APC不能做到这一点。我希望自己经常这样做。所以我寻找替代方案

    有一种有趣的方法,但它只是使用缓存来缓存标记信息。它是一个可以反过来使用后端(如apc)的组件


    如果你想更进一步,你可以安装。这一款包含了所有本机功能和其他一些非常有趣的功能。这可能是最干净的解决方案。如果你能够使用APC,你也应该能够使用Redis。

    APC没有LRU策略,但APC\U add允许TTL,生存时间。Memca不过,在这种情况下,对于这类数据,che是一个更好的选择,因为它的L