Redis底层原理 (Redis LRU算法)(三)

LRU算法 vs Redis近似LRU算法 LRU算法vsRedis近似LRU算法 阅读详情

LRU缓存淘汰算法

LRU是(Least Recently Used)最近最少使用策略的缩写,是根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

LRU 算法的核心数据结构就是哈希链表,双向链表和哈希表的结合体。其设计思想:就是借助哈希表赋予了链表快速查找的特性,可以快速查找某个 key 是否存在缓存(链表)中,同时可以快速删除、添加节点。

哈希链表实现LRU

将Cache的所有位置都用双链表连接起来,当一个位置被命中之后,通过调整链表的指向,将该位置调整到链表头/尾的位置,新加入的Cache直接加到链表头/尾中。

这样,在多次进行Cache操作后,最近被命中的,就会被向链表头/尾方向移动,而没有命中的,而向链表尾/头方向移动,链表尾/头则表示最近最少使用的Cache。

当需要替换内容时候,链表的头/尾节点就是最少被命中的位置,我们只需要淘汰链表这部分即可。

 LRU算法设计:

package com.wang.redis.lru;

import java.util.LinkedHashMap;

public class LRUCache {
    private  Node head;
    private Node end;

    // 哈希map
    private HashMap<String,Node> hashMap;
    //缓存存储上限
    private int limit;

    public LRUCache(int limit){
        this.limit = limit;
        hashMap = new HashMap<>();
    }

    /**
     * 获取节点,更新双向链表中当前节点顺序
     * @param key
     * @return
     */
    public String get(String key){
        Node node = hashMap.get(key);
        if(node == null){
            return null;
        }else{
            // 更新双向链表
            refreshNode(node);
            return node.value;
        }
    }

    /**
     * Map 中已存在,则更新Value,并刷新当前节点
     * Map 中不存在,判断容量,满则删除一个节点; 新建并添加节点。
     * @param key
     * @param value
     */
    public  void put(String key ,String value){
        Node node =  hashMap.get(key);
        if(node == null){
            if(hashMap.size()>= limit){
                String oldKey = removeNode(head);
                hashMap.remove(oldKey);
            }
            node = new Node(key,value);
            hashMap.put(key,node);
            addNode(node);
        }else{
            node.value=value;
            refreshNode(node);
        }
    }

    /**
     * 将指定节点从双向链表中删除
     * @param node
     * @return
     */
    public String removeNode(Node node){
        if(node == end){
            end = end.pre;
            end.next = null;
        }else if (node == head){
            head = head.next;
            head.pre = null;
        }else{
            node.pre.next = node.next;
            node.next.pre = node.pre;
        }
        return node.key;
    }

    /**
     * 尾部插入节点
     * @param node
     */
    public void addNode(Node node){
        if(end != null){
            end.next = node;
            node.pre = end;
            node.next = null;
        }
        end = node;
        if(head == null){
            head = node;
        }
    }

    /**
     * 刷新当前节点位置
     * @param node
     */
    public void refreshNode(Node node){
        if(node == end){
            return ;
        }
        removeNode(node);
        addNode(node);
    }
}
class Node{
    public String  key;
    public String value;
    public Node pre;
    public Node next;
    public Node(String key,String value ){
        this.key=key;
        this.value=value;
    }
}

 

用blender为模型贴图并在gazebo中显示 用blender为模型贴图并在gazebo中显示 首先我用的是最新的blender2.92版本,附上链接https://www.blender.org/download/。并设置好简体中文。语言可以在编辑->偏好设置->界面里面设置。 首先界面右上角的摄像头,方块,灯光三个场景全都删除。 接着导入stl格式的模型文件,下面以tianbot_mini上面的激光雷达的模型为例。 导入激光雷达模型后,点击进入上方的UV Editing按钮进入UV编辑界面 此时我面看见网格化的激光雷达模型 阅读详情

相关推荐

优化问题-半正定规划(Semi-Definite Program, SDP)

半正定规划(Semi-Definite Program, SDP)在MIMO无线通信相关的信号处理中具有广泛的应用,在某些场景可以分析证明SDP的得到的解释原问题的全局最优化或者次优解。

qq_33668008的博客 1万+

玩转Redis-8种数据淘汰策略及近似LRU、LFU原理

