①. LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据给予淘汰 (leetcode-cn.com/problems/lru-cache)
②. LRU算法题来源
③. 设计思想
public class LRUCacheDemo extends LinkedHashMap {/*** 缓存坑位*/private int capacity;public LRUCacheDemo(int capacity) {/*** @param initialCapacity the initial capacity* @param loadFactor the load factor* @param accessOrder the ordering mode - true for* access-order, false for insertion-order*/super(capacity,0.75F,true);this.capacity=capacity;}@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return super.size() > capacity;}public static void main(String[] args) {LRUCacheDemo lruCacheDemo = new LRUCacheDemo(3);lruCacheDemo.put(1,"a");lruCacheDemo.put(2,"b");lruCacheDemo.put(3,"c");// [1,2,3]System.out.println(lruCacheDemo.keySet());// [2,3,4]lruCacheDemo.put(4,"d");System.out.println(lruCacheDemo.keySet());// [2,4,3]lruCacheDemo.put(3,"c");System.out.println(lruCacheDemo.keySet());// [2,4,3]lruCacheDemo.put(3,"c");System.out.println(lruCacheDemo.keySet());// [4,3,5]lruCacheDemo.put(5,"c");System.out.println(lruCacheDemo.keySet());}
}
public class LRUSelfCacheDemo {// map 负责查找,构建一个虚拟的双向链表,它里面装的就是一个个 Node 节点,作为数据载体// 1.构造一个node节点作为数据载体class Node {K key;V value;Node prev;Node next;public Node() {this.prev = this.next = null;}public Node(K key, V value) {this.key = key;this.value = value;this.prev = this.next = null;}}// 2.构建一个虚拟的双向链表,,里面安放的就是我们的Nodeclass DoubleLinkedList {Node head;Node tail;public DoubleLinkedList() {head = new Node<>();tail = new Node<>();head.next = tail;tail.prev = head;}// 3.添加到头public void addHead(Node node) {node.next = head.next;node.prev = head;head.next.prev = node;head.next = node;}// 4.删除节点public void removeNode(Node node) {node.next.prev = node.prev;node.prev.next = node.next;node.prev = null;node.next = null;}// 5.获得最后一个节点public Node getLast() {return tail.prev;}}private int cacheSize;Map> map;DoubleLinkedList doubleLinkedList;public LRUSelfCacheDemo(int cacheSize) {this.cacheSize = cacheSize;//坑位map = new HashMap<>();//查找doubleLinkedList = new DoubleLinkedList<>();}public int get(int key) {if (!map.containsKey(key)) {return -1;}Node node = map.get(key);doubleLinkedList.removeNode(node);doubleLinkedList.addHead(node);return node.value;}public void put(int key, int value) {if (map.containsKey(key)) { //updateNode node = map.get(key);node.value = value;map.put(key, node);doubleLinkedList.removeNode(node);doubleLinkedList.addHead(node);} else {if (map.size() == cacheSize) //坑位满了{Node lastNode = doubleLinkedList.getLast();map.remove(lastNode.key);doubleLinkedList.removeNode(lastNode);}//新增一个Node newNode = new Node<>(key, value);map.put(key, newNode);doubleLinkedList.addHead(newNode);}}public static void main(String[] args) {LRUSelfCacheDemo lruCacheDemo = new LRUSelfCacheDemo(3);lruCacheDemo.put(1, 1);lruCacheDemo.put(2, 2);lruCacheDemo.put(3, 3);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(4, 1);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(3, 1);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(3, 1);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(3, 1);System.out.println(lruCacheDemo.map.keySet());lruCacheDemo.put(5, 1);System.out.println(lruCacheDemo.map.keySet());}
}
①. 查看Redis最大占用内存:打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转换
②. redis默认内存多少可以用?
如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB
③. 一般生产上你如何配置?
一般推荐Redis设置内存为最大物理内存的四分之三(和hashMap默认的负载因子0.75一致)
④. 通过修改文件配置[1]
⑤. 通过命令修改[2]
⑥. 什么命令查看redis内存使用情况?
info memory
上一篇:微信小程序项目转uniapp