php - CachingIterator 是否增量缓存?
问题描述
我想缓存一个列表中的东西,这些东西真的只能被检索一次。列表中的项目是从文件列表中检索的可调用对象,并且对这些文件的访问权限不得超过一次。如果再次访问该文件,则会破坏该软件。
我想为此使用CachingIterator。但是,我不确定它究竟是如何缓存项目的。我要从中缓存项目的列表可能会迭代多次,迭代次数不同。虽然我需要按键缓存项目,但如果另一个进程的迭代次数多于之前的迭代次数,我还需要将它们添加到缓存中。
那么,CachingIterator
支持吗?还是它会缓存第一次迭代产生的列表,并且不再继续?或者它会只迭代整个列表,这违背了在数组上使用迭代器的意义吗?
解决方案
是的,CachingIterator
它将逐步添加项目。在 3 个项目的列表中,如果第一次发生迭代,则缓存将包含 1 个项目。如果下一次发生 2 次迭代,第一项将从缓存中检索,第二项将从内部列表中检索,然后缓存。等等等等。
这在此处进行了说明。注意第一次在输出数组中有一个项目,第二次有两个。还要注意在这两种情况下第一个对象如何是同一个对象,这可以通过对象编号来证明,例如#1
。
此外,如果您的值不可字符串化,即无法转换为字符串,请不要忘记删除默认CALL_TOSTRING
标志,或使用FULL_CACHE
. 否则,您将收到错误消息。
另一个细节是,如果在下面的迭代器链中的某个地方CachingIterator
有一个Generator,它CachingIterator
不能被倒带,这意味着它不能在超过 1 个foreach
循环中使用。这是违反直觉的 IMO,因为我预计,如果它正在缓存,那么它将遍历缓存。然而,显然它仍然试图倒回内部迭代器,将其沿着链转发到生成器,最终产生致命错误。
推荐阅读
- java - 在android studio中单击时如何使复选框可编辑
- docker - Docker-compose:显示有效配置?
- acumatica - 单击按钮时如何调用方法
- javascript - 循环内的计算以及如何返回值的总和。Vuejs
- webrtc - 在 ICE 候选人中,raddr 和 rport 代表什么?
- tsql - 如何在实例级别为所有数据库编写所有数据库对象的脚本
- database - 如果我不删除使用 QSqlDatabase 创建的数据库会怎样?
- google-maps - 为什么 Google 地图 API 结果不准确?
- php - PHP中if条件变量前为什么要用@
- android - Firebase 服务器已终止移动网络上的上传会话