redis缓存满了的话会发生什么?

线上问题

未及时加监控,导致线上redis被逐出,业务有损

示例:
一个key临时存储在redis等缓存中,如果该key在一段时间内有很大作用
比如一次业务请求,上游服务写入一个value,时长1小时,下游服务需要在1小时内读取它,并完成核心逻辑
如果被逐出后,导致下游拿不到数据,使得此次请求带来也业务问题

解决方法

redis 80%容量时添加监控,及时告警,及时进行业务处理。

学习文档

https://juejin.cn/post/6921884079830859789
在这里插入图片描述

影响

内存数据库,当其使用的内存超过物理内存限制后,内存和磁盘产生频繁的数据交换
导致Redis性能急剧下降

策略

通过配置参数maxmemoey来限制使用的内存大小。
当实际使用内存超过maxmemoey后,Redis提供了如下几种可选策略。

noeviction:(不驱逐,eviction表示驱逐)写请求返回错误
volatile-lru:使用lru算法删除设置了过期时间的键值对
volatile-lfu:使用lfu算法删除设置了过期时间的键值对
volatile-random:在设置了过期时间的键值对中随机进行删除
volatile-ttl:根据过期时间的先后进行删除,越早过期的越先被删除

allkeys-lru:在所有键值对中,使用lru算法进行删除
allkeys-lfu:在所有键值对中,使用lfu算法进行删除
allkeys-random:所有键值对中随机删除

附录

LRU - Least Recently Used

最近最少使用
最近访问的数据,后续很大概率还会被访问到
长时间未被访问的数据,应该被淘汰

LRU算法中数据会被放到一个链表中
链表的头节点为最近被访问的数据
链表的尾节点为长时间没有被访问的数据

LRU算法的核心实现是哈希表+双向链表
链表用来维护访问元素的顺序,哈希表可以在O(1)时间复杂度下进行元素访问

为什么是双向链表呢?
删除元素的话,需要获取前继节点

LFU - Least Frequently Used

LRU算法有一个问题,当一个长时间不被访问的key,偶尔被访问一下后,可能会造成一个比该key访问更频繁的key被淘汰。
LRU算法对key的冷热程度判断不准确。

最不经常使用
按照访问频率来判断key的冷热程度,每次删除的是一段时间内访问频率较低的数据,比LRU算法更准确

如何设计?

  1. 需要存储k-v的map:keyToVal

  2. 需要存储某个k的访问频次的map:keyToFreq

  3. 需要存储当前系统最小的访问频次:minFreq

  4. 当缓存满时有数据k2需要插入,需要先O1寻找访问频次最低且插入最早的k1,然后删除它,接着O1更新k2的访问频次
    某个访问频次的k可能不止一个,有多个,如何O1找到这些k,用访问频次-集合的存储:freqTokeys
    如何从找到的集合中O1找到插入最早的k1,用双向链表,表头作为该频次中插入最早的元素。
    最终选择既有O1找到集合的map+O1找到插入最早的k1 -> HashMap<Integer, LinkedHashSet>

    LinkedHashSet类,链表和集合的结合体
    链表不能快速删除元素,但是能保证插入顺序
    集合内部元素无序,但是能快速删除元素(O(lgN))
    LinkedHashSet是一种在迭代其元素时可以返回它们被插入的顺序的set(集合类型)
    也就是说,它可以保证元素的插入与访问顺序。

