我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何实现Redis的LRU缓存机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何实现Redis的LRU缓存机制

这篇文章给大家分享的是有关如何实现Redis的LRU缓存机制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前言

最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用LRU等淘汰机制,然后找了这方面的一些资料与大家分享一下。 LRU总体大概是这样的,最近使用的放在前面,最近没用的放在后面,如果来了一个新的数,此时内存满了,就需要把旧的数淘汰,那为了方便移动数据,肯定就得使用链表类似的数据结构,再加上要判断这条数据是不是最新的或者最旧的那么应该也要使用hashmap等key-value形式的数据结构。

第一种实现(使用LinkedHashMap)

public class LRUCache {  int capacity;  Map<Integer,Integer> map;  public LRUCache(int capacity){    this.capacity = capacity;    map = new LinkedHashMap<>();  }  public int get(int key){    //如果没有找到    if (!map.containsKey(key)){      return -1;    }    //找到了就刷新数据    Integer value = map.remove(key);    map.put(key,value);    return value;  }  public void put(int key,int value){    if (map.containsKey(key)){      map.remove(key);      map.put(key,value);      return;    }    map.put(key,value);    //超出capacity,删除最久没用的即第一个,或者可以复写removeEldestEntry方法    if (map.size() > capacity){      map.remove(map.entrySet().iterator().next().getKey());    }  }  public static void main(String[] args) {    LRUCache lruCache = new LRUCache(10);    for (int i = 0; i < 10; i++) {      lruCache.map.put(i,i);      System.out.println(lruCache.map.size());    }    System.out.println(lruCache.map);    lruCache.put(10,200);    System.out.println(lruCache.map);  }

如何实现Redis的LRU缓存机制

第二种实现(双链表+hashmap)

public class LRUCache {  private int capacity;  private Map<Integer,ListNode>map;  private ListNode head;  private ListNode tail;  public LRUCache2(int capacity){    this.capacity = capacity;    map = new HashMap<>();    head = new ListNode(-1,-1);    tail = new ListNode(-1,-1);    head.next = tail;    tail.pre = head;  }  public int get(int key){    if (!map.containsKey(key)){      return -1;    }    ListNode node = map.get(key);    node.pre.next = node.next;    node.next.pre = node.pre;    return node.val;  }  public void put(int key,int value){    if (get(key)!=-1){      map.get(key).val = value;      return;    }    ListNode node = new ListNode(key,value);    map.put(key,node);    moveToTail(node);    if (map.size() > capacity){      map.remove(head.next.key);      head.next = head.next.next;      head.next.pre = head;    }  }  //把节点移动到尾巴  private void moveToTail(ListNode node) {    node.pre = tail.pre;    tail.pre = node;    node.pre.next = node;    node.next = tail;  }  //定义双向链表节点  private class ListNode{    int key;    int val;    ListNode pre;    ListNode next;    //初始化双向链表    public ListNode(int key,int val){      this.key = key;      this.val = val;      pre = null;      next = null;    }  }}

像第一种方式,如果复写removeEldestEntry会更简单,这里简单的展示一下

public class LRUCache extends LinkedHashMap<Integer,Integer> {  private int capacity;    @Override  protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {    return size() > capacity;  }}

感谢各位的阅读!关于“如何实现Redis的LRU缓存机制”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何实现Redis的LRU缓存机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何实现Redis的LRU缓存机制

这篇文章给大家分享的是有关如何实现Redis的LRU缓存机制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用
2023-06-14

java怎么实现Redis的LRU缓存机制

本篇内容主要讲解“java怎么实现Redis的LRU缓存机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java怎么实现Redis的LRU缓存机制”吧!目录LRU概述使用LinkedHashM
2023-06-20

redis的缓存机制

redis提供了一种高效的缓存机制,使用键值对结构存储数据,并使用不同的数据结构来优化不同类型数据存储。当缓存达到容量限制时,它使用各种淘汰策略(如lru、lfu、ttl)来淘汰数据。redis缓存机制的优势包括提高应用程序性能、减少延迟、
redis的缓存机制
2024-04-19

JavaScript如何实现LRU缓存淘汰算法

LRU(LeastRecentlyUsed)缓存淘汰算法是一种常见的缓存淘汰策略,它的核心思想是优先淘汰最近最少使用的缓存数据,以保证缓存中的数据始终是最热门的。本文主要介绍了一些关于如何实现LRU缓存淘汰算法的方法,感兴趣的小伙伴可以参考一下
2023-05-17

Java如何实现LRU缓存淘汰算法

这篇文章主要介绍了Java如何实现LRU缓存淘汰算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述LRU 算法全称为 Least Recently Used 是一种常见的
2023-06-15

LeetCode中LRU 缓存机制的示例分析

这篇文章主要介绍了LeetCode中LRU 缓存机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最
2023-06-19

Java实现LRU缓存的实例详解

Java实现LRU缓存的实例详解1.CacheCache对于代码系统的加速与优化具有极大的作用,对于码农来说是一个很熟悉的概念。可以说,你在内存中new 了一个一段空间(比方说数组,list)存放一些冗余的结果数据,并利用这些数据完成了以空
2023-05-31

怎么在Redis中实现缓存失效机制

在Redis中,可以通过设置过期时间来实现缓存失效机制。可以使用EXPIRE命令来设置某个键的过期时间,当到达过期时间时,Redis会自动删除该键。例如:SET mykey "hello"EXPIRE mykey 60上述命令将myke
怎么在Redis中实现缓存失效机制
2024-03-11

Java和Android的LRU缓存及实现原理

一、概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存。Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHashMap就是直接继承了LinkedHas
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录