《玩转Redis》系列第【14】篇,、Redis数据淘汰策略、8种数据淘汰策略、Redis缓存满了怎么办、Redis近似LRU算法、Redis的LFU算法,为什么Redis要使用自己的时钟?

zxiaofan.com 7467

STM32F103C8T6键盘DIY全攻略:从电路设计到固件烧录(附避坑指南)

本文详细介绍了基于STM32F103C8T6微控制器的DIY键盘制作全流程,涵盖硬件电路设计、按键矩阵实现、USB HID通信及固件烧录等关键步骤。特别针对常见问题提供避坑指南,帮助开发者高效完成从电路设计到功能实现的完整过程,打造个性化瀚文键盘。

soda5的博客 770

Redis系列 - Redis底层数据结构(简单动态字符串(SDS)、链表、字典、跳跃表、整数集合、压缩列表)

Redis系列 - Redis基本数据类型

u011485472的博客 2133

51单片机也能玩转信号发生器?手把手教你用DAC0832和LM358输出四种标准波形

本文详细介绍了如何使用51单片机和DAC0832芯片搭配LM358运放,自制低成本信号发生器,实现正弦波、矩形波、三角波和锯齿波四种标准波形的输出。从硬件选型、电路设计到编程实现,手把手教你完成这一实用电子项目,总成本不到50元,适合电子爱好者和学生实践。

weixin_30530939的博客 551

单细胞测序数据分析——细胞通讯 CellChat

cellchat

G2530051386的博客 1万+

lru算法实现 redis_redis面试题redis的lru算法手写lru算法

一、redis的缓存淘汰策略1、redis的缓存淘汰策略回收策略noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。a...

weixin_32657751的博客 247

PID不够用?试试给PID加上‘预言’能力:史密斯预测器(SP)在温控、液位控制中的实战配置

本文深入探讨了史密斯预测器(SP)在温控和液位控制中的应用,特别针对大滞后系统的PID控制难题。通过详细解析SP的核心组件、参数整定技巧及进阶应用FSP,结合西门子PLC的实战配置方案,帮助工程师有效提升控制精度和系统稳定性。文章还提供了S7-1200的完整实现步骤和调试技巧,为工业自动化控制提供了实用解决方案。

weixin_33686714的博客 468

什么是LRU算法

什么是LRU算法

似水流年QC的博客 3万+

EDA开源仿真工具verilator入门4:访问函数介绍

访问函数(Visitor Function)是verilator算法实现的主要工作方式之一,本节将介绍一下访问函数。

fangfanglovezhou的博客 1075

别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换)

本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。

weixin_30326515的博客 241

【数据结构与算法】Redis中LRU算法的基本思想

前言 LRU(least recently used)是一种缓存置换算法。即在缓存有限的情况下,如果有新的数据需要加载进缓存,则需要将最不可能被继续访问的缓存剔除掉。 基于 HashMap 和 双向链表实现 LRU 整体的设计思路是,可以使用 HashMap 存储 key,这样可以做到 save 和 get key的时间都是 O(1),而 HashMap...

SmallCatBaby的博客 724

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1658

深入了解Redis内存淘汰策略中的LRU算法应用

LRU(Least Recently Used,最近最少使用)算法是一种常见的内存淘汰策略,它根据数据的访问时间来决定哪些数据会被淘汰。LRU算法的核心思想是:最久未被访问的数据,被认为是最不常用的数据,应该被优先淘汰。LRU 算法广泛应用在诸多系统内,例如 Linux 内核页表交换,MySQL Buffer Pool 缓存页替换,以及 Redis 数据淘汰策略。简单来说,可以认为LRU算法是在维护一个链表,每次操作某个数据,就把数据移到链表的头部。例如:向一个缓存空间依次插入三个数据 A/B/C,填满了缓

qq_42581682的博客 2064

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

一文讲透Redis的LRU与LFU算法实现

通过对Redis LRU与LFU算法实现的介绍,我们可以大体了解两种算法策略的优缺点,在Redis运维过程中,可以依据业务数据的特性去选择相应的算法。如果业务数据的访问较为均匀,OPS或CPU利用率一般不会出现周期性的陡升或陡降,数据没有体现出相对的“冷热”特性,即建议采用LRU算法,可以满足一般的运维需求。相反,业务具备很强时效性,在活动推广或大促期间,业务某些数据会突然成为热点数据,监控上呈现出OPS或CPU利用率的大幅波动,为了能抓取热点数据便于后期的分析或优化,建议一定要配置成LFU算法。

