Redis缓存删除略和内存淘汰策略及LRU

1、Redis内存若在配置文件中未设置,内存会无限制增长,直到超出物理内存,抛出out of memory内存耗尽异常

        解决方法,调整maxmemory参数,一般设置为物理内存的3/4,并且添加缓存删除策略

2、Redis对于设置了过期时间的的键并不是过期立马删除,有三种缓存删除方案

        1、定时删除,定时任务去遍历所有过期键值,会占用cpu和影响性能

        2、惰性删除,过期了并不删,下次用到再删,会占用memory和内存泄漏

        3、定期删除,每过一段时间抽取一部分过期了的键删除,这种需要考虑具体的内存使用情况,配置好合理的定期时间。但依然会内存泄漏,需要兜底方案也就是内存淘汰策略。

3、Redis内存淘汰策略,可使用config set xxx命令或者修改配置文件种memory-policy

           分为两类,每类四种

所有key
allkeys-lru对所有key使用lru算法
allkeys-lfu对所有key使用lfu算法
allkeys-random对所有key使用随机删除算法
noviction不删除任何key(默认)
设置了过期时间的key
volatite-lru对设置了过期时间的key使用lru算法
volatite-lfu对设置了过期时间的key使用lfu算法
volatite-random对设置了过期时间的key使用随机删除
volatite-ttl删除过期的key

 4、lru算法-淘汰不经常使用的key,思路每次get或者put时,将数据重新插入,超过内存限制则删除最前面的数据。

public class LRUCache {private final Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();private int capacity;public LRUCache(int capacity) {this.capacity = capacity;}public int get(int key) {if(!map.containsKey(key)){return -1;}int v = map.get(key);map.remove(key);map.put(key, v);return v;}public void put(int key, int value) {map.remove(key);map.put(key, value);if(map.size() > capacity) {map.remove(map.entrySet().iterator().next().getKey());}System.out.println(map);}public static void main(String[] args) {LRUCache l = new LRUCache(2);l.put(2,1);l.put(1,1);l.put(2,3);l.put(4,1);l.get(1);}
}

5、实际上LinkedHashMap已经帮我们实现了lru算法,可以继承LinkedHashMap,具体如下

public class LRUCache extends LinkedHashMap {private int capacity;public LRUCache(int capacity) {super(capacity, 0.75f, true);this.capacity = capacity;}@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return super.size() > capacity;}public static void main(String[] args) {LRUCache l = new LRUCache(2);l.put(2,1);l.put(1,1);l.put(2,3);l.put(4,1);l.get(1);l.get(2);System.out.println(l);}
}

6、如果不基于LinkedHashMap我们需要自己实现存储+顺序结构,可使用哈希+双向链表实现。可以参考HashMap与AQS底层实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目经理的会议之道:全参与还是精选参与?

引言 在项目管理中&#xff0c;会议是一个常见的工具&#xff0c;用于沟通信息、解决问题、做出决策等。然而&#xff0c;项目经理是否需要参加所有的会议呢&#xff1f;这是一个值得深思的问题。作为项目经理&#xff0c;我们需要权衡会议的重要性和我们的时间管理。我们不能…

【第一阶段】kotlin的函数

函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范&#xff0c;先有输入&#xff08; getMethod(name:String,age:Int)&#xff09;再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…

Elasticsearch集群shard过多后导致的性能问题分析

1.问题现象 上午上班以后发现ES日志集群状态不正确&#xff0c;集群频繁地重新发起选主操作。对外不能正常提供数据查询服务&#xff0c;相关日志数据入库也产生较大延时 2.问题原因 相关日志 查看ES集群日志如下&#xff1a; 00:00:51开始集群各个节点与当时的master节点…

Playwright快速上手-1

前言 随着近年来对UI自动化测试的要求越来越高&#xff0c;,功能强大的测试框架也不断的涌现。本系列主讲的Playwright作为一款新兴的端到端测试框架,凭借其独特优势,正在逐渐成为测试工程师的热门选择。 本系列文章将着重通过示例讲解 Playwright python开发环境的搭建 …

Linux Day07

一、僵死进程 1.1僵死进程产生的原因 子进程先于父进程结束, 而父进程没有获取子进程退出码&#xff0c;释放子进程占用的资源&#xff0c;此时子进程将成为一个僵死进程。 在第一个框这里时父进程子进程都没有结束&#xff0c;显示其pid 父进程是2349&#xff0c;子进程是235…

【Nginx】Nginx网站服务

