目录

 昨日总结

今日计划

算法——两个数组的交集

算法——两数之和

缓存穿透

常见解决方案

缓存雪崩

常见解决方案

缓存击穿

常见解决方案

栈溢出

堆溢出

功能接口式参数&泛型函数

​编辑


 昨日总结

  • 缓存问题完结(缓存穿透、雪崩、击穿),了解堆、栈溢出,功能接口式参数&泛型函数,完成点评缓存部分
  • cv(停滞中)
  • 背诵小林coding--Java并发面试篇(1/3)
  • 代码随想录——两个数组的交集,两数之和

今日计划

  • 跟进点评项目
  • cv(停滞中)
  • 背诵小林coding--Java并发面试篇(1/3)
  • 代码随想录——四数相加,三数之和

算法——两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> set = new HashSet<>();for(int num : nums1) {set.add(num);}Set<Integer> T = new HashSet<>();for(int num : nums2) {if(set.contains(num))T.add(num);}//通过 stream() 方法将 List 转换为流,mapToInt 方法将 Integer 类型的流//转换为 int 类型的流, 最后使用 toArray 方法将流转换为 int 数组。int[] t = T.stream().mapToInt(Integer::intValue).toArray();return t;}
}

算法——两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<>();for(int i = 0; i< nums.length; i++) {int temp = target - nums[i];if(map.containsKey(temp))return new int[] {map.get(temp),i};map.put(nums[i],i);}return new int[0];}
}

缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
常见解决方案
  • 缓存空对象:当客户端访问redis未命中时,会访问数据库 ,若此时数据库也未命中,将会redis缓存一个null空对象
优点:实现简单,维护方便
缺点 :额外的内存消耗,可能造成 短期的不一致(针对此问题,1.可以为缓冲空数据设置一个TTL生存时间 2.可以每完成一次数据库的操作 ,便立即更新缓存 )
  • 布隆过滤
当客户端发出 请求 时 ,会首先经过布隆过滤器进行判断,是否 存在该数据 。若存在之后在经过redis或再经过数据库。
布隆过滤器原理 :用二进制位和哈希函数来存在 该数据是否存在
优点 :内存占用较小,没有多余key
缺点:实现 复杂 ,存在误判可能

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
常见解决方案
  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
常见解决方案
  • 互斥锁
优点:没有额外的内存消耗 ,保证 一致性,实现简单
缺点:县城 需要等待,性能受影响,可能会出现死锁风险
  • 逻辑过期
优点:线程无需等待 ,性能较好
缺点:不保证一致性,有额外的内存消耗,实现复杂。

栈溢出

在Java中,栈是线程私有的,主要用于存储局部变量和方法调用等。每个线程创建时都会分配一定大小的栈空间,当空间被分配完时,便会发出栈溢出。一般出现栈溢出的情况如下:
  • 陷入死循环的递归调用
如果递归方法没有正确的终止条件或者终止条件设置不合理,会导致方法不断地调用自身,栈帧不断入栈,最终耗尽栈空间。
  • 方法调用的层次过深
在一个嵌套很深的方法调用中,每个方法都会在栈上分配一定的空间,当调用层次过深时,栈空间就会被耗尽。
  • 局部变量占用的空间过大
如果在方法中定义了大量的局部变量,尤其是一些占用空间较大的数组或对象,会增加每个栈帧的大小,从而使栈空间更快地被耗尽。

堆溢出

在Java中,堆是线程共享的内存区域,主要存储对象的实例。当空间无法为新的对象分配内存时,就会发生堆溢出。一般出现堆溢出的情况如下:
  • 创建的大量对象没有及时回收
  • 内存泄漏
内存泄漏是指程序中某些对象不再使用,但由于存在引用关系,垃圾回收器无法回收这些对象,导致堆空间不断被占用。例如静态集合类中的对象不会被垃圾回收、某些资源的连接未关闭,造成资源泄漏
  • 分配的堆空间过小
如果Java虚拟机(JVM)的堆空间设置过小,无法满足程序运行时的内存需求。

功能接口式参数&泛型函数

函数传递功能参数通常指的是将行为(函数)作为参数传递给另一个方法。
在写工具类时,如果返回类型不确定,要 利用泛型来解决,让调用者去告诉具体的函数类型

例如:当在一个工具类中调用数据库函数时,需要通过函数自身传递的参数来传入,因此通过Lambda表达式传递功能