weixin_64752717的博客 2551

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深度解析Redis缓存淘汰机制底层原理:LRU、LFU与随机算法的终极对决!

Redis作为内存数据库,所有数据都存储在宝贵的内存中。但内存空间是有限的,当内存使用达到。:Redis源码evict.c、redis.conf官方文档。每次随机选取5个key(可配置),淘汰其中最久未使用的。优先淘汰剩余生存时间(TTL)最短的key。为什么Redis不采用真正的LRU实现?LFU的Morris计数器是如何工作的?Redis淘汰机制的核心代码在。仅针对设置了过期时间的key。只淘汰设置了过期时间的key。实现简单,但可能淘汰热点数据。适用于数据访问完全随机的场景。

Leaton的博客 1274

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis 的 LRU 与 LFU 算法实现

重点介绍了 Redis 的 LRU 与 LFU 算法实现,并分析总结了两种算法的实现效果以及存在的问题。

每天都要开心呀(#^.^#) 1838

深入解析Redis的LRU与LFU算法实现

重点介绍了Redis的LRU与LFU算法实现,并分析总结了两种算法的实现效果以及存在的问题。

vivo互联网技术 1578

Redis vs Java:从底层看LRU算法的不同实现方式与性能对比

本文深入对比了Redis与Java中LRU算法的不同实现方式与性能表现。通过分析Java的双向链表+哈希表精确实现与Redis的近似LRU采样策略,揭示两者在数据结构、时间复杂度和适用场景上的核心差异,帮助开发者在高并发系统中做出最优缓存淘汰策略选择。

tgb3456789的博客 1122

缓存淘汰策略:LRU、LFU、FIFO 算法原理

LRU、LFU、FIFO、Two queues(2Q)算法原理

Java Punk 7873

Redis LRU缓存策略解析与应用

在当今大数据时代,缓存技术已成为提高系统性能的关键。Redis作为一款高性能的内存数据库,其LRU(Least Recently Used,最近最少使用)策略在缓存管理中扮演着重要角色。以下将围绕Redis知识点之LRU:概述展开,探讨其概念、应用场景及其重要性。在现实场景中,我们常常会遇到这样的问题:如何高效地管理缓存数据,确保系统在处理大量请求时仍能保持高性能?以一个电商网站为例,当用户浏览商品时,系统需要从数据库中读取商品信息并缓存起来,以便下次用户访问时能够快速响应。

JavaCodePro的博客 707

缓存淘汰算法--LRU算法的原理与应用

本文LRU算法的含义、应用、Java实现。 LRU算法全称是:Least Recently Used,即:检查最近最少使用的数据。这个算法通常使用在内存淘汰策略中,用于将不常用的数据转移出内存,将空间腾给最近更常用的“热点数据”。

IT利刃出鞘的博客 2374

追求性能极致 - Redis:LRU内存淘汰算法分析

上一期我们介绍了Redis系列18:过期数据的删除策略,但是无论是惰性删除还是定期删除,都可能存在删除不尽的情况,无法删除完全,比如每次删除完过期的 key 还是超过 25%,且这些 key 再也不会被客户端访问。这样的话,定期删除和堕性删除可能都彻底的清理掉。如果这种情况长时间持续下去,可能会导致内存耗尽,所以Redis必须有一个完善的内存淘汰机制来保障。这就是我们这一篇的重点,Redis内存自动淘汰机制。这一篇我们介绍了Redis的几种内存淘汰策略,并且详细分析了LRU算法的实现原理。

smart_an的专栏 1178

Redis的string的底层实现原理

Redis string底层实现采用多编码策略:int编码存储整数(直接存于指针),embstr编码存储短字符串(≤44字节,连续内存),raw编码存储长字符串(分块内存)。RedisObject结构统一管理数据类型、编码和值指针,自动进行编码转换。性能优化建议:优先使用整数、控制字符串长度、避免频繁修改embstr、使用批量操作。这种灵活设计在内存和性能间取得平衡,理解底层原理能有效提升Redis使用效率。

从不水文,坚持创作,加油 1184
上一篇: Redis底层原理 (Redis事务、Redis乐观锁)(四)
下一篇: Redis底层原理 (持久化以及集群)知识准备(五)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值