国外主流还是使用apache&#xff1b;国内现在主流是nginx&#xff08;并发能力强&#xff0c;相对稳定&#xff09; nginx&#xff1a;高性能、轻量级的web服务软件 特点&#xff1a; 1.稳定性高&#xff08;没apache稳&#xff09;&#xff1b; 2.系统资源消耗比较低&#xf…

Failed to set locale, defaulting to C.UTF-8 或者中文系统语言转英文系统语言

CentOS 8中执行命令&#xff0c;出现报错&#xff1a;Failed to set locale, defaulting to C.UTF-8报错原因&#xff1a; 1、没有安装相应的语言包。2、没有设置正确的语言环境。 解决方法1&#xff1a;安装语言包 设置语言环境需使用命令 localelocale -a 命令&#xff0c;查…

代码随想录day02

977.有序数组的平方 ● 力扣题目链接 ● 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 思路 ● 暴力排序&#xff0c;时间复杂度O(n nlogn) ● 使用双指针&#xff0c;时间复杂度O(n) …

Vue中使用v-bind:class动态绑定多个类名

Vue.js是一个流行的前端框架&#xff0c;它可以帮助开发者构建动态交互的UI界面。在Vue.js开发中&#xff0c;经常需要动态绑定HTML元素的class&#xff08;类名&#xff09;属性&#xff0c;以改变元素的外观和行为。本文将介绍采用v-bind:class指令在Vue中如何动态绑定多个类…

【大数据】-- 本地部署 Flink kubernetes operator

目录 1.说明 1.1 版本 1.2 kubernetes 环境 1.3 参考 2.安装步骤 2.1 安装本地 kubernetes 环境

判断链表有环的证明

目录 1.问题 2.证明 3.代码实现 1.问题 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用…

TansUNet代码理解

首先通过论文中所给的图片了解网络的整体架构&#xff1a; vit_seg_modeling部分 模块引入和定义相关量&#xff1a; # codingutf-8 # __future__ 在老版本的Python代码中兼顾新特性的一种方法 from __future__ import absolute_import from __future__ import division fr…

新基建助推数字经济,CosmosAI率先布局AI超算租赁新纪元

伦敦, 8月14日 - 在英国伦敦隆重的Raffles OWO举办的欧盟数字超算新时代战略合作签约仪式&#xff0c;CosmosAI、Infinite Money Fund与Internet Research Lab三方强强联手&#xff0c;达成了历史性的合作协议&#xff0c;共同迈向超算租赁新纪元。 ​ 这次跨界的合作昭示了全球…

Session基础

文章目录 什么是Sessionsession与cookie的区别和联系Session的存Session的取 什么是Session 服务器为每个用户浏览器创建一个会话对象&#xff08;session对象&#xff09;&#xff0c;一个浏览器只能产生一个session当新建一个窗口访问服务器时&#xff0c;还是原来的那个ses…

VR家装提升用户信任度,线上体验家装空间感

近些年&#xff0c;VR家装逐渐被各大装修公司引入&#xff0c;VR全景装修的盛行&#xff0c;大大增加了客户“所见即所得”的沉浸式体验感&#xff0c;不再是传统二维平面的看房模式&#xff0c;而是让客户通过视觉、听觉、交互等功能更加真实的体验家装后的效果。 对于传统家装…

本地Linux 部署 Dashy 并远程访问教程

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 转载自cpolar极点云文章&#xff1a;本地Linux 部署 Dashy 并远程访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你…

JS如何向数组中添加数组

常见的办法有 1、push()方法 var arr [a, b, c,d]; arr.push(e); console.log(arr); // [a, b, c, d,e] 2、concat()方法 var arr1 [a, b, c]; var arr2 [d, e, f]; var arr3 arr1.concat(arr2); console.log(arr3); // [a, b, c, d, e, f] 3、可以使用ES6中的spread操作符…

【git】Fork或者git clone克隆了别人项目,如何保持与原项目同步更新

Fork或者git clone克隆了别人项目&#xff0c;如何保持与原项目同步更新 #mermaid-svg-LC920CR873UxZJC3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LC920CR873UxZJC3 .error-icon{fill:#552222;}#mermaid-svg-…

BUUCTF 还原大师 1

题目描述&#xff1a; 我们得到了一串神秘字符串&#xff1a;TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母&#xff0c;为了确定这个神秘字符串&#xff0c;我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全&#xff0c;E903???4D…

【Vue3】自动引入插件-`unplugin-auto-import`

Vue3自动引入插件-unplugin-auto-import&#xff0c;不必再手动 import 。 自动导入 api 按需为 Vite, Webpack, Rspack, Rollup 和 esbuild 。支持TypeScript。由unplugin驱动。 插件安装&#xff1a;unplugin-auto-import 配置vite.config.ts&#xff08;配置完后需要重启…