public <R, ID> R queryWithPassThrough(String keyPrefix, ID id , Class<R> type, Function<ID, R> dbFallback,Long time, TimeUnit unit) {String key = "cache:shop:" + id;//从redis查询商铺缓存String json = stringRedisTemplate.opsForValue().get(key);//判断缓存是否存在if (StrUtil.isNotBlank(json)) {//存在 直接返回return JSONUtil.toBean(json, type);}//判断命中的是否是空值if(json != null) {//返回一个错误信息return null;}//不存在,根据id查询数据库R r = dbFallback.apply(id);//数据库不存在返回错误if (r == null) {//将空值写入redisstringRedisTemplate.opsForValue().set(key,"",2L,TimeUnit.MINUTES);return null;}//数据库存在,写入redisthis.set(key,r,time,unit);//返回return r;
}

 this::getById 是一个实例方法引用,它等价于Lambda表达式:id -> this.getById(id);

public Result queryById(Long id) {Shop shop = cacheClient.queryWithPassThrough(CACHE_SHOP_KEY,id, Shop.class,this::getById,CACHE_SHOP_TTL,TimeUnit.MINUTES);return Result.ok(shop);
}

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

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

相关文章

基于python的微博评论和博文文本分析,包括LDA+聚类+词频分析+lstm热度预测,数据量10000条

思路步骤&#xff1a;本文实现了从文本评论数据中提取有用信息&#xff0c;分析其情感分布、主题分布&#xff0c;并通过可视化展示。以下是具体步骤和思路&#xff1a;1、数据准备与预处理加载数据&#xff1a;通过 pandas 读取文本和评论数据&#xff0c;并进行合并处理。文本…

【CNN】模型评估标准

1.分类模型评价指标在模型评估中&#xff0c;有多个标准用于衡量模型的性能&#xff0c;这些标准包括准确率&#xff08;Accuracy&#xff09;、精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1 分数&#xff08;F1-Score&#xff09;等。…

Python爬虫实战:诗词名句网《三国演义》全集

Beautiful Soup实战案例&#xff1a;爬取"诗词名句网" 目标 爬取"诗词名句网"上的古典文学作品内容&#xff0c;包括书籍目录和章节内容&#xff0c;并将每章内容独立保存为文本文件。 目标网址: 《三国演义》全集在线阅读_史书典籍_诗词名句网 要求 书…

AWS CAF:企业云转型的战略指南

在数字化转型的大潮中&#xff0c;企业正面临前所未有的变革压力。如何利用云计算驱动业务创新、提升IT敏捷性、优化成本结构&#xff0c;已成为众多企业迫切需要解决的关键课题。然而&#xff0c;云迁移并不是简单地将本地应用“复制”到云上&#xff0c;它是一项牵涉企业组织…

【Redis】Linux 配置Redis

一、Redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一款开源的、高性能的键值对&#xff08;Key-Value&#xff09;存储数据库&#xff0c;由 Salvatore Sanfilippo 于 2009 年开发&#xff0c;采用 ANSI C 语言编写。它以内存存储为核心&#xff0c;支持…

MongoDB数据库高并发商业实践优化·运行优化之不可使用root账户进行MongoDB运行-优雅草卓伊凡

MongoDB数据库高并发商业实践优化运行优化之不可使用root账户进行MongoDB运行-优雅草卓伊凡 引言 关于最近优雅草卓伊凡发布关于MongoDB的内容是由于我们的甲方上线了一个很老的产品&#xff0c;但是他的用户量极大&#xff0c;并且还有各种人搞事情&#xff0c;不断的来GJ&a…

戴尔电脑 Linux 安装与配置指南_导入mysql共享文件夹

本指南将详细介绍在戴尔电脑上安装 Linux 操作系统的步骤&#xff0c;以及后续的重要配置&#xff0c;包括系统选择、安装流程、MySQL 数据恢复、网络配置、文件共享和远程维护等。步骤清晰且配有命令行示例和配置文件示例&#xff0c;适合初中级用户参考。1、Linux 系统选择与…

昇思学习营-DeepSeek-R1-Distill-Qwen-1.5B 模型LoRA微调学习心得

LoRA微调&#xff1a;加入参数式微调冻结原始网络参数&#xff0c;对Attention层中QKV等添加旁支&#xff0c;包含两个低维度的矩阵A和矩阵B&#xff0c;微调过程中仅更新A、B 矩阵效果&#xff1a;训练参数被大幅降低&#xff0c;资源消耗较低。对attention的参数加入如下图所…

彩色转灰度的核心逻辑:三种经典方法及原理对比

