@@ -51,33 +51,44 @@ Redis 内存淘汰机制有以下几个:
51
51
52
52
### 手写一个 LRU 算法
53
53
54
+ LRU 就是 Least Recently Used 的缩写,翻译过来就是“最近最少使用”。也就是说 LRU 算法会将最近最少用的缓存移除,让给最新使用的缓存。而往往最常读取的,也就是读取次数最多的,所以利用好 LRU 算法,我们能够提供对热点数据的缓存效率,能够提高缓存服务的内存使用率。
55
+
56
+ 那么如何实现呢?
57
+
58
+ 其实,实现的思路非常简单,就像下面这张图种描述的一样。
59
+
60
+ ![ ] ( ./images/lru.png )
61
+
54
62
你可以现场手写最原始的 LRU 算法,那个代码量太大了,似乎不太现实。
55
63
56
64
不求自己纯手工从底层开始打造出自己的 LRU,但是起码要知道如何利用已有的 JDK 数据结构实现一个 Java 版的 LRU。
57
65
66
+ ![ ] ( ./images/lru-cache.png )
67
+
58
68
``` java
59
- class LRUCache <K, V> extends LinkedHashMap<K , V > {
60
- private final int CACHE_SIZE ;
69
+ public class LRUCache <K, V> extends LinkedHashMap<K , V > {
70
+ private int capacity ;
61
71
62
72
/**
63
73
* 传递进来最多能缓存多少数据
64
74
*
65
- *
8000
@param cacheSize 缓存大小
75
+ * @param capacity 缓存大小
66
76
*/
67
- public LRUCache (int cacheSize ) {
68
- // true 表示让 linkedHashMap 按照访问顺序来进行排序,最近访问的放在头部,最老访问的放在尾部。
69
- super ((int ) Math . ceil(cacheSize / 0.75 ) + 1 , 0.75f , true );
70
- CACHE_SIZE = cacheSize;
77
+ public LRUCache (int capacity ) {
78
+ super (capacity, 0.75f , true );
79
+ this . capacity = capacity;
71
80
}
72
81
73
82
/**
74
- * 钩子方法,通过put新增键值对的时候,若该方法返回true
75
- * 便移除该map中最老的键和值
83
+ * 如果map中的数据量大于设定的最大容量,返回true,再新加入对象时删除最老的数据
84
+ *
85
+ * @param eldest 最老的数据项
86
+ * @return true则移除最老的数据
76
87
*/
77
88
@Override
78
89
protected boolean removeEldestEntry (Map .Entry<K , V > eldest ) {
79
- // 当 map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据。
80
4F05
td>- return size() > CACHE_SIZE ;
90
+ // 当 map中的数据量大于指定的缓存个数的时候,自动移除最老的数据
91
+ return size() > capacity ;
81
92
}
82
93
}
83
94
```
0 commit comments