手写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版

Java手写原生的LRU算法

redis前传自己手写一个LRU策略 | redis淘汰策略

redis前传自己手写一个LRU策略 | redis淘汰策略

redis前传自己手写一个LRU策略 | redis淘汰策略

4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?