灰度实验将彩色图像转换为灰度图像的过程称为灰度化&#xff0c;这种做法在图像处理和计算机视觉领域非常常见。灰度图与彩色图最大的不同就是&#xff1a;彩色图是由R、G、B三个通道组成&#xff0c;而灰度图只有一个通道&#xff0c;也称为单通道图像&#xff0c;所以彩色图转…

Spring Boot 项目启动自动执行逻辑的最佳实践:掌握 CommandLineRunner

前言 Spring Boot 启动阶段,总有些操作迫不及待冲在前线:配置要加载,数据要准备,日志要抢首发,仿佛个个争当“启动 MVP”。如果你也想让项目一启动就自动开工,少写点手动触发的“苦力逻辑”,那 CommandLineRunner 就是你的得力助手。它像那个永远第一个打卡的同事,不喝…

高可用集群KEEPALIVED的详细部署

一.高可用集群 1.1 集群类型 LB&#xff1a;Load Balance 负载均衡 LVS/HAProxy/nginx&#xff08;http/upstream, stream/upstream&#xff09; HA&#xff1a;High Availability 高可用集群 数据库、Redis SPoF: Single Point of Failure&#xff0c;解决单点故障 HPC&#x…

[论文阅读] 人工智能 + 软件工程 | NoCode-bench:评估LLM无代码功能添加能力的新基准

NoCode-bench&#xff1a;评估LLM无代码功能添加能力的新基准 论文&#xff1a;NoCode-bench: A Benchmark for Evaluating Natural Language-Driven Feature Addition 研究背景&#xff1a;当AI尝试给软件"加新功能"&#xff0c;我们需要一张靠谱的"考卷"…

【Git知识】Git 常用知识集合之基础--分支系统与 Tag 标签机制

&#x1f9f0; Git 常用知识集合Git 是程序员的“时间机器”。这份手册帮你从入门到精通&#xff0c;把 Git 玩明白。1️⃣ Git 基础操作流程 &#x1f4cc; 三步走流程&#xff1a;添加 → 提交 → 推送 git add . # 把所有修改加入暂存区 git commit -m …

深入解析 Spark:关键问题与答案汇总

在大数据处理领域&#xff0c;Spark 凭借其高效的计算能力和丰富的功能&#xff0c;成为了众多开发者和企业的首选框架。然而&#xff0c;在使用 Spark 的过程中&#xff0c;我们会遇到各种各样的问题&#xff0c;从性能优化到算子使用等。本文将围绕 Spark 的一些核心问题进行…

Python-初学openCV——对openCV的简单使用

一、概述1、简单介绍OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;旨在为实时图像处理提供强大的功能。它由Intel开发&#xff0c;现由开源社区维护。OpenCV 提供了跨平台的解决方案&#xff0c;支持 Windows、Linu…

去中心化时代的通信革命:briefing与cpolar技术融合带来的安全范式革新

文章目录前言1.关于briefing2.本地部署briefing3.使用briefing4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定briefing公网地址前言 数字协作本该是提升效率的过程&#xff0c;却被这些数据管理问题不断困扰&#xff1a;平台条款中的监控声明、跨网络环境的接入障碍、…

GitHub新手生存指南:AI项目版本控制与协作实战

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 代码仓库创建 分支管理 PR提交 开源项目复现 读者收获&#xff1a;掌握团队开发必备技能…

Axios封装以及添加拦截器

在前端开发中&#xff0c;http请求层的封装可以极大提升代码的复用性和可维护性&#xff0c;本文将完整的用axios封装接口请求&#xff0c;配置请求与响应拦截器&#xff0c;封装统一的请求方法全过程。封装的目的和思路在项目直接用axios发送请求当然没问题&#xff0c;但是如…

C语言中奇技淫巧04-仅对指定函数启用编译优化

相信很多人使用GCC编译代码时&#xff0c;都会接触到gcc -O0/1/2/3/s&#xff0c;知道它可以对工程进行全局优化。 事实上&#xff0c;除了全局优化外&#xff0c;使用GCC扩展方式&#xff0c;我们还可以仅对部分关键函数实施差异化编译优化。 在GCC编译器中&#xff0c;attrib…

HTML Style 对象深度解析:从基础到高级应用

一、Style 对象的核心概念定义与作用 Style 对象是 HTML DOM 中用于操作元素内联样式的接口&#xff0c;通过 element.style 访问。它允许动态修改元素的 CSS 属性&#xff0c;但仅能直接影响内联样式&#xff08;即通过 style 属性直接写在标签中的样式&#xff09;。与外部样…