最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

手動實現(xiàn)Redis的LRU緩存機制示例詳解

 更新時間:2021年03月26日 09:06:24   作者:拉霍拉卡  
這篇文章主要介紹了手動實現(xiàn)Redis的LRU緩存機制示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

最近在逛博客的時候看到了有關(guān)Redis方面的面試題,其中提到了Redis在內(nèi)存達(dá)到最大限制的時候會使用LRU等淘汰機制,然后找了這方面的一些資料與大家分享一下。 LRU總體大概是這樣的,最近使用的放在前面,最近沒用的放在后面,如果來了一個新的數(shù),此時內(nèi)存滿了,就需要把舊的數(shù)淘汰,那為了方便移動數(shù)據(jù),肯定就得使用鏈表類似的數(shù)據(jù)結(jié)構(gòu),再加上要判斷這條數(shù)據(jù)是不是最新的或者最舊的那么應(yīng)該也要使用hashmap等key-value形式的數(shù)據(jù)結(jié)構(gòu)。

第一種實現(xiàn)(使用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;
    }
    //找到了就刷新數(shù)據(jù)
    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,刪除最久沒用的即第一個,或者可以復(fù)寫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);
  }

在這里插入圖片描述

第二種實現(xiàn)(雙鏈表+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;
    }
  }

  //把節(jié)點移動到尾巴
  private void moveToTail(ListNode node) {
    node.pre = tail.pre;
    tail.pre = node;
    node.pre.next = node;
    node.next = tail;
  }

  //定義雙向鏈表節(jié)點
  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;
    }
  }
}

像第一種方式,如果復(fù)寫removeEldestEntry會更簡單,這里簡單的展示一下

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

到此這篇關(guān)于手動實現(xiàn)Redis的LRU緩存機制的文章就介紹到這了,更多相關(guān)Redis的LRU緩存機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis的幾種數(shù)據(jù)類型使用詳解

    Redis的幾種數(shù)據(jù)類型使用詳解

    這篇文章主要介紹了Redis的幾種數(shù)據(jù)類型使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • redis實現(xiàn)session共享的方法

    redis實現(xiàn)session共享的方法

    本文主要介紹了redis實現(xiàn)session共享的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Redis Scan命令的基本使用方法

    Redis Scan命令的基本使用方法

    這篇文章主要給大家介紹了關(guān)于Redis中Scan命令的基本使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Redis教程(六):Sorted-Sets數(shù)據(jù)類型

    Redis教程(六):Sorted-Sets數(shù)據(jù)類型

    這篇文章主要介紹了Redis教程(六):Sorted-Sets數(shù)據(jù)類型,本文講解了Sorted-Sets數(shù)據(jù)類型概述、相關(guān)命令列表、命令使用示例、應(yīng)用范圍等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 使用lua+redis解決發(fā)多張券的并發(fā)問題

    使用lua+redis解決發(fā)多張券的并發(fā)問題

    這篇文章主要介紹了使用lua+redis解決發(fā)多張券的并發(fā)問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 通過prometheus監(jiān)控redis實時運行狀態(tài)的操作方法

    通過prometheus監(jiān)控redis實時運行狀態(tài)的操作方法

    本文詳細(xì)介紹了如何通過Prometheus監(jiān)控Redis的運行狀態(tài),包括安裝配置Redis、Redis Exporter以及Prometheus,配置Prometheus監(jiān)控Redis指標(biāo),以及常見的Redis指標(biāo)和告警規(guī)則,需要的朋友可以參考下
    2025-02-02
  • Go語言操作RediSearch進行搜索方法示例詳解

    Go語言操作RediSearch進行搜索方法示例詳解

    這篇文章主要為大家介紹了Go語言操作RediSearch進行搜索方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 多維度深入分析Redis的5種基本數(shù)據(jù)結(jié)構(gòu)

    多維度深入分析Redis的5種基本數(shù)據(jù)結(jié)構(gòu)

    此篇文章主要對Redis的5種基本數(shù)據(jù)類型,即字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted?Set),從使用場景和底層結(jié)構(gòu)出發(fā),進行多維度深入分析。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Redis安裝圖文教程(Windows和Linux)

    Redis安裝圖文教程(Windows和Linux)

    這篇文章主要介紹了Redis安裝教程(Windows和Linux),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Redis高可用集群redis-cluster詳解

    Redis高可用集群redis-cluster詳解

    redis?cluster?是redis官方提供的分布式解決方案,在3.0版本后推出的,有效地解決了redis分布式的需求,當(dāng)一個redis節(jié)點掛了可以快速的切換到另一個節(jié)點,對redis-cluster高可用集群相關(guān)知識感興趣的朋友一起看看吧
    2022-03-03

最新評論

江川县| 伊通| 射洪县| 台南县| 云浮市| 伊金霍洛旗| 安远县| 安吉县| 克什克腾旗| 枣庄市| 麦盖提县| 务川| 阿克苏市| 泾源县| 武胜县| 大田县| 寿宁县| 伽师县| 云林县| 长宁县| 南丰县| 兴隆县| 江孜县| 水城县| 淮北市| 江达县| 江西省| 揭东县| 金山区| 措美县| 内丘县| 泰安市| 荔波县| 江城| 武夷山市| 陆良县| 河东区| 安庆市| 固始县| 苍溪县| 鸡泽县|