private HashMap<K, V> keyToVal; // HashMap
private HashMap<K, Integer> keyToFreq; // HashMap
private int minFreq;
private int capacity;
private HashMap<Integer, LinkedHashSet<K>> freqTokeys;
public class LfuCache<K, V> {private HashMap<K, V> keyToVal;private HashMap<K, Integer> keyToFreq;private HashMap<Integer, LinkedHashSet<K>> freqTokeys;private int minFreq;private int capacity;public LfuCache(int capacity) {keyToVal = new HashMap<>();keyToFreq = new HashMap<>();freqTokeys = new HashMap<>();this.capacity = capacity;this.minFreq = 0;}public V get(K key) {V v = keyToVal.get(key);if (v == null) {return null;}// 如果k存在,则增加访问频次increaseFrey(key);return v;}public void put(K key, V value) {// get方法里面会增加频次if (get(key) != null) {// 重新设置值keyToVal.put(key, value);return;}// 超出容量,删除频率最低的key 【逐出策略】if (keyToVal.size() >= capacity) {removeMinFreqKey();}// 能进入到这里说明:最小访问频次一定是1// k-v插入keyToVal.put(key, value);// k-访问频次插入keyToFreq.put(key, 1);// freqTokeys中,key对应的value存在,返回存在的key;不存在,添加key和value// 不存在则创建一个新的LinkedHashSet并插入freqTokeys.putIfAbsent(1, new LinkedHashSet<>());// 访问频次为1的集合中,有序插入当前keyfreqTokeys.get(1).add(key);// 系统最小访问频次一定是1this.minFreq = 1;}// 【逐出策略】// 删除出现频率最低且插入最早的keyprivate void removeMinFreqKey() {// 找到最小访问频次对应的 LinkedHashSet<K> 集合&列表LinkedHashSet<K> keyList = freqTokeys.get(minFreq);// 获取keyList中的第一个元素// iterator()方法返回一个在一系列元素上进行迭代的迭代器// next()方法获取迭代器当前位置的下一个元素K deleteKey = keyList.iterator().next();// 从 keyList 中删除链表第一个节点,如果keyList中只有一个元素,则将整个keyList删除keyList.remove(deleteKey);if (keyList.isEmpty()) {// 这里删除元素后不需要重新设置minFreq,因为put方法执行完会将minFreq设置为1freqTokeys.remove(keyList);}// k-v中逐出keyToVal.remove(deleteKey);// k-访问频次中逐出keyToFreq.remove(deleteKey);}// 增加频率private void increaseFrey(K key) {// 获取当前key的访问频次int freq = keyToFreq.get(key);// 当前key的访问频次+1keyToFreq.put(key, freq + 1);// 当前访问频次中维护的key集合中,删除当前keyfreqTokeys.get(freq).remove(key);// 当前访问频次+1中维护的key集合中,插入当前key(如果LinkedHashSet不存在,则先new一个)freqTokeys.putIfAbsent(freq + 1, new LinkedHashSet<>());freqTokeys.get(freq + 1).add(key);// 当前访问频次中维护的key集合为空,则remove掉该LinkedHashSetif (freqTokeys.get(freq).isEmpty()) {freqTokeys.remove(freq);// remove掉该LinkedHashSet,代表系统中最小的访问频次为 this.minFreq++if (freq == this.minFreq) {this.minFreq++;}}}
}

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

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

相关文章

LiveNVR监控流媒体Onvif/RTSP功能-视频广场点击在线或离线时展示状态记录快速查看通道离线原因

LiveNVR视频广场点击在线或离线时展示状态记录快速查看通道离线原因 1、状态记录1.1、点击在线查看1.2、点击离线查看 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、状态记录 1.1、点击在线查看 可以点击视频广场页面中&#xff0c; 在线 两个字查看状态记录 1.2、点击离线查…

CraxsRat7.4 安卓手机远程管理软件

CRAXSRAT 7.4 最新视频 https://v.douyin.com/iFjrw2aD/ 官方网站下载 http://craxsrat.cn/ 不要问我是谁&#xff0c;我是活雷锋。 http://craxsrat.cn/ CraxsRat CraxsRat7 CraxsRat7.1 CraxsRat7.2 CraxsRat7.3 CraxsRat7.4

SSL 证书,了解一下常识

公司的网站、应用怎么才能保证在互联网上安全运行&#xff0c;不被攻击、盗取数据呢&#xff1f; 创业必经之路&#xff0c;一步一步走就对了&#xff0c;可能没赶上红利期&#xff0c;但不做就等于0。 概述 SSL 证书&#xff08;SSL Certificates&#xff09;又称数字证书&am…

低密度奇偶校验码LDPC(九)——QC-LDPC译码器FPGA全并行设计

往期博文 低密度奇偶校验码LDPC&#xff08;一&#xff09;——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC&#xff08;二&#xff09;——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC&#xff08;三&#xff09;——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

HashSet在添加元素时,是如何判断元素重复的?

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

Hive安装教程-Hadoop集成Hive

文章目录 前言一、安装准备1. 安装条件2. 安装jdk3. 安装MySQL4. 安装Hadoop 二、安装Hive1. 下载并解压Hive2. 设置环境变量3. 修改配置文件3. 创建hive数据库4. 下载MySQL驱动5. 初始化hive数据库6. 进入Hive命令行界面7. 设置允许远程访问 总结 前言 本文将介绍安装和配置H…

Java高频面试之消息队列与分布式篇

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 消息队列的基本作用&#xff1f; 异步通信&#xff1a;消息队列提供了异步通信的能力&#xff0c;发送方可以将消息发送到队列中&#xff0c;而无需等待接收方立即处理。发送方和接收方可以解耦&#x…

继深圳后,重庆与鸿蒙展开原生应用开发合作

截至2023年底&#xff0c;开源鸿蒙开源社区已有250多家生态伙伴加入&#xff0c;开源鸿蒙项目捐赠人达35家&#xff0c;通过开源鸿蒙兼容性测评的伙伴达173个&#xff0c;累计落地230余款商用设备&#xff0c;涵盖金融、教育、智能家居、交通、数字政府、工业、医疗等各领域。 …

20240304-使用VS2022编译blender3.6.2源代码

20240304-使用VS2022编译blender3.6.2源代码 一、软件环境 Win10 x64 22h2 JuneVS2022 v17.9.0CMake v3.24.4SVN v1.14.3GIT v2.29.2标签&#xff1a;win10 22h2 vs2022 blender 63335分栏&#xff1a;C 二、硬件环境 Win10 x64的PC台式机 三、获取源码 方法一 网盘下载…

基于Springboot的高校宣讲会管理系统。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校宣讲会管理系统。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

【kubernetes】关于k8s集群中的ingress规则案例

目录 一、k8s 对外服务之 Ingress 1.1什么是ingress 1.2外部的应用能够访问集群内的服务有哪些方案&#xff1f; 1.3Ingress 组成 1.4Ingress-Nginx 工作原理 1.5ingress 暴露服务的方式 二、实操ingress暴露服务 前期.部署 nginx-ingress-controller 2.1基于host网络…

【Objective -- C】—— 自引用计数

【Objective -- C】—— 自引用计数 一. 内存管理/自引用计数1.自引用计数2.内存管理的思考方式自己生成的对象&#xff0c;自己持有非自己生成的对象&#xff0c;自己也能持有不再需要自己持有的对象时释放无法释放非自己持有的对象 3.alloc/retain/release/dealloc实现4. aut…

【NR 定位】3GPP NR Positioning 5G定位标准解读(九)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

无人机遥感在农林信息提取中的实现方法与GIS融合应用

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

“色狼”用英语怎么说?柯桥日常英语,成人英语口语学习

最近有粉丝问我"色狼"英文翻译是啥 首先声明不是"colour wolf"哈 关于“色狼”的英文表达有很多 快和C姐一起来看看吧&#xff01; 1.pervert 这个单词的意思是变态、色狼 是对性变态者最直观的描述 He is such a pervert&#xff01; I saw him lo…

C# 视频转图片

在 C# 中将视频转换为图像可以使用 FFmpeg 库。下面是一个示例代码来完成这个任务&#xff1a; using System; using System.Diagnostics;class Program {static void Main(string[] args){string inputFile "input_video.mp4"; // 输入的视频文件路径string outpu…

C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo

目录 介绍 效果 CPU GPU 模型信息 项目 代码 下载 C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo 介绍 模型出处github地址&#xff1a;https://github.com/SmilingWolf/SW-CV-ModelZoo 模型下载地址&#xff1a;https://huggingface.co/SmilingWolf/wd-v1-4-s…

计算机网络之传输层 + 应用层

.1 CIDR地址块中还有三个特殊的地址块 a. 前缀 n 32 , 即32位IP地址都是前缀, 没有主机号, 这其实就是一个IP地址, 用于主机路由 b. 前缀 n 31 , 这个地址块中有两个IP地址, 主机号分别为0/1 , 这个地址块用于点对点链路 c. 前缀 n 0 , 用于默认路由使用二叉线索树查找转发…

办公电脑换成MacBookPro半年之后……

小白是从2008年开始接触电脑的&#xff0c;当时朋友给我注册的第一个QQ账号是2008年4月。 从此&#xff0c;小白一直认为电脑全部都是Windows系统。直到上大学那年&#xff0c;看到了外教老师的MacBookPro…… 折腾电脑的开始居然是起源于诺基亚手机&#xff0c;给半智能S40的…

根据QQ号获取暗恋的人的全部歌单

文章目录 前言一、成果展示二、后端开发流程三、前后端障碍与难点解决四、待扩展内容五、总结 前言 本人喜欢使用QQ音乐听歌&#xff0c;并且喜欢点击好友栏目观看最近在听&#xff0c;了解暗恋的人最近在听什么歌曲&#xff0c;知己知彼&#xff0c;百战不殆。但是每次都需要…