Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 512d78a

Browse files
committed
add redis lru&lfu content to the readme file
1 parent 27a7958 commit 512d78a

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

‎springboot-jedis-sample/README.md‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,45 @@ Zset的两种实现方式,ZipList和SkipList(跳表)
228228
SkipList本质上是并行的有序链表,但它克服了有序链表插入和查找性能不高的问题,它的插入和查询时间复杂度都是O(logN)
229229

230230

231+
#### LRU与LFU淘汰算法
232+
Redis缓存淘汰策略与Redis键的过期删除策略并不完全相同,前者是在Redis内存使用超过一定阈值的时候使用淘汰策略。而后者是通过定时+惰性删除两者结合的方式进行内存淘汰的。
233+
不同触发的条件逻辑:
234+
235+
> - 当某个key被设置了过期时间后,客户端每次对该key的访问(读写)都会去检查一遍key是否过期,如果过期直接删除;
236+
> - 如果过期的key不经常被访问,Redis会定时每秒检测10次,检测被设置有效期的所有key的集合,每次从集合中随机抽取20个key进行删除,如果删除后集合中过期key依然超过25%,那么会继续随机抽取20个key删除;
237+
238+
Redis内存不足时的缓存淘汰策略:
239+
240+
> - noeviction:当内存使用超过配置的时候会返回错误,不会删除任何key;
241+
> - allkeys-lru: 加入key的时候,如果有限,首先通过LRU算法删除最久没有使用的key;
242+
> - volatile-lru:加入key的时候如果有限,首先从设置了过期时间里删除最久没有使用的key;
243+
> - allkeys-random:加入key的时候如果有限,从所有key中随机删除key;
244+
> - volatile-random: 加入key的时候如果有限,从所有设置过期时间里随机删除key;
245+
> - volatile-ttl:从配置了过期时间里,删除快过期的key;
246+
> - volatile-lfu:从所有配置了过期时间里删除使用频率最少的key;
247+
> - allkeys-lfu:从所有key中删除使用频率最少的key;
248+
249+
250+
**Redis中的LRU实现:**
251+
252+
Redis中的LRU和Java中的LRU实现不一样,它并不采用链表的方式存储。
253+
Redis为每一个key维护了一个24位的时钟,同时也维护了一个全局的24位时钟,简单的理解就是当前系统的时间戳。如果要进行LRU,那么首先拿到当前全局的时钟,然后找到内部所有key时钟和全局时钟距离最久的key进行淘汰;
254+
255+
**Redis中的LFU实现 :**
256+
257+
LRU是Redis4.0后出现的淘汰算法,LRU的最近最少使用实际上是不精确的,因为使用距离时间较最久的key,不代表是使用频率最少的key;
258+
如下图,按照LRU会淘汰A,因为B的访问时间比A更近,但是A的使用频率远超于B,理应淘汰B;
259+
```asp
260+
A~~A~~A~~A~~A~~A~~A~~A~~A~~A~~~|
261+
B~~~~~B~~~~~B~~~~~B~~~~~~~~~~~B |
262+
```
263+
264+
LFU把原先的key对象内部的24位时钟分为了两个部分,前16位还代表时钟,后8位代表一个计数器。
265+
使用LFU淘汰时,会根据计数器中key使用的频率精准的淘汰最少使用频率的key。
266+
267+
268+
269+
231270

232271

233272

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /