Redis的内存淘汰策略问题

Redis配置内存
//设置Redis最大占用内存大小为100Mmaxmemory100mb
//设置Redis最大占用内存大小为100M127.0.0.1:6379> config set maxmemory 100mb//获取设置的Redis能使用的最大内存大小127.0.0.1:6379> config get maxmemory
Redis的内存淘汰
127.0.0.1:6379> config get maxmemory-policy
maxmemory-policy allkeys-lru
127.0.0.1:6379> config set maxmemory-policy allkeys-lru
LRU算法
public class LRUCache{ //容量private int capacity;//当前有多少节点的统计private int count;//缓存节点private Map> nodeMap; private Nodehead; private Nodetail; public LRUCache(int capacity) {if (capacity < 1) {throw new IllegalArgumentException(String.valueOf(capacity));}this.capacity = capacity;this.nodeMap = new HashMap<>();//初始化头节点和尾节点,利用哨兵模式减少判断头结点和尾节点为空的代码Node headNode = new Node(null, null);Node tailNode = new Node(null, null);headNode.next = tailNode;tailNode.pre = headNode;this.head = headNode;this.tail = tailNode;}public void put(k key, v value) {Nodenode = nodeMap.get(key); if (node == null) {if (count >= capacity) {//先移除一个节点removeNode();}node = new Node<>(key, value);//添加节点addNode(node);} else {//移动节点到头节点moveNodeToHead(node);}}public Nodeget(k key) { Nodenode = nodeMap.get(key); if (node != null) {moveNodeToHead(node);}return node;}private void removeNode() {Node node = tail.pre;//从链表里面移除removeFromList(node);nodeMap.remove(node.key);count--;}private void removeFromList(Nodenode) { Node pre = node.pre;Node next = node.next;pre.next = next;next.pre = pre;node.next = null;node.pre = null;}private void addNode(Nodenode) { //添加节点到头部addToHead(node);nodeMap.put(node.key, node);count++;}private void addToHead(Nodenode) { Node next = head.next;next.pre = node;node.next = next;node.pre = head;head.next = node;}public void moveNodeToHead(Nodenode) { //从链表里面移除removeFromList(node);//添加节点到头部addToHead(node);}class Node{ k key;v value;Node pre;Node next;public Node(k key, v value) {this.key = key;this.value = value;}}}
LRU在Redis中的实现
LFU算法
---END--- 重磅!码农突围-技术交流群已成立 扫码可添加码农突围助手,可申请加入码农突围大群和细分方向群,细分方向已涵盖:Java、Python、机器学习、大数据、人工智能等群。 一定要备注:开发方向+地点+学校/公司+昵称(如Java开发+上海+拼夕夕+猴子),根据格式备注,可更快被通过且邀请进群 ▲长按加群 推荐阅读
• Google 再见 Java • 面试官:我把数据库部署在Docker容器内,你觉得如何? • 华为阿里下班时间曝光:所有的光鲜,都有加班的味道 • 永远不要在代码中使用「User」这个单词! • 面试:如何决定使用 HashMap 还是 TreeMap? • 微软苏州集体抵制来自阿里、华为的跳槽者:请停止你的“奋斗逼”行为!网友:看到 955 不加班的公司名单,我酸了 最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:点“在看”,关注公众号并回复 BAT 领取,更多内容陆续奉上。 如有收获,点个在看,诚挚感谢 明天见(。・ω・。)ノ♡
评论

