请不要说EHCache或OSCache等.为了这个问题的目的,假设我只想使用SDK(从实践中学习)来实现我自己的.鉴于缓存将在多线程环境中使用,您将使用哪些数据结构?我已经使用LinkedHashMap和Collections#synchronizedMap实现了一个,但我很好奇任何新的并发集合是否会更好.
更新:当我发现这个金块时,我只是阅读Yegge的最新消息:
如果您需要持续时间访问并希望维护插入顺序,那么您不能比LinkedHashMap做得更好,这是一个真正精彩的数据结构.它可能更精彩的唯一方法是如果有并发版本.可惜.
在我使用上面提到的LinkedHashMap+ Collections#synchronizedMap实现之前,我的想法几乎完全相同.很高兴知道我不只是忽略了一些东西.
基于到目前为止的答案,对于高度并发的LRU来说,我最好的选择是使用一些相同的逻辑来扩展ConcurrentHashMapLinkedHashMap.
最近最少使用(LRU)缓存首先丢弃最近最少使用的项目如何设计和实现这样的缓存类?设计要求如下:
1)尽可能快地找到项目
2)一旦缓存未命中并且缓存已满,我们需要尽快替换最近最少使用的项目.
如何在设计模式和算法设计方面分析和实现这个问题?
我知道实现起来很简单,但我想重用已经存在的东西.
我想解决的问题是我为不同的页面,角色加载配置(来自XML,所以我想缓存它们)......所以输入的组合可以增长很多(但99%不会).要处理这个1%,我希望在缓存中有一些最大数量的项目...
直到知道我在apache commons中找到了org.apache.commons.collections.map.LRUMap它看起来很好但是想要检查别的东西.有什么建议?
我想在python中使用dict,但是将键/值对的数量限制为X.换句话说,如果dict当前存储X键/值对并执行插入,我想要一个要删除的现有对.如果它是最近最少插入/访问密钥会很好,但这不是完全必要的.
如果这个存在于标准库中,请节省一些时间并指出它!
LRU和LFU缓存实现有什么区别?
我知道LRU可以使用实现LinkedHashMap.但是如何实现LFU缓存?
如何在不泄漏内存的情况下在类中使用functools的lru_cache?在下面的最小示例中,foo虽然超出范围且没有引用者(lru_cache除外),但实例不会被释放.
from functools import lru_cache
class BigClass:
pass
class Foo:
def __init__(self):
self.big = BigClass()
@lru_cache(maxsize=16)
def cached_method(self, x):
return x + 5
def fun():
foo = Foo()
print(foo.cached_method(10))
print(foo.cached_method(10)) # use cache
return 'something'
fun()
Run Code Online (Sandbox Code Playgroud)
但是foo因此foo.big(a BigClass)仍然活着
import gc; gc.collect() # collect garbage
len([obj for obj in gc.get_objects() if isinstance(obj, Foo)]) # is 1
Run Code Online (Sandbox Code Playgroud)
这意味着Foo/BigClass实例仍然驻留在内存中.即使删除Foo(del Foo)也不会释放它们.
为什么lru_cache会依赖实例?缓存不是使用一些哈希而不是实际对象吗?
在类中使用lru_caches的推荐方法是什么?
使用此处的LRU Cache装饰器:http: //code.activestate.com/recipes/578078-py26-and-py30-backport-of-python-33s-lru-cache/
from lru_cache import lru_cache
class Test:
@lru_cache(maxsize=16)
def cached_method(self, x):
return x + 5
Run Code Online (Sandbox Code Playgroud)
我可以使用它创建一个装饰类方法,但最终会创建一个适用于Test类的所有实例的全局缓存.但是,我的意图是创建每个实例缓存.因此,如果我要实例化3个测试,那么对于所有3个实例,我将有3个LRU高速缓存而不是1个LRU高速缓存.
我发现这种情况的唯一指示是在不同的类实例修饰方法上调用cache_info()时,它们都返回相同的缓存统计信息(由于它们与非常不同的参数进行交互,因此极不可能发生):
CacheInfo(hits=8379, misses=759, maxsize=128, currsize=128)
CacheInfo(hits=8379, misses=759, maxsize=128, currsize=128)
CacheInfo(hits=8379, misses=759, maxsize=128, currsize=128)
Run Code Online (Sandbox Code Playgroud)
是否有装饰器或技巧可以让我轻松地让这个装饰器为每个类实例创建一个缓存?
我有一些C++代码,我需要使用LRU技术实现缓存替换.
到目前为止,我知道实现LRU缓存替换的两种方法:
那么,哪些更适合在生产代码中使用?
他们还有其他更好的方法吗?
特别是在使用递归代码时,会有很大的改进lru_cache.我知道缓存是一个空间,用于存储必须快速提供的数据并保存计算机不会重新计算.
functools 的Python 如何在lru_cache内部工作?
我正在寻找一个具体的答案,它是否使用像其他Python一样的字典?它只存储return价值吗?
我知道Python很大程度上建立在词典之上,但是,我找不到这个问题的具体答案.希望有人可以为StackOverflow上的所有用户简化此答案.
我怎样才能使@functools.lru_cache装饰器忽略一些关于缓存键的函数参数?
例如,我有一个如下所示的函数:
def find_object(db_handle, query):
# (omitted code)
return result
Run Code Online (Sandbox Code Playgroud)
如果我lru_cache像这样应用装饰器,db_handle将包含在缓存键中.因此,如果我尝试使用相同query但不同的函数调用该函数db_handle,它将再次执行,我想避免.我只想lru_cache考虑query参数.