java(LRU 算法)

package link;

import java.util.HashMap;

/**
 * LRU 算法实现(Redis底层算法实现)
 * @author liguoliang
 *
 */
public class LRUCache {
	private Node head;
	private Node end;
	private int limit;
	private HashMap<String,Node> hashMap;
	public LRUCache(int limit) {
		this.limit=limit;
		hashMap=new HashMap<String,Node>();
		
	}
	public String get(String key) {
		Node node=hashMap.get(key);
		if(node==null) {
			return null;
		}
		refreshNode(node);
		return node.value;
	}
	public void put(String key,String value) {
		Node node=hashMap.get(key);
		if(node==null) {
			//如果Key不存在,则插入key-value
			if(hashMap.size()>=limit) {
				String oldKey=removeNode(head);
				hashMap.remove(oldKey);
			}
			node=new Node(key, value);
			addNode(node);
			hashMap.put(key, node);
		}
		else {
			//如果key存在,则刷新key-value
			node.value=value;
			refreshNode(node);
		}
	}
	
	public void remove(String key) {
		Node node=hashMap.get(key);
		removeNode(node);
		hashMap.remove(key);
	}
	/**
	 * 刷新被访问的节点位置
	 * @param node 被访问的节点
	 */
	private void refreshNode(Node node) {
		//如果访问的是尾节点,则无需移动节点
		if(node==null) {
			return ;
		}
		//移动节点
		removeNode(node);
		addNode(node);
	}
	/**
	 * 删除节点
	 * @param node 要删除的节点
	 * @return
	 */
	private String removeNode(Node node) {
		if(node==head&&node==end) {
			//移动唯一的节点
			head=null;
			end=null;
		}else if(node==end) {
			//移动到尾节点
			end=end.pre;
			end.next=null;
		}else if(node==head) {
			//移动到头节点
			head=head.next;
			head.pre=null;
		}else {
			//移除中间节点
			node.pre.next=node.next;
			node.next.pre=node.pre;
		}
		return node.key;
	}

	private void addNode(Node node) {
		if(end!=null) {
			end.next=node;
			node.pre=end;
			node.next=null;
		}
		end=node;
		if(head==null) {
			head=node;
		}
	}
	
	
	class Node{
		Node(String key,String value){
			this.key=key;
			this.value=value;
		}
		public Node pre;
		public Node next;
		public String key;
		public String value;
	}
	public static void main(String[] args) {
		LRUCache lruCache=new LRUCache(5);
		lruCache.put("001", "用户1信息");
		lruCache.put("002", "用户1信息");
		lruCache.put("003", "用户1信息");
		lruCache.put("004", "用户1信息");
		lruCache.put("005", "用户1信息");
		lruCache.get("002");
		lruCache.put("004", "用户1信息");
		lruCache.put("006", "用户1信息");
		System.out.println(lruCache.get("001"));
		System.out.println(lruCache.get("006"));
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值