Redis的淘汰策略

 

 

手写一个LRU:

import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int cacheSize;

    public LRUCache(int cacheSize) {
        // 设置访问顺序为访问顺序,即最近访问的元素将被放置在队列尾部
        super((int) Math.ceil(cacheSize / 0.75f) + 1, 0.75f, true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        // 当缓存大小超过设定值时,移除最旧(最近最少使用)的元素
        return size() > cacheSize;
    }

    public V get(K key) {
        return super.getOrDefault(key, null);
    }

    public void put(K key, V value) {
        super.put(key, value);
    }
}

以上代码创建了一个继承自LinkedHashMapLRUCache类,并重写了removeEldestEntry方法以在缓存满时自动删除最近最少使用的元素。构造函数中的0.75f是LinkedHashMap的负载因子,用于调整map的容量和性能之间的平衡,实际缓存大小我们设为传入参数cacheSize。

注意:这个实现没有处理线程安全问题,如果需要在多线程环境下使用,可以考虑使用ConcurrentHashMap或者其他并发容器,并对put和get操作进行同步控制。

 

具体使用

public class LRUCacheExample {
    public static void main(String[] args) {
        // 创建一个容量为3的LRU缓存对象
        LRUCache<Integer, String> cache = new LRUCache<>(3);

        // 插入元素
        cache.put(1, "One");
        cache.put(2, "Two");
        cache.put(3, "Three");

        // 输出缓存内容(此时应该是1 -> One, 2 -> Two, 3 -> Three)
        for (Map.Entry<Integer, String> entry : cache.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 访问已存在的元素,这将更新其在缓存中的位置(最近访问)
        System.out.println("Get value: " + cache.get(1));

        // 插入新的元素,由于缓存已满,最久未使用的键值对将会被移除
        cache.put(4, "Four");

        // 再次输出缓存内容,此时最旧的键值对1 -> One应该已经被移除
        System.out.println("\nAfter adding a new item:");
        for (Map.Entry<Integer, String> entry : cache.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

在上述LRU缓存实现中,当尝试插入第四个键值对(cache.put(4, "Four"))时,由于缓存容量限制为3个元素,且之前已经有三个键值对(1 -> One, 2 -> Two, 3 -> Three)存在,此时缓存已满。

由于LinkedHashMap的特性,在插入新的键值对时,它会自动将新插入的项移动到链表尾部,表示它是最近被访问或修改的。同时,通过重写removeEldestEntry方法,我们设置了当缓存大小超过设定容量(即size() > cacheSize)时,应当移除最旧的条目(即最近最少使用的条目)。

在这个例子中,因为没有其他键值对被访问过,所以最早插入的键值对1 -> One是当前最久未使用的项。因此,当插入第四个键值对时,LinkedHashMap内部机制将会触发removeEldestEntry方法,并返回true,导致键值对1 -> One被自动移除,从而为新的键值对4 -> Four腾出空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vivado使用记录(未完待续)

一、Zynq开发流程 二、软件安装 三、软件使用 字体大小修改&#xff1a;Setting、Font 四、Vivado基本开发流程 1、创建工程 Quick Start 组包含有 Create Project&#xff08;创建工程&#xff09;、 Open Project&#xff08;打开工程&#xff09;、 Open Example Project&…

无纸化电子sop系统帮助企业降低成本,提高目视化管理

无纸化电子SOP系统是一种基于数字化技术的生产管理系统&#xff0c;旨在优化员工的生产规范&#xff0c;提高产品质量。随着制造业的发展和数字化转型&#xff0c;越来越多的企业开始采用无纸化电子SOP系统来替代传统的纸质操作规程&#xff0c;以提升生产效率、降低成本、确保…

【变量提升】关于JavaScript变量提升的理解,它导致了什么问题?

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

JumpServer 简介安装

目录 1、概念介绍 JumpServer 概述 JumpServer 功能 JumpServer 组件 JumpServer 架构 2、前置安装 环境要求 安装 ELRepo 库 更新内核 设置 grub2 安装 Python 配置 Python 虚拟环境 3、安装 Jumpserver Core 组件 下载安装 替换客户端组件 安装 Python 依赖库…

力扣刷题

文章目录 1. 双指针1.1 两数之和1.2 三数之和1.3 盛最多水的容器1.4 接雨水 2. 字串2.1 滑动窗口最大值 3. 动态规划4. 多维动态规划4.1 最长回文字串 1. 双指针 1.1 两数之和 思路&#xff1a;因为是有序数组&#xff0c; 1.2 三数之和 题目要求不能重复 思路&#xff1a;三…

FPGA 串口多字节发送,串口回环测试

串口接收 串口帧 设计文件 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2023/01/12 23:11:28 // Design Name: // Module Name: UART_Byte_Rx // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies…

python螺旋数字矩阵

python螺旋数字矩阵 给出数字个数n&#xff0c;输出1-n (0<n ≤999)和行数m (0<m ≤ 999)&#xff0c;从左上角的1开始&#xff0c;按照顺时针螺旋向内写方式&#xff0c;依次写出2,3.….&#xff0c;最终形成一个m行矩阵。 1.每行数字的个数一样多 2.列的数量尽可能少 3…

01-环境搭建、SpringCloud微服务-黑马头条

环境搭建、SpringCloud微服务(注册发现、服务调用、网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&…

【netty系列-02】深入理解socket本质和BIO底层实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478 深入理解socket本质和bio底层实现 …

【RT-DETR有效改进】全新的SOATA轻量化下采样操作ADown(轻量又涨点,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的RT-DETR的项目,经过实验我发现该卷积模块(作为下采样模块)…

蓝桥杯备赛之二分专题

常用的算法二分模板 1. 在数组a[]中找大于等于x的第一个数的下标 //int ans lower_bound(a, a n, x) - a //相当于下方 int l 0, r n - 1; while(l < r) {int mid l r >> 1;if(a[mid] > x) r mid;else l mid 1; } cout << r;2. 在数组a[]中找大于…

间隔5分钟执行1次Python脚本设置步骤 —— 定时执行专家

《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件&#xff0c;用于在 Windows 系统上定时执行各种任务&#xff0c;包括执行脚本或程序。 下面是使用 "定时执行专家" 软件设置定时执行 Python 脚本的步骤&#xff1a; 步骤 1: 设置 P…

图遍历算法

图的遍历算法有两种&#xff1a;深度优先遍历、广度优先遍历算法。 深度优先遍历算法就是从起始结点开始&#xff0c;只要有相邻且未被访问的结点就要直接进行访问&#xff0c;直到最后不能向下遍历为止&#xff0c;再回溯寻找下一个策略。 广度优先遍历算法&#xff0c;就是从…

像SpringBoot一样使用Flask - 1.新建一个Flask项目

感谢各位对上一篇文章的喜爱&#xff0c;从事10年开发&#xff0c;希望借此可以简单实操下从SpringBoot到Flask的转型&#xff0c;少走一点弯路&#xff0c;多花一点时间在处理实际问题。 一、用pycharmConda新建一个Flask项目 二、得到一个Flask项目 三、运行起来访问下&#…

Spring Boot中实现图片上传功能的两种策略

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

selenium也能过某数、5s盾..

文章转载于&#xff1a;selenium也能过某数、5s盾… 直接安装: pip install undetected_chromedriver运行代码&#xff1a; import undetected_chromedriver as uc import timedriver uc.Chrome(executable_pathrC:\Users\chromedriver.exe,version_main111) driver.get(网…

单链表的实现(数据结构)

本篇博客主要是单链表&#xff08;无头单项不循环&#xff09;的实现的代码分享 说明&#xff1a;因为此单链表无头&#xff08;哨兵位&#xff09;&#xff0c;可以说成没有初始化也可以说初始化时没有一个有效地址作为单链表的起始地址 例如下面代码中的plist NULL。 所以在…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO&#xff1a;DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而&#xff0c;由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外&#xff0c;在训练的早期阶段匹配的不稳定性会…

iStoreOS系统内安装HomeAssistant服务

iStoreOS系统内安装HomeAssistant服务 1. HomeAssistant服务 HomeAssistant是一款基于Python的开源智能家居系统&#xff0c;简称HA。 HomeAssistant可以方便地连接各种外部设备&#xff0c;如智能设备、摄像头、邮件、短消息和云服务等&#xff0c;其成熟的可连接组件有近千…

【重温设计模式】迭代器模式及其Java示例

迭代器模式的介绍 在编程领域&#xff0c;迭代器模式是一种常见的设计模式&#xff0c;它提供了一种方法&#xff0c;使得我们可以顺序访问一个集合对象中的各个元素&#xff0c;而又无需暴露该对象的内部表示。你可以把它想象成一本书&#xff0c;你不需要知道这本书是怎么印…