返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈java如何实现Redis的LRU缓存机制
  • 400
分享到

浅谈java如何实现Redis的LRU缓存机制

2024-04-02 19:04:59 400人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录LRU概述使用LinkedHashMap实现 使用LinkedHashMap简单方法实现双链表+hashmapLRU概述 最近使用的放在前面,最近没用的放在后面,如果

LRU概述

最近使用的放在前面,最近没用的放在后面,如果来了一个新的数,此时内存满了,就需要把旧的数淘汰,那为了方便移动数据,肯定就得使用链表类似的数据结构,再加上要判断这条数据是不是最新的或者最旧的那么应该也要使用hashmap等key-value形式的数据结构。

使用LinkedHashMap实现 


package thread;
import java.util.LinkedHashMap;
import java.util.Map;
 
public class LRUCacheTest {
    int capacity;
    Map<Integer,Integer> map;
 
    public LRUCacheTest(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) {
        LRUCacheTest lruCache = new LRUCacheTest(10);
        for (int i = 0; i < 10; i++) {
            lruCache.map.put(i,i);
            System.out.print(lruCache.map.size()+"\t");
        }
        System.out.println();
        System.out.println(lruCache.map);
        lruCache.put(10,200);
        System.out.println(lruCache.map);
        lruCache.put(11,100);
        System.out.println(lruCache.map);
        lruCache.get(2);
        System.out.println(lruCache.map);
    }
 
}





结果来看是正确的,距离当前时间最远的数据被淘汰

使用LinkedHashMap简单方法实现

LinkedHashMap是维护了双向链表的HashMap,保持了插入元素的顺序。

LinkedHashMap提供了一个钩子方法,在新插入元素后可以决定是否删除最老的元素。

复写removeEldestEntry实现


package thread;
import java.util.LinkedHashMap;
import java.util.Map;
 
public class LRUByLinkedHashMap extends LinkedHashMap<Integer,Integer> {
    
    private int maxSize;
 
    public LRUByLinkedHashMap(int maxSize) {
        // 容量为最大值/0.75,即最大负载容量为maxSize
        // accessOrder=true  根据查询排序,即最近被使用的放到后面
        super((int) Math.ceil(maxSize / 0.75) + 1, 0.75f, true);
        this.maxSize = maxSize;
    }
 
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
        return size() > maxSize;
    }
 
    public static void main(String[] args) {
        LRUByLinkedHashMap hashMap = new LRUByLinkedHashMap(10);
        for (int i = 0; i < 10; i++) {
            hashMap.put(i,i);
            System.out.print(hashMap.size()+"\t");
        }
        System.out.println();
        System.out.println(hashMap);
        hashMap.put(10,200);
        System.out.println(hashMap);
        hashMap.put(11,100);
        System.out.println(hashMap);
        hashMap.get(10);
        System.out.println(hashMap);
    }
 
}

双链表+hashmap


package thread;
import java.util.HashMap;
import java.util.Map;
 
public class LRURedis {
    private int capacity;
    private Map<Integer,Listnode> map;
    private ListNode head;
    private ListNode tail;
 
    public LRURedis(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;
        }
    }
}

到此这篇关于浅谈java如何实现Redis的LRU缓存机制的文章就介绍到这了,更多相关java实现Redis的LRU缓存机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈java如何实现Redis的LRU缓存机制

