Tag: 缓存

什么是数据结构类似哈希表,但不常使用的键被删除?

我正在寻找一个类似于哈希表的数据结构,但表中有一个大小限制。 当散列中的项数达到大小限制时,应调用剔除函数以除去表中检索次数最少的键/值对。 这是我正在做的一些伪代码: class MyClass { private Map cache = new HashMap(); public int myFunc(int n) { if(cache.containsKey(n)) return cache.get(n); int next = . . . ; //some complicated math. guaranteed next != n. int ret = 1 + myFunc(next); cache.put(n, ret); return ret; } } 会发生的是,有一些n值, myFunc()将被多次调用,但是n许多其他值只会被计算一次。 因此,缓存可能会填满数百万个永远不需要的值。 我想有一种方法让缓存自动删除不经常检索的元素。 这感觉就像一个必须解决的问题,但我不确定数据结构是什么,我将用它来有效地做到这一点。 谁能指出我正确的方向? 更新我知道这必须是一个已经解决的问题。 它被称为LRU Cache,通过扩展LinkedHashMap类很容易。 […]

为什么编译器/ JVM不能让autoboxing“正常工作”?

Autoboxing相当可怕。 虽然我完全理解了==和.equals之间的区别,但我不得不帮助让我跟上这个bug: final List foo = Arrays.asList(1, 1000); final List bar = Arrays.asList(1, 1000); System.out.println(foo.get(0) == bar.get(0)); System.out.println(foo.get(1) == bar.get(1)); 那打印 true false 他们为什么这样做? 它与缓存的整数有关,但如果是这样的话,为什么它们不只是缓存程序使用的所有整数? 或者为什么JVM总是自动取消对原始的框? 打印虚假或真假会更好。 编辑 我不同意旧代码的破坏。 通过让foo.get(0) == bar.get(0)返回true,你已经破坏了代码。 通过在字节代码中将int替换为int(只要从未赋值为null),就不能在编译器级别解决这个问题。

使用Spring KeyGenerator生成唯一的缓存键不起作用

当我的缓存键在Spring中使用@Cacheable注释发生冲突时,我遇到了问题。 例如,使用以下两种方法: @Cacheable(“doOneThing”) public void doOneThing(String name) { // do something with name } @Cacheable(“doAnotherThing”) public void doAnotherThing(String name) { // do some other thing with name } 这是我的缓存配置,其中我添加了一个keyGenerator和一个cacheManager bean: @Configuration @EnableCaching public class CacheConfig { @Bean public JedisConnectionFactory redisConnectionFactory() { return new JedisConnectionFactory(); } @Bean public RedisTemplate redisTemplate(RedisConnectionFactory cf) { RedisTemplate redisTemplate = new […]

如何为Spring Cache设置自定义KeyGenerator?

我正在使用Spring 3.1,我想使用新的缓存function。 然后,我试过: 但我没有找到配置我的自定义KeyGenerator的方法。 任何想法?

如何实现最近使用的缓存

实现最近使用的对象缓存的最佳方法是什么? 以下是要求和限制…… 对象存储为键/值对象/对象对,因此接口有点像Hashtable get / put 对“get”的调用会将该对象标记为最近使用的对象。 在任何时候,可以从缓存中清除最近最少使用的对象。 查找和清除必须快速(如在Hashtable中快) 对象的数量可能很大,因此列表查找不够好。 必须使用JavaME进行实现,因此几乎没有空间使用标准Java库中的第三方代码或整齐的库类。 出于这个原因,我正在寻找更多的算法答案而不是现成解决方案的建议。

番石榴缓存并保留已检查的exception

我正在重构一些使用番石榴缓存的代码。 初始代码: public Post getPost(Integer key) throws SQLException, IOException { return PostsDB.findPostByID(key); } 为了不破坏某些东西,我需要保留任何抛出的exception,而不包装它。 目前的解决方案看起来有些难看 public Post getPost(final Integer key) throws SQLException, IOException { try { return cache.get(key, new Callable() { @Override public Post call() throws Exception { return PostsDB.findPostByID(key); } }); } catch (ExecutionException e) { Throwable cause = e.getCause(); if (cause instanceof SQLException) […]

如何使用Google Guava自动刷新缓存?

我正在使用Google Guava库进行缓存。 对于自动缓存刷新,我们可以执行以下操作: cache = CacheBuilder.newBuilder() .refreshAfterWrite(15, TimeUnit.MINUTES) .maximumSize(100) .build(….); 但是, 当发生第一个条目的陈旧请求时,将执行自动刷新 。 有没有办法自动刷新它,即使没有缓存数据的请求? 就像每15分钟一样,缓存数据应该从Db中提取并加载它,无论是否有人调用缓存数据。 此外,Guava的缓存到期时间适用于整个缓存。 是否可以基于密钥使缓存值失效? 像密钥“NOT_SO_FREQ_CHANGE_DATA”的缓存数据每1小时到期一次,密钥“FREQ_CHANGING_DATA”的数据应该每15分钟到期一次?

OSCache与EHCache

从来没有使用过像这样的缓存。 问题是我想从数据库中加载500,000条记录并快速选择/过滤邪恶的记录。 我正在考虑使用缓存,初步发现EHCache和OSCache ,有什么意见吗?

是否有针对Java的开源堆外缓存解决方案?

Terracotta BigMemory有没有开源替代品? 实际上我甚至找不到任何商业选择。 我对纯Java解决方案很感兴趣,它可以在JVM中运行,而不需要任何JNI和C支持的解决方案。

Guava如何使CacheBuilder中的条目到期?

我想使用CacheBuilder,如下所示: 带有过期密钥的基于Java时间的映射/缓存 但是我不明白Guava知道什么时候到期。 番石榴是如何做到的,它的性能成本是多少?