手写Redis之LRU淘汰算法
Posted 三名狂客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写Redis之LRU淘汰算法相关的知识,希望对你有一定的参考价值。
一、内存淘汰机制
redis 内存淘汰机制有以下几个:
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
LRU算法实现类:
package com.test.day01;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 手写LRU 算法
* @author zc
*
*/
public class LRUCache<K,V> extends LinkedHashMap<K,V>
private static final long serialVersionUID = 1L;
//设置缓存的大小
private int CACHE_SIZE;
/**
* 构造函数初始化缓存的大小
* @param cacheSize 缓存大小
*/
public LRUCache(int cacheSize)
// true 表示让linkedHashMap 按照访问顺序来进行排序,最近访问的放在头部,最老访问的放在尾部
super((int)Math.ceil(cacheSize/0.75)+1,0.75f,true);
this.CACHE_SIZE =cacheSize;
/***
* 缓存是否已满
*/
@Override
protected boolean removeEldestEntry(Map.Entry<K, V>eldest)
//当map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据
boolean bool= size()> CACHE_SIZE;
if(bool)
System.out.println("清除缓存key:"+eldest.getKey());
return bool;
public static void main(String[] args)
LRUCache<String,String> cache =new LRUCache<String,String>(5);
cache.put("1", "1");
cache.put("2", "2");
cache.put("3", "3");
cache.put("4", "4");
cache.put("5", "5");
System.out.println("初始化: ");
System.out.println(cache.keySet());
System.out.println("访问3: ");
cache.get("3");
System.out.println(cache.keySet());
System.out.println("访问2: ");
cache.get("2");
System.out.println(cache.keySet());
System.out.println("增加数据 6,7: ");
cache.put("6","6");
cache.put("7","7");
System.out.println(cache.keySet());
输出:
初始化:
[1, 2, 3, 4, 5]
访问3:
[1, 2, 4, 5, 3]
访问2:
[1, 4, 5, 3, 2]
增加数据 6,7:
清除缓存key:1
清除缓存key:4
[5, 3, 2, 6, 7]
以上是关于手写Redis之LRU淘汰算法的主要内容,如果未能解决你的问题,请参考以下文章
手写Redis淘汰策略中lru算法(删除最近未使用的值) java版
redis前传自己手写一个LRU策略 | redis淘汰策略
redis前传自己手写一个LRU策略 | redis淘汰策略