本文链接: https://lsjlt.com/news/129406.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈java如何实现Redis的LRU缓存机制
    目录LRU概述使用LinkedHashMap实现 使用LinkedHashMap简单方法实现双链表+hashmapLRU概述 最近使用的放在前面,最近没用的放在后面,如果...
    99+
    2024-04-02
  • 如何实现Redis的LRU缓存机制
    这篇文章给大家分享的是有关如何实现Redis的LRU缓存机制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用...
    99+
    2023-06-14
  • Java手动实现Redis的LRU缓存机制
    目录前言第一种实现(使用LinkedHashMap)第二种实现(双链表+hashmap)补充前言 最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到...
    99+
    2024-04-02
  • java怎么实现Redis的LRU缓存机制
    本篇内容主要讲解“java怎么实现Redis的LRU缓存机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java怎么实现Redis的LRU缓存机制”吧!目录LRU概述使用LinkedHashM...
    99+
    2023-06-20
  • 手动实现Redis的LRU缓存机制示例详解
    前言 最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用LRU等淘汰机制,然后找了这方面的一些资料与大家分享一下。 LRU总体大概...
    99+
    2024-04-02
  • Redis如何实现LRU缓存淘汰算法
    小编给大家分享一下Redis如何实现LRU缓存淘汰算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 标准LRU的实现原理LR...
    99+
    2024-04-02
  • Java如何实现LRU缓存淘汰算法
    这篇文章主要介绍了Java如何实现LRU缓存淘汰算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述LRU 算法全称为 Least Recently Used 是一种常见的...
    99+
    2023-06-15
  • spring redis注解如何实现缓存机制
    这篇文章给大家分享的是有关spring redis注解如何实现缓存机制的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1、xml配置 <bean id="poolC...
    99+
    2024-04-02
  • Java实现LRU缓存的实例详解
    Java实现LRU缓存的实例详解1.CacheCache对于代码系统的加速与优化具有极大的作用,对于码农来说是一个很熟悉的概念。可以说,你在内存中new 了一个一段空间(比方说数组,list)存放一些冗余的结果数据,并利用这些数据完成了以空...
    99+
    2023-05-31
    java lru缓存 ava
  • 浅谈SpringBoot集成Redis实现缓存处理(Spring AOP实现)
    第一章 需求分析计划在Team的开源项目里加入Redis实现缓存处理,因为业务功能已经实现了一部分,通过写Redis工具类,然后引用,改动量较大,而且不可以实现解耦合,所以想到了Spring框架的AOP(面向切面编程)。开源项目:https...
    99+
    2023-05-30
    springboot redis 缓存
  • Redis的LRU缓存淘汰算法怎么实现
    本文小编为大家详细介绍“Redis的LRU缓存淘汰算法怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis的LRU缓存淘汰算法怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2024-04-02
  • 浅谈SpringCache与redis集成实现缓存解决方案
    缓存可以说是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache 、Guava、HazelCast等。Redis作为key-value型数据库,由于他的这一特性,Redis也成为一种流行的数据缓存工具...
    99+
    2023-05-30
    spring cache redis
  • Java和Android的LRU缓存及实现原理
    一、概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存。Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的...
    99+
    2022-06-06
    JAVA Android
  • JavaScript如何实现LRU缓存淘汰算法
    目录如何实现LRU缓存淘汰算法使用哈希表和双向链表哈希表实现LRU缓存淘汰算法如何实现LRU缓存淘汰算法 LRU(Least Recently Used)缓存淘汰算法是一种常见的缓存...
    99+
    2023-05-17
    JavaScript LRU缓存淘汰算法 LRU缓存淘汰算法 JavaScript LRU
  • 浅谈用java实现事件驱动机制
    由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本身以及其标准库中并没有提供事件驱动机制的相关接口,虽然Swing(我且认为其不属于标准库,因为一般没...
    99+
    2023-05-31
    java 事件处理机制 ava
  • 如何进行Java 同步机制浅谈
    如何进行Java 同步机制浅谈,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就...
    99+
    2023-06-03
  • Java实现LRU缓存算法的参考示例
    目录一、什么是 LRU二、Java 实现 LRU 缓存算法一、什么是 LRU LRU(Least Recently Used,最近最少使用)是...
    99+
    2023-05-20
    Java 算法 Java LRU缓存算法 Java LUR
  • java实现LRU缓存淘汰算法的方法
    LRU算法:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的缓存(即使该缓存被访问的次数最多)。 如何实现LRU缓存淘汰算法 场景: ...
    99+
    2024-04-02
  • 怎么在Redis中实现缓存失效机制
    在Redis中,可以通过设置过期时间来实现缓存失效机制。可以使用EXPIRE命令来设置某个键的过期时间,当到达过期时间时,Redis...
    99+
    2024-03-11
    Redis
  • redis如何实现清空缓存
    目录redis如何清空缓存正文Redis缓存问题如何清空我的是免安装版的redisredis如何清空缓存 如果你们的项目用到redis啦,虽然设置了过期时间,但有时候修改bug,仍然需要及时清空缓存,去读数据库的数据,所...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作