所以我已经为我的内存需求很大的应用程序实现了一个实验性缓存,并在混合中加入了一个堆,这样一旦缓存超出了某个限制,我就可以轻松地获得访问最少的对象——这个想法是从缓存中清除对象可能不会很快重新使用,如果是这样,请从数据库中检索它们。
到目前为止,一切都很好,除了可能还有一些对象尚未写入数据库并且不应该被清除。我可以通过设置一个“脏”位来处理这个问题,没问题。但是还有另一个问题来源:如果仍然有对潜伏在某处的给定缓存对象的有效引用怎么办?这可能会导致这样一种情况:函数f
持有对 ID 为 的对象的引用 A xxx
,然后从缓存中清除该对象,然后另一个函数g
请求具有相同 ID 的对象xxx
,但获得另一个不同于 A 的引用 B。到目前为止,我正在构建我的软件,假设应该只有一个具有给定 ID 的持久对象的单个实例(也许这很愚蠢?)。
到目前为止,我的猜测是我可以从与垃圾收集相关的方法gc.get_reference_count( value )
中受益,例如检查并知道上面的任何计数1
(因为value
在缓存中)意味着某些闭包仍在保留value
,因此不应清除它。
我在这个方向上没有发现任何有用的东西。一般问题是否需要另一种解决方案?