最少使用(LFU)是一种高速缓存算法,用于管理计算机内的内存。此方法的标准特性涉及系统跟踪内存中块被引用的次数。当缓存已满且需要更多空间时,系统将以最低参考频率清除项目。
例如,用Java来实现最近使用的对象缓存的最佳方法是什么?
我已经使用LinkedHashMap实现了一个(通过保持访问对象的次数),但是我很好奇是否有任何新的并发集合会更好。
考虑这种情况:假设缓存已满,我们需要为另一个空间腾出空间。假设在缓存中记录了两个对象,它们只能访问一次。如果我们知道另一个(不在缓存中)对象被访问了不止一次,该删除哪个对象?
谢谢!
//一个静态方法,该方法返回自1970年1月1日以来的当前日期和时间(以毫秒为单位)long long longTS =
System.currentTimeMillis();。
ConcurrentJava集合中尚未实现ConcurrentLinkedHashMap。(参考:Java Concurrent Collection API)。但是,您可以尝试使用ConcurrentHashMap和DoublyLinkedList
关于要考虑的情况:在这种情况下,正如我已经说过的那样,您可以声明最新的变量,根据最新的变量的值,可以删除条目并添加新对象。(不要忘记更新添加的新对象的频率和最新TS)
如前所述,可以使用LinkedHashMap,因为它在O(1)中提供了元素访问权限,并且还可以遍历订单。请在LFU缓存中找到以下代码:(PS:以下代码是标题中“如何实现LFU缓存”问题的答案)
import java.util.LinkedHashMap;
import java.util.Map;
public class LFUCache {
class CacheEntry
{
private String data;
private int frequency;
// default constructor
private CacheEntry()
{}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public int getFrequency() {
return frequency;
}
public void setFrequency(int frequency) {
this.frequency = frequency;
}
}
private static int initialCapacity = 10;
private static LinkedHashMap<Integer, CacheEntry> cacheMap = new LinkedHashMap<Integer, CacheEntry>();
/* LinkedHashMap is used because it has features of both HashMap and LinkedList.
* Thus, we can get an entry in O(1) and also, we can iterate over it easily.
* */
public LFUCache(int initialCapacity)
{
this.initialCapacity = initialCapacity;
}
public void addCacheEntry(int key, String data)
{
if(!isFull())
{
CacheEntry temp = new CacheEntry();
temp.setData(data);
temp.setFrequency(0);
cacheMap.put(key, temp);
}
else
{
int entryKeyToBeRemoved = getLFUKey();
cacheMap.remove(entryKeyToBeRemoved);
CacheEntry temp = new CacheEntry();
temp.setData(data);
temp.setFrequency(0);
cacheMap.put(key, temp);
}
}
public int getLFUKey()
{
int key = 0;
int minFreq = Integer.MAX_VALUE;
for(Map.Entry<Integer, CacheEntry> entry : cacheMap.entrySet())
{
if(minFreq > entry.getValue().frequency)
{
key = entry.getKey();
minFreq = entry.getValue().frequency;
}
}
return key;
}
public String getCacheEntry(int key)
{
if(cacheMap.containsKey(key)) // cache hit
{
CacheEntry temp = cacheMap.get(key);
temp.frequency++;
cacheMap.put(key, temp);
return temp.data;
}
return null; // cache miss
}
public static boolean isFull()
{
if(cacheMap.size() == initialCapacity)
return true;
return false;
}
}
本文向大家介绍在Python中实现最少使用的缓存的程序,包括了在Python中实现最少使用的缓存的程序的使用技巧和注意事项,需要的朋友参考一下 假设我们要为最不常用(LFU)缓存系统实现数据结构。它应支持以下操作: get(key) −如果密钥存在于高速缓存中,则这有助于获取密钥的值,否则返回-1。 set(key, value) −如果密钥不存在,将用于设置或插入值。 当缓存达到最大容量时,它应
问题内容: 我试图找到一种有效,正常或简单的方法来将缓动函数实现到我的Java程序中。我已经启用了缓动功能,但是我觉得 有一种更有效的方法可以实现;我看不到的那一个,可能是因为隧道视线。这是我的代码;有人可以向我展示我应该做些什么吗?或为我指明进行研究的方向 我尝试为在线发现的线性缓动函数实现calc()方法,但是它实际上是无用的,因为 除非被迫将方程式直接插入到行中,否则我无法使它起作用。 问题
我正在开发一个Web应用程序,其中后端在Spring引导中开发,消耗公共API中返回JSON中数据的数据。搜索是通过术语、全文(像谷歌)完成的,后端从应用程序前端接收用户的查询,用户的查询反过来搜索公共应用编程接口,等待响应,处理信息并将其发送到前端。我想在后端Spring Boot中实现缓存系统。基本上,在Spring引导调用API发布并等待响应之前,它会检查键/值系统是否已经在过去完成了搜索,
问题内容: 我试图使用LinkedHashMap实现LRU缓存。在LinkedHashMap的文档(http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html)中,它表示: 请注意,如果将密钥重新插入到映射中,则插入顺序不会受到影响。 但是当我做以下推 输出是 这表明重新插入确实影响了订单。有人知道任何解释吗? 问题答
问题内容: 我想在Web Java应用程序中实现重量级对象的简单缓存。但是我不知道该怎么做。 我是否缺少某些东西或ConcurrentHashMap方法(putIfAbsent等)还不够,是否需要额外的同步? 是否有更好的简单API(在内存存储中,没有外部配置)来执行此操作? P. 问题答案: 如果为要缓存的内容临时拥有多个实例是安全的,则可以执行“无锁”缓存,如下所示: 多个线程可以“竞争”来创
我想用foldr或FoldMap实现最小值。根据这项工作,它应该有这样的定义: 这听起来很简单,但我不知道我可以为下面的X添加什么来使其工作。请帮忙? 如果你向我展示如何使用foldMap也会得到额外的分数,但这似乎更难。