Redis缓存之预热、击穿、穿透、雪崩
面试切入点
缓存预热
什么是预热?
mysql假如新增100条记录,一般默认以mysql为准作为底单数据,如何同步到redis(布隆过滤器),这100条合法数据??
为什么需要预热?
mysql有100条新记录,redis无
1.比较懒,什么都不做,只对mysql做了数据新增,利用redis的回写机制,让他逐步实现100条新增记录的同步。最好提前比如晚上部署发布版本的时候,由自己人提前做一次,让redis同步了,不要把这个问题留给客户。
2.通过中间件或者程序自行完成@PostConstruct。
缓存雪崩
发生
- redis主机挂了,Redis全盘崩溃,偏硬件运维
- redis中有大量key同时过期,大面积失效,偏软件开发
预防+解决
-
redis中key设置为永不过期或者过期时间错开
-
redis缓存集群实现高可用(主从+哨兵、Redis Cluster、开启Redis持久化机制aof或者rdb,尽快恢复缓存数据)
-
多缓存结合预防雪崩(ehcache本地缓存+redis缓存)
-
服务降级(Hystrix或者阿里sentinel限流或降级)
-
人民币玩家 (阿里云-云数据库Redis版)
缓存穿透
是什么?
请求去查询一条记录,先看redis无,后查mysql无,都查询不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库的压力暴增,这种现象我们称为缓存穿透,这个redis变成了摆设。
简单来说,本来无一物,两库都没有。既不在Redis缓存库,也不在mysql,数据库存在被多次暴击风险。
解决
方案1:空对象缓存或者缺省值
-
一般情况OK
-
黑客攻击
黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。
key相同打你系统
第一次打到mysql,空对象缓存后第二次就返回defaultNull缺省值,避免mysql被攻击,不用再到数据库中去走一圈了
key不同打你系统
由于存在空对象缓存和缓存回写(看自己业务不限死),redis中的无关紧要的key也会越写越多(记得设置redis过期时间)
方案2:Google布隆过滤器Guava解决缓存穿透
Guava 中布隆过滤器的实现算是比较权威的,所以实际项目中我们可以直接使用Guava布隆过滤器
案例:白名单过滤器
架构
误判问题,但是概率小可以接受,不能从布隆过滤器删除 。全部合法的key都需要放入Guava版布隆过滤器+redis里面,不然数据返回就是null
引入pom
<!--guava Google 开源的 Guava 中自带的布隆过滤器--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>
入门使用
/*** 测试布隆过滤器 demo*/@Testpublic void testGuavaBloomFilter(){//1.创建guava版本的布隆过滤器BloomFilter<Integer> integerBloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);//2.判断指定的元素是否存在System.out.println(integerBloomFilter.mightContain(1));System.out.println(integerBloomFilter.mightContain(2));System.out.println();//3.往过滤器加入元素integerBloomFilter.put(1);integerBloomFilter.put(2);System.out.println(integerBloomFilter.mightContain(1));System.out.println(integerBloomFilter.mightContain(2));}
运行效果
取样本数据100W,查查不在这个样本范围内的10W数据是否存在??
Controller层
import com.atguigu.redis7.service.GuavaBloomFilterService;
import com.atguigu.redis7.service.GuavaFilterService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@Api(tags = "google工具Guava处理布隆过滤器")
@RestController
@Slf4j
public class GuavaBloomFilterController
{@Resourceprivate GuavaFilterService guavaBloomFilterService;@ApiOperation("guava布隆过滤器插入100万样本数据并额外10W测试是否存在")@RequestMapping(value = "/guavafilter",method = RequestMethod.GET)public void guavaBloomFilter(){guavaBloomFilterService.guavaBloomFilter();}
}
service层
package com.atguigu.redis7.service;import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import java.util.ArrayList;@Service
@Slf4j
public class GuavaFilterService
{//1 定义一个常量public static final int _1W = 10000;//2 定义我们guava布隆过滤器,初始容量public static final int SIZE = 100 * _1W;//3 误判率,它越小误判的个数也就越少(思考,是否可以是无限小??没有误判岂不是更好)public static double fpp = 0.03;//0.01 0.000000000000001//4 创建guava布隆过滤器private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE,fpp);public void guavaBloomFilter(){//加入100W白名单的数据for (int i = 1; i <=SIZE ; i++) {bloomFilter.put(i);}//取10W个不在合法范围内的数据进行布隆过滤器的误判验证ArrayList<Integer> list = new ArrayList<>(10 * _1W);//验证for (int i = SIZE+1; i <=SIZE+10*_1W ; i++) {if(bloomFilter.mightContain(i)){log.info("被误判了:{}",i);list.add(i);}}log.info("误判总数量:{}",list.size());}
}
实际效果
误判结果:3033
误判率的大小与坑位以及hash函数的关系:
0.03的误判率,hash函数是5,但是0.01时变成7,同时坑位数目变多。
默认误判率为0.03
布隆过滤器说明
实现黑名单机制
缓存击穿
是什么?
大量的请求同时查询一个key时,此时的这个key正好失效了,就会导致大量的请求都打到数据库上面去了。
简单说就是热点key突然失效了,暴打Mysql
备注:穿透和击穿,截然不同
危害
- 会造成某一时刻数据库的请求量过大,压力剧增
- 一般技术部门**需要知道热点key是那些个?**做到心里有数防止击穿
解决
热点key失效 - 时间到了自然清除但还被访问到
- delete掉的key,刚巧又被访问
解决方案 - 方案1:差异失效时间,对于访问频繁的热点key,干脆就不设置过期时间
- 方案2:互斥更新,采用双重校验加锁的策略
案例:天猫聚划算功能实现+防止缓存击穿
问题:热点key突然失效了,导致缓存击穿
技术方案实现:
分析过程:
redis数据类型选型
业务类
package com.atguigu.redis7.entities;import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "聚划算活动producet信息")
public class Product
{//产品IDprivate Long id;//产品名称private String name;//产品价格private Integer price;//产品详情private String detail;
}
controller层
package com.atguigu.redis7.controller;import com.atguigu.redis7.entities.Product;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@Slf4j
@Api(tags = "聚划算商品列表接口")
public class JHSProductController
{public static final String JHS_KEY="jhs";public static final String JHS_KEY_A="jhs:a";public static final String JHS_KEY_B="jhs:b";@Autowiredprivate RedisTemplate redisTemplate;/*** 分页查询:在高并发的情况下,只能走redis查询,走db的话必定会把db打垮* @param page* @param size* @return*/@RequestMapping(value = "/pruduct/find",method = RequestMethod.GET)@ApiOperation("聚划算案例,每次1页每页5条显示")public List<Product> find(int page, int size) {List<Product> list=null;long start = (page - 1) * size;long end = start + size - 1;try{// 采用redis list结构里面的lrang命令来实现加载和分页查询list = redisTemplate.opsForList().range(JHS_KEY,start,end);if(CollectionUtils.isEmpty(list)){//TODO 走mysql查询}log.info("参加活动的商家:{}",list);}catch (Exception e){// 出异常了,一般redis宕机了或者redis网络抖动导致timeoutlog.error("jhs exception:{}",e);e.printStackTrace();// ....再次查询mysql}return list;}@RequestMapping(value = "/pruduct/findab",method = RequestMethod.GET)@ApiOperation("AB双缓存架构,防止热点key突然失效")public List<Product> findAB(int page, int size) {List<Product> list=null;long start = (page - 1) * size;long end = start + size - 1;try{list = redisTemplate.opsForList().range(JHS_KEY_A,start,end);if(CollectionUtils.isEmpty(list)){log.info("---A缓存已经过期失效或活动结束了,记得人工修改,B缓存继续顶着");list = redisTemplate.opsForList().range(JHS_KEY_B,start,end);if(CollectionUtils.isEmpty(list)){//TODO 走mysql查询}}}catch (Exception e){// 出异常了,一般redis宕机了或者redis网络抖动导致timeoutlog.error("jhs exception:{}",e);e.printStackTrace();// ....再次查询mysql}return list;}}
采用定时器将参与聚划算的特价商品写入redis中
@Service
@Slf4j
public class JHSTaskService
{public static final String JHS_KEY="jhs";public static final String JHS_KEY_A="jhs:a";public static final String JHS_KEY_B="jhs:b";@Autowiredprivate RedisTemplate redisTemplate;/*** 偷个懒不加mybatis了,模拟从数据库读取20件特价商品,用于加载到聚划算的页面中* @return*/private List<Product> getProductsFromMysql() {List<Product> list=new ArrayList<>();for (int i = 1; i <=20; i++) {Random rand = new Random();int id= rand.nextInt(10000);Product obj=new Product((long) id,"product"+i,i,"detail");list.add(obj);}return list;}@PostConstructpublic void initJHS(){log.info("启动定时器天猫聚划算功能模拟开始......,O(∩_∩)O哈哈~");//1 用线程模拟定时任务,后台任务定时将mysql里面的参加活动的商品刷新到redis里new Thread(() -> {while (true){//2 模拟从mysql查出数据,用于加载到redis并给聚划算页面显示List<Product> list = this.getProductsFromMysql();//3 采用redis list数据结构的lpush命令来实现存储redisTemplate.delete(JHS_KEY);//4 加入最新的数据给redis参加活动redisTemplate.opsForList().leftPushAll(JHS_KEY,list);//5 暂停1分钟线程,间隔一分钟执行一次,模拟聚划算一天执行的参加活动的品牌try { TimeUnit.MINUTES.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }}},"t1").start();}
}
目前的效果
redis中的数据
请求接口
响应数据
基本功能完成,请思考一下在高并发的情境下有什么经典问题??
Bug和隐患说明
- 热点key突然失效导致可怕的缓存击穿
delete命令执行的一瞬间有空隙,其他请求线程继续找Redis为null,打到了mysql,暴击。
最终目的:2条命令的原子性还是其次,主要是防止热key突然失效暴击mysql,打爆系统
互斥更新与双重校验登场
差异失效时间登场
代码实现
两块缓存,先更新缓存B,再更新缓存A
@PostConstructpublic void initJHSAB(){log.info("启动AB定时器计划任务天猫聚划算功能模拟.........."+DateUtil.now());//1 用线程模拟定时任务,后台任务定时将mysql里面的参加活动的商品刷新到redis里new Thread(() -> {while (true){//2 模拟从mysql查出数据,用于加载到redis并给聚划算页面显示List<Product> list = this.getProductsFromMysql();//3 先更新B缓存且让B缓存过期时间超过A缓存,如果A突然失效了还有B兜底,防止击穿redisTemplate.delete(JHS_KEY_B);redisTemplate.opsForList().leftPushAll(JHS_KEY_B,list);redisTemplate.expire(JHS_KEY_B,86410L,TimeUnit.SECONDS);//4 再更新A缓存redisTemplate.delete(JHS_KEY_A);redisTemplate.opsForList().leftPushAll(JHS_KEY_A,list);redisTemplate.expire(JHS_KEY_A,86400L,TimeUnit.SECONDS);//5 暂停1分钟线程,间隔一分钟执行一次,模拟聚划算一天执行的参加活动的品牌try { TimeUnit.MINUTES.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }}},"t1").start();}
查询逻辑:先查询A,再查询B,缓存都没有,才去查询数据库
@RequestMapping(value = "/pruduct/findab",method = RequestMethod.GET)@ApiOperation("AB双缓存架构,防止热点key突然失效")public List<Product> findAB(int page, int size) {List<Product> list=null;long start = (page - 1) * size;long end = start + size - 1;try{list = redisTemplate.opsForList().range(JHS_KEY_A,start,end);if(CollectionUtils.isEmpty(list)){log.info("---A缓存已经过期失效或活动结束了,记得人工修改,B缓存继续顶着");list = redisTemplate.opsForList().range(JHS_KEY_B,start,end);if(CollectionUtils.isEmpty(list)){//TODO 走mysql查询}}}catch (Exception e){// 出异常了,一般redis宕机了或者redis网络抖动导致timeoutlog.error("jhs exception:{}",e);e.printStackTrace();// ....再次查询mysql}return list;}
实现效果
接口调用
A失效了
B兜底
总结
视频链接
Redis缓存之预热、击穿、穿透、雪崩
相关文章:
Redis缓存之预热、击穿、穿透、雪崩
面试切入点 缓存预热 什么是预热? mysql假如新增100条记录,一般默认以mysql为准作为底单数据,如何同步到redis(布隆过滤器),这100条合法数据?? 为什么需要预热? mysql有100条新记录࿰…...
C++字符串复习
C字符串复习 前言 为了保证复习高效,以下不包括很简单的内容,例如cin。 C类型字符、字符串 输入方法 **char c getchar()**输入单个字符 string类型字符串 输入方法 getline(cin, str) 整行输入 常用方法 s.substr(pos, len):截取字…...
centos7安装mysql5.7.44
一、下载 下载地址:https://downloads.mysql.com/archives/community/ 二、安装 1、解压 tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 2、创建mysql用户组和用户 # 创建mysql用户组 groupadd mysql# 创建用户并添加到mysql用户组中 useradd -r -g m…...
内存分配中的堆(Memory Heap)详解
在计算机科学中,"堆"这个术语确实容易让人混淆,因为它同时用于描述两种完全不同的概念:数据结构中的堆和内存管理中的堆。上次我们讨论了数据结构中的堆,今天我将详细解释内存分配中的堆(Memory Heap&#x…...
【大模型理论篇】关于生成式模型中联合分布概率学习必要性以及GPT是生成式模型的讨论
1. 背景 之前我们在《生成式模型与判别式模型对比(涉及VAE、CRF的数学原理详述)》以及《生成式模型算法原理深入浅出(涉及Stable Diffusion、生成对抗网络、高斯混合模型、隐马尔可夫模型、朴素贝叶斯等算法原理分析及生成式模型解释)》中,我…...
LeetCode738☞单调递增的数字
关联LeetCode题号738 本题特点 贪心,贪心在如果非单调递增,则想要保证数字整体最大,那低数位一定为9(所有数字中最大的) 本题思路 从后向前遍历,如果递增则 什么都不做如果非递增,增非递增位…...
本节课课堂总结
课堂总结: Spark运行架构: 运行架构: Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。 如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master&…...
MyBatis中特殊符号处理总结
前言 MyBatis 是一款流行的Java持久层框架,广泛应用于各种类型的项目中。因为我们在日常代码 MyBatis 动态拼接语句时,会经常使用到 大于(>,>)、小于(<,<)、不等于(<>、!)操作符号。由于此符号包含了尖括号,而 MyBatis 使用…...
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例) 一、DVWA靶场简介 DVWA(Damn Vulnerable Web Application)是专为网络安全学习者设计的漏洞演练平台,包含SQL注入、XSS、文件包含等10大Web漏洞模块&…...
若依前后端分离版本从mysql切换到postgresql数据库
一、修改依赖: 修改admin模块pom.xml中的依赖,屏蔽或删除mysql依赖,增加postgresql依赖。 <!-- Mysql驱动包 --> <!--<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> &l…...
【补题】Codeforces Round 974 (Div. 3) E. Rendez-vous de Marian et Robin
题意:给个图,两个人分别从点1和点n出发,问最早在哪个点可以相遇,其中某些点有马,骑上去之后可以在接下来剩余的时间内都可以将路程所需时间缩短一半。 关于题目数据见原题,这里说明太累了想偷懒Problem - 2…...
MySQL集群技术
当有数据时添加slave2 #从master节点备份数据 mysqldump -uroot -ptiminglee 1 > timinglee.sql 生产环境中备份时需要锁表,保证备份前后的数据一致 mysql> FLUSH TABLES WITH READ LOCK; 备份后再解锁 mysql> UNLOCK TABLES; mysqldump命令备份的数…...
Java 中的字节码
🔍 什么是 Java 字节码(Bytecode)? 字节码是 Java 源码(.java 文件)被编译后生成的中间代码(.class 文件),它不是机器码,而是一种 面向 JVM 的指令集。 可以…...
json 转 txt 用于 yolo 训练(可适用多边形标注框_python)
json 转 txt 用于 yolo 训练(可适用多边形标注框_python) import json import os import argparse from tqdm import tqdmdef convert_label_json(json_dir, save_dir, classes):json_paths os.listdir(json_dir)classes classes.split(,)for json_pa…...
SQL注入(SQL Injection)
目录 SQL注入(SQL Injection)是什么SQL注入的危害SQL注入的常见方式1. 经典注入(Error-Based Injection)2. 联合查询注入(Union-Based Injection)3. 时间盲注(Time-Based Blind Injection)4. 布尔盲注(Boolean-Based Blind Injection)5. 堆叠注入(Stacked Queries I…...
智慧厨房的秘密:当大模型遇见智能体
智慧厨房的秘密:当大模型遇见智能体 想象一下,一家餐厅里,顾客点了一份特别定制的菜肴。厨师不仅需要知道如何制作这道菜,还得根据当天的食材情况灵活调整配方,甚至考虑到顾客的口味偏好做出微调。这一切背后…...
IDEA遇到问题汇总
问题1:【异常】IDEA中报错:无效的目标发行版本 IDEA 报错:无效的源发行版-CSDN博客 【异常】IDEA中报错:无效的目标发行版本-CSDN博客 原因是:版本不兼容不一致,需要修改jdk、maven、以及目标字节码使之相一…...
状态管理组件Pinia 简介与底层原理 、Pinia 与其他状态管理库对比、Vue3 + Element Plus + Pinia 安装配置详解
一、Pinia 简介与底层原理 1. Pinia 简介 Pinia 是 Vue3 官方推荐的状态管理库,由 Vue 核心团队开发,旨在替代 Vue2 的 Vuex。其核心目标是提供一种更简洁、直观的状态管理方案,同时充分利用 Vue3 的响应式系统和 Composition API。 2. 底…...
本地部署 opik
本地部署 opik 1. 安装2. 访问 1. 安装 克隆代码, git clone https://github.com/comet-ml/opik.git使用 Docker compose 启动, cd opik/deployment/docker-compose docker compose up -d2. 访问 启动后,您可以在浏览器中访问 localhost:…...
操作系统之进程与线程的理解(一)
对进程的理解 进程是可以并发执行的程序在某个数据集合上的运行过程,是系统进行资源分配和调度的基本单位。进程由三部分组成,程序,数据和进程控制块(简称PCB)。简单的说,进程就是程序的一次执行 为确保进…...
JS 箭头函数
只能用于声明函数表达式更简洁。替代匿名函数 设置取消点击事件的默认行为 在这里插入图片描述...
Mb,Kb,byte,bits
1MB1024KB; 1KB1024byte(字节); 1byte8bits(位); 小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都是 32 位 二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间…...
x265 中 aqMode 和 hevcAq 的深度解析与应用技巧
aqMode 和 hevcAq 介绍 在 x265 中基本继承了 x264 中 aqmode 的思想,此外还引入了 hevcAq 算法工具,在 x265_param 结构体中有这两个参数变量开关相关解释。从声明注释可以理解,aqMode 和 x264 中 aqmode 的思想完全相似,也扩展了些功能,属于通用型自适应量化方法,基于 …...
(一)基于云平台微调大模型,以deepseek-coder-6.7b为例
一、租借rtx4090卡并创建示例 如下图,我们进入jupyter界面,然后创建笔记本 二、提前下载好模型到本地 为了节省时间,我们需要提前下好模型deepseek-ai/deepseek-coder-6.7b-instruct,然后再上传到autodl上直接本地加载。 下载方…...
【Docker基础】全面解析 Docker 镜像:构建、使用与管理
文章目录 一、Docker 镜像(Docker Image)详解1.1 Docker 镜像的结构1.2 Docker 镜像的每一层(Layer)1.3 镜像的构建过程1.4 镜像的使用1.5 镜像的优势 二、为什么需要镜像三、镜像命令3.1 命令清单3.2 详细解释 四、docker 操作案…...
3. git config
文章目录 基本概述配置级别基本用法设置配置项查看配置项删除配置项 常用配置项 基本概述 git config 的作用是:设置用户信息、编辑器、别名、仓库行为等。 配置级别 级别作用范围配置文件路径命令选项仓库级别(Local)当前仓库.git/config…...
docker 运行自定义化的服务-前端
运行自定义化的前端服务 具体如下: ①打包前端项目,形成dist包 ②编写dockerfile文件,文件内容如下: # 基础镜像(镜像名:版本号TAG) FROM nginx:1.0 # 镜像作者和相关元数据 LABEL maintainer"Atb" \version"1.0…...
error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408
在git push时报错:error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408 原因:可能是推送的文件太大,要么是缓存不够,要么是网络不行。 解决方法: 将本地 http.postBuffer 数值调整到500MB&…...
JMH 基准测试实战:Java 性能对比的正确打开方式!
📖 摘要 在Java开发中,我们经常需要比较不同实现方式的性能差异。但如何科学、准确地进行性能测试呢?本文将带你深入理解JMH(Java Microbenchmark Harness)工具,通过实战演示如何正确编写和运行基准测试&a…...
etf可以T+0交易吗?
在我国的A股市场中,部分ETF基金支持T0交易,这为投资者提供了更灵活的交易策略。 支持T0交易的ETF基金类型包括: 货币型ETF:主要投资于货币市场工具,如短期债券和银行存款,具有较高的流动性。 债券型ETF&…...
解决问题:Vscode 自动更新不匹配远程服务器版本
避免自动更新: 1. 打开:文件 - 首选项 - 设置 - 应用程序 - 更新; 2. 设置下列选项: 如果已自动更新,如何回退至原有的历史版本 : 去官网下载所需的历史版本,然后直接按流程安装,…...
【Leetcode-Hot100】盛最多水的容器
题目 解答 目的是求面积最大,面积是由两个下标和对应的最小值得到,因此唯一的问题就是如何遍历这两个下标。我采用begin和end两个变量,确保begin是小于end的,使用它们二者求面积,代码如下: 很不幸 出错了…...
FFMEPG常见命令查询
基本参数 表格1:主要参数 参数说明-i设定输入流-f设定输出格式(format) 高于后缀名-ss开始时间-t时间长度codec编解码 表格2:音频参数 参数说明-aframes设置要输出的音频帧数-f音频帧深度-b:a音频码率-ar设定采样率-ac设定声音的Channel数-acodec设定…...
欢迎来到 Codigger Store:Boby周边专区
亲爱的 Codigger 用户们,感谢你们一直以来的支持与热爱!你们的每一次代码跳跃、每一次项目成功,都离不开你们对编程的热情和对 Codigger 的信任。为了回馈大家的厚爱,我们在 Codigger Store 中特别开设了 Boby 周边专区࿰…...
决策树模型
决策树(TDS) 注意1:决策树有很多种算法,比如:ID3算法,C4.5算法,CART算法,这三个算法的区别是选择最优划分属性的方法不同,第一个是根据信息增益来选;第二个是找出信息增益高于平均水…...
解锁深度学习激活函数
在深度学习的广袤天地里,激活函数宛如隐匿于神经网络架构中的神奇密码,掌控着模型学习与表达的关键力量。今天,就让我们一同深入探究这些激活函数的奇妙世界,揭开它们神秘的面纱。 一、激活函数为何不可或缺? 想象一…...
Kubernetes 深入浅出系列 | 容器剖析之容器安全
目录 1、容器真的需要privileged权限吗?一、什么是 --privileged 权限?二、privileged 的风险到底有多大?三、常见需求场景及更安全的替代方式四、如何判断容器是否真正需要特权? 2、不以 Root 用户运行容器,真的更安全吗&#x…...
Spring Boot应用中可能出现的Full GC问题
Full GC的原理与触发条件 原理 标记-清除:首先遍历所有对象,标记可达的对象,然后清除不可达的对象。复制算法:将内存分为两部分,每次只使用其中一部分。当这部分内存用完时,将存活的对象复制到另一部分&a…...
Maven 的安装与配置(IDEA)
2025/4/9 向 一、什么是Maven Maven 是一个基于项目对象模型(Project Object Model,POM)概念的项目构建工具(所以就是一个工具),它主要用于自动化项目的构建过程,包括编译、测试、打包、部署等…...
软考中级-软件设计师 2022年下半年上午题真题解析:通关秘籍+避坑指南
📚 目录(快速跳转) 选择题(上午题)(每题1分,共75分)一、 计算机系统基础知识 🖥️💻 题目1:计算机硬件基础知识 - RISC(精简指令集计算…...
全栈开发套件Telerik DevCraft——赋能现代化应用构建
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Kendo…...
Windows + vmware + ubuntu+docker + docker-android实现Android模拟器构建和启动
文章目录 引言编译启动过程玩下adb最后 引言 Windows vmware ubuntudockerdocker-android实现Android模拟器启动 编译启动过程 #下载docker-android git clone https://github.com/budtmo/docker-android.gitmaqiubuntu:~/docker-android$ git remote -v origin https://…...
远程团队协作效率低,如何优化
在远程工作的环境中,团队协作效率低下成为许多企业面临的一大挑战。随着全球化和技术进步,远程团队的出现成为企业的常态,但由于沟通不畅、任务管理不明确、缺乏团队凝聚力等问题,往往会影响团队的整体效率。为了优化远程团队的协…...
Oracle 19C 通过 ODBC 连接 SQL Server 数据库指南 (Red Hat 7)
前言 本指南详细说明如何在 Red Hat Enterprise Linux 7 系统上配置 Oracle 19C 通过 ODBC 连接 SQL Server 数据库。这种异构数据库连接方式称为 Oracle Heterogeneous Services,允许 Oracle 数据库直接访问非 Oracle 数据源。 系统要求 操作系统:Red Hat Enterprise Linu…...
【MYSQL从入门到精通】数据类型及建表
一些基础操作语句 1.使用客户端工具连接数据库服务器:mysql -uroot -p 2.查看所有数据库:show databases; 3.创建属于自己的数据库: create database 数据库名;create database if not exists 数据库名; 强烈建议大家在建立数据库时指定编…...
鸿蒙开发中的并发与多线程
文章目录 前言异步并发 (Promise和async/await)多线程并发并发能力选择耗时任务并发执行场景常见业务场景 常驻任务并发执行场景常见业务场景 传统共享内存并发业务长时任务并发执行场景常见业务场景 并发任务管理线程间通信同语言线程间通信(ArkTS内)线…...
ruby self
在 Ruby 中,self 是一个指向当前对象的特殊变量,它的值根据代码的上下文动态变化。理解 self 的指向是掌握 Ruby 面向对象编程的关键。以下是详细解析: 一、self 的核心规则 self 始终指向当前方法的执行者(即调用方法的对象&…...
Kotlin 学习-集合
/*** kotlin 集合* List:是一个有序列表,可通过索引(下标)访问元素。元素可以在list中出现多次、元素可重复* Set:是元素唯一的集合。一般来说 set中的元素顺序并不重要、无序集合* Map:(字典)是一组键值对。键是唯一的…...
封装方法的辨析
equals //字符串 str1.equals(str2); //list的两个实现类 list1.equals(list2); //map的两个实现类 //比较所有的键值对是否相同 map1.equals(map2); //数组(包括string类型) //比较内容是否相同 Arrays.equals(array1, array2); contains 基本都有…...
解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明
以下是解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明: 1. 切换项目视图模式 默认情况下,IDEA 的项目视图可能处于 Packages 模式,仅显示代码包结构,而非物理目录。 操作步骤: 点击…...