Ale*_*lex 6 php arrays caching apc
APC允许您将数据存储在密钥内,但您无法对这些密钥进行分组.
因此,如果我想拥有一个名为"文章"的组,并且在这个组中,我将拥有采用文章ID形式的密钥,我不能轻易做到这一点.
articles -> 5 -> cached data
-> 10 -> cached data
-> 17 -> cached data
...
Run Code Online (Sandbox Code Playgroud)
我可以在密钥前面添加"group"名称,例如:
article_5 -> cached data
article_10 -> cached data
article_17 -> cached data
...
Run Code Online (Sandbox Code Playgroud)
但是这使得如果我想要删除整个组是不可能的:(
一个可行的解决方案是存储多维数组(这就是我现在正在做的),但我认为这不好,因为当我想访问/或删除缓存数据时,我需要先将整个组.因此,如果该组中有一篇文章,您可以想象我将迭代和搜索的数组
你对我怎样才能实现团队合作有更好的想法吗?
__paths
,它基本上是一个多维数组,包含缓存中所有其他条目的完整前缀键路径.当我请求或删除缓存时,我使用此数组作为参考,以快速找到我需要删除的密钥(或密钥组),因此我不必存储数组并通过所有密钥迭代...
MrG*_*mez 18
根据您的观察,我查看了APC缓存模型(apc_cache.c
)的基础C实现,看看我能找到什么.
源证实了您的观察结果,即后备数据存储中不存在分组结构,因此需要根据某些命名空间约束或对缓存层本身的修改来完成任何松散分组的对象集合.我希望通过链表找到一些依赖于密钥链的后门,但不幸的是,似乎通过直接重新分配冲突槽而不是链接来协调冲突.
进一步混淆了这个问题,APC似乎对用户条目使用显式缓存模型,防止它们老化.因此,解决方案EmilVikström提供了依赖于memcached意志的LRU模型,遗憾的是,它不起作用.
不修改APC本身的源代码,这就是我要做的:
定义条目符合的命名空间约束.正如您最初在上面定义的那样,这将类似于article_
每个条目的前缀.
在此集合中定义单独的元素列表.实际上,这将是5
,10
和17
你上面会描述的方案,但在这种情况下,你可以使用一些数字型,使这个不是存储一大堆的字符串值更有效.
定义一个接口来更新此指针集合和与背衬存储器高速缓存协调它们,包括(至少)的方法insert
,delete
和clear
.当clear
被调用时,每走你的指针,重建你的后备数据存储使用的密钥,并刷新每个从缓存中.
我在这里提倡的是一个明确定义的对象,它可以有效地执行您所寻求的操作.这与子缓存中的条目数呈线性关系,但由于您为每个元素使用了数字类型,因此在开始体验实际内存痛苦之前,您需要超过1亿条目,例如,几百兆字节.
Tamas Imrei打败了我建议我已经在记录过程中的替代策略,但这有一些我想讨论的重大缺陷.
如后备C代码中所定义的,APCIterator
是在执行搜索(使用其构造函数)时对整个数据集的线性时间操作public __construct ( string $cache [, mixed $search = null ...]] )
.
在您搜索的支持元素占总数据的一小部分时,这是非常不受欢迎的,因为它会遍历缓存中的每个元素以找到您想要的元素.引用apc_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;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我强烈建议您使用基于指针的高效虚拟分组解决方案来解决您的问题,如上所述.虽然,在严格限制内存的情况下,迭代器方法可能是最正确的,以牺牲计算为代价来节省尽可能多的内存.
祝你的应用好运.
我曾经在使用 memcached 时遇到过这个问题,我通过在我的密钥中使用版本号解决了这个问题,如下所示:
version -> 5
article_5_5 -> cached data
article_10_5 -> cached data
article_17_5 -> cached data
Run Code Online (Sandbox Code Playgroud)
只需更改版本号,该组就会有效地“消失”!
memcached 使用最近最少使用的策略来删除旧数据,以便在需要空间时从缓存中删除旧版本组。不知道APC有没有同样的功能。
根据MrGomez 的说法,这不适用于 APC。请阅读他的帖子,并记住我的帖子只适用于使用最近最少使用策略(不是 APC)的其他缓存系统。
归档时间: |
|
查看次数: |
2111 次 |
最近记录: |