- 博客(81)
- 收藏
- 关注
原创 缓存击穿解决方案
等对应热点缓存的活动结束后,这些数据访问量就比较低了,可以通过后台任务的方案对指定缓存设置过期时间,这样可以有效降低 Redis 存储压力。通过这种方式我们可以快速失败,告诉用户网络异常请稍后再试,等用户再尝试刷新的时候,其实获取锁的线程已经把数据放到了缓存。一般来说,我们会通过预热和缓存永不过期的机制让缓存不击穿,这样即使再大的流量也可以通过缓存去抗。3.写入缓存:获取到数据后,将数据写入缓存,并设置一个合适的过期时间,以防止缓存永远不会被更新;永不过期:热点数据永不过期,指的就是可以预知的热点数据,
2025-07-09 11:02:22
408
原创 缓存穿透解决方案
缓存穿透指的是攻击者(故意)访问一个缓存中不存在,并且数据库中也不存在的数据,这样会使大量请求走到数据库中,造成数据库崩掉。而缓存击穿是指访问一个缓存中不存在(或者已经过期),而数据库中存在的数据。缓存穿透常见解决方案1. 空对象缓存**当查询结果为空时,也将结果进行缓存**,但是设置一个较短的过期时间。这样在接下来的一段时间内,如果再次请求相同的数据,就可以直接从缓存中获取,而不是再次访问数据库,可以一定程度上解决缓存穿透问题。这种方式是比较简单的一种实现方案,会存在一些弊端。
2025-07-09 11:01:32
416
原创 注解+AOP+自动配置实现自定义starter
新建一个framwork模块,作为项目的公共组件模块含有三部分项目层级如下自定义注解 CurrentTime/*** 在方法执行完之后打印当前时间*/定义aop方法(切面方法)目的是在使用了CurrentTime注解的方法中执行切面任务这个方法的作用是在需要加强的方法执行完毕后打印当前时间@Aspect/*** 返回自定义获取当前时间注解*/定义自动装配类,用于springboot自动配置/*** 日志组件相关配置类*/@Bean。
2025-06-25 13:04:47
337
原创 mysql8以上版本第一次下载后的登录问题
如果出现问题,参考https://blog.csdn.net/weixin_63107823/article/details/136588474。在mysql文件夹的bin目录中找到后缀为.err的文件,打开后ctrl+f寻找。注意ini配置文件,如果你是复制的别人的代码,记得把注释以外的中文删掉。这个时候会提示输入密码,对于我这个版本来说,是会有一个默认密码的。注意密码不能设置的太简单,否则可能会失败。输入密码后,出现版本号信息则为登陆成功。在官网下载mysql后,按照。在上方设置你的新密码就可以了。
2024-10-22 18:02:26
231
原创 regPractice-正则表达式练习
使用了三个正向前瞻断言,目的是保证在字符串至少要分别存在一个数字、一个小写字母、一个大写字母,**[a-zA-Z\d]{8,10}**保证了不能使用特殊字符,并且字符串长度在8-10位之间。使用两个正向前瞻断言,保证数字和字母都存在,然后保证只能存在数字、字母以及下划线,并保证长度在10-12位。密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符。必须包含数字、字母,可以允许有或者没有下划线,长度为10-12。微信号正则,6至20位,以字母开头,字母,数字,减号,下划线。
2024-09-24 10:48:11
831
原创 使用ssh-remote连接远程vscode运行yolo项目时的一点坑
这是一个要注意的地方,原因大概是没有通过pip install的方式下载,而是直接下载的文件代码,那么这个时候就不能全局使用YOLO库了。在使用vscode远程开发项目时(远程服务器系统是linux),终端位置需要调整到当前项目的目录,否则又会出问题。来下载依赖的,那么这个时候需要使用YOLO时都需要在下载的release文件的目录下的py文件才能生效。那么,只有在这个文件夹里的python文件才能使用YOLO提供的方法。比方说我下载的yolov8(ultralytics)的文件夹位置是。
2024-07-30 16:18:27
596
1
原创 minist数据集分类模型的训练
这里要注意的一点是,因为训练模型时使用了nvida的cuda驱动,那么在使用模型的时候,也需要将图片进行一点修改,具体是。上面已经将最后一次训练的的模型保存了,那么现在就可以用一个图片来测试一下这个模型。训练方法:利用pytorch来实现minist数据集的分类模型训练。实测训练大概10轮后,正确率能达到98%以上。说明准确率都还挺高的,这么模型训练的还可以。b站上有一个pytorch很好的入门视频。好了,这就是minist数据集训练了。讲的很不错的,学完就能入门了。现在开始编写代码训练模型。
2024-07-07 14:08:52
667
原创 opencv实战小结-银行卡号识别
好,现在有一个要注意的点,那就是我们在上面得到的contours数组并不是按图片中各个数字从左到右排列的,也就是说数组中第一个坐标可能是图片中8的坐标,那这个时候我们就必须对数组进行排序,排序顺序就是从左到右存。接下来就是将要检测的图像中的数字提取出来,其实整个提取思路都是一样的,但是银行卡的图像比我们的模板往往更加复杂,所以我们要对图片增加一些处理的步骤。,整个图片仍然没有任何变化)好了,那接下来干嘛呢,我们刚刚得到的是四个数字组成的区域的轮廓,这个时候我们应该遍历这些区域,得到里面的四个数字的轮廓。
2024-06-07 22:31:27
1881
1
原创 当我们在控制台运行`npm run xxx`时,到底发生了什么?
当我们在控制台运行`npm run xxx`时,到底发生了什么?使用过`vue-cli`或者`create-react-app`的小伙伴一定知道,当我们运行项目时,往往需要在控制台输入`npm run xxx`只有这样 我们的项目才会开始构建,接下来我们就来探讨其中的过程...
2022-08-11 16:51:10
1167
原创 react中函数组件和class组件的区别
走到handerClick,此时handerClick被重新创建,即handerClick指向了新的内存空间,值得注意的是:for循环接着往下走的时候,num所在的上下文并不是当前函数(新创建的函数),而是第一次初始化时创建的函数,而那个函数的上下文中,num永远都是0,所以console.log输出都是0。不论react对状态进行了什么处理,我们要知道的是,class组件是有状态的,他的状态会在组件生命周期中一直保存。的,每一次更新数据都会重新调用函数,生成新的函数执行上下文。...
2022-08-09 10:58:48
985
原创 前端每日一练<async和defer>
我们知道js代码执行是从上往下的,所以如果代码执行到某一处时可能会发生阻塞,妨碍下方代码继续执行我们讨论下和script标签与执行顺序有关的的属性:多说无用,直接看demo这里我们在一个html文件中引入一个js文件,将script标签写在span标签之前js文件中代码的作用时进行一个延时,并向页面中添加一个p标签当我们不设置async或defer属性时,页面是这样的,先执行js文件中的代码(延时2s然后向页面添加p标签),然后继续向下执行渲染页面,所以过程当设置属性为async时,不阻塞页面渲染(代码继
2022-06-14 18:08:34
253
1
原创 前端每日一练<属性名的类型>
题目:上面代码会输出什么?答案是:456为什么?这里牵扯到这几个知识点:对象的属性名类型对象的属性名类型只能有两种,分别是String和Symbol,如果新增的属性的类型不是两种中的任意一种,那么就会调用toString()方法将其转换成string类型[对象].toString()的结果设有一个对象obj,obj.toString()的结果是a.key和a[key]的区别假设有一个对象a执行a.key实际上会获取a中属性名为的属性,这里的是一个字符串,实际上就是获取a[‘key’]而执行a[key],
2022-06-14 18:07:36
233
原创 js赋值运算的过程
示例这道题的结果是什么?正确答案是这道题考察的是js赋值运算的过程我们以这个赋值运算为例,当我们执行这段代码时,js引擎的处理过程是这样的第4点的解释是这样的:那我们再回到示例题,解释一下示例代码的执行过程最终指向示例图如下所示总结:js入门很简单,但是深挖的话里面的细节确实挺多的,知识深度还是不太够...
2022-06-09 18:16:12
2505
原创 vue长列表优化之虚拟列表实现
vue长列表优化之虚拟列表实现应用场景:后台一次性发送上千条或更多数据给前台场景模拟:用户发起一个请求,后台发送了10w条数据使用虚拟列表之前:前台需要生成10w个dom节点用来渲染页面使用虚拟列表之后:前台只需要生成少量dom节点(dom节点数量取决于前端视图需要展示的数量),就可以实现对这10w条数据的视图渲染总之:虚拟列表就是固定dom节点数量,通过修改dom节点的内容而达到不重新增加(或删除)dom节点来实现列表的更新1.实现原理监听页面滚动,获取滚动的高度scrolltop根据
2022-05-30 18:49:19
15808
2
原创 css多栏布局(双栏布局、三栏布局、圣杯布局、双飞翼布局)
1.两栏布局两栏布局的核心是左栏固定宽度,右栏宽度自适应html结构为 <div class="outer"> <div class="left"></div> <div class="right"></div> </div>方式一左栏浮动+固定宽度右栏宽度auto+margin偏移.outer{ height: 500px; background-color:
2022-04-18 21:19:10
1845
原创 实现图片懒加载
图片懒加载原理:初始时给页面上的图片的src设置为空值或者javascript:;,给图片创建一个data-url属性,并将图片正确的url赋值给data-url属性,当图片到达浏览器视窗时,将data-url的值赋值给src属性,这样就达到了懒加载的目的;实现懒加载前需要注意:给html标签(当然其中就包括img)设置data-*属性,这个属性会被储存在dom的dataset属性中,它的属性名就是*(例如我给img标签设置data-url属性,那么可以在img元素内的dataset属性中找到名为
2022-04-08 16:57:47
2120
原创 记一次令我吐血的demo实现经历
最近在复习js知识,看到了requestAnimationFrame这个API,就想着用这个API写一个小demo来练练手首先介绍一下这个API吧这是MDN文档的官方解释window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行大概意思就是浏览器会在单位时间内不断地重新渲染(这里为了方便理解其实说的不准确,可以了解一下浏览器的重绘
2022-03-20 20:01:28
348
原创 前端面试必备知识点总结
这篇博客是对前端面试所必须掌握的知识点的总结,并且这篇博客正在持续更新中…1.JavaScript 基础1.执行上下文/作用域/闭包1.什么是执行上下文?执行上下文是评估和执行JavaScript代码环境的抽象概念。每当JavaScript代码在运行时,他都是在执行上下文中运行。执行上下文的类型JavaScript共有三种执行上下文类型全局执行上下文这是基础的上下文,任何不在函数内部的代码都在全局上下文中.他会执行两件事:创建一个全局的window对象(浏览器环境的情况下),并且设
2022-03-08 20:05:05
6441
原创 字节青训营-实现前端动画
前端动画实现最近实在太忙了,没有时间写博客,贴一波最近学的动画代码敷衍一下演示地址动画演示实现下述动画效果:控制小球匀速移动控制小球暂停控制小球动画终止控制小球动画倒序播放控制小球速度<script> function animate({easing,draw,duration}){//动画函数 let start = performance.now(); let speed = 1 //倍速 //动画状态 let state = 'canc
2022-01-21 19:39:52
1200
原创 JS面试题-如何优雅的获取浮点数的整数和小数部分
1.取整数1.parseIntlet num = 3.75;console.log(parseInt(num)); // 3num = -3.75;console.log(parseInt(num)); // -3用parseInt取整数,结果是没问题的,但是如果严格来说,其实parseInt并不是设计用来取整数的。???????? 知识点:parseInt(string, radix)``这个方法是一个将字符串转换为整数的方法,它有两个参数,第一个参数表示要转换的字符串,如果参数不是一个
2022-01-08 16:14:43
2077
原创 前端面试题:在什么情况下a === a-1?
我们可以思考我们所学的数学知识无穷大和无穷大-1应该怎么比较?按照极限的思想,无穷大与无穷大-1应该是相等的,因为无穷大不能用来表示一个具体的数在JavaScript中,整数可以被精确表示的范围是 -2 * 53 + 1* 到 2 * 53 - 1*,即 -9007199254740991 到 9007199254740991。超过这个数值的整数,都不能被精确表示。所以当数字超过这个范围时,js会讲这个数定义为无穷大或者无穷小正负infinity在js中,Infinity是一个Number类
2022-01-04 21:27:36
1480
1
原创 node.js学习-回调函数
回调函数解释:回调函数就是我们在调用一个函数或者API时,向其传递一个函数作为参数供其调用使用场景:对于异步API,例如ajax请求等操作我们可以使用回调函数,等待请求拿到数据后在执行后面的操作示例:function fun1(){ const x=1,y=2 add(x,y,function(data){ console.log(data) })}//callback就是fun1传递过来的回调函数function add(x1,y1,callback
2021-12-11 12:16:36
702
原创 使用nodemon解决node修改代码后需要手动重启的问题
使用nodemon解决node修改代码后需要手动重启的问题nodemon是一个第三方库,**他能监视我们node项目代码的变化,每当代码被修改后,它能自动重启node项目,**我们可以不需要频繁的手动重启服务器下载:npm install --global nodemon注意使用global将它下载到全局安装完毕后,使用方法:nodemon xxx xxx为我们执行的js文件示例:nodemon app.js...
2021-11-28 20:01:51
724
原创 node.js中npm包管理器的理解和使用
npm全名node package manager,即node包管理器要了解npm,我们要先了解npm中最重要的一个文件,即package.json(包说明文件)1.package.json我们建议每个项目都要有一个package.json文件,他能对我们项目的基本信息进行描述,并且当我们使用npm进行一系列操作时都需要用到package.json怎么生成package.json文件?指令:npm init当我们在控制台输入以上指令,控制台就会根据我们的需求生成含有相应内容的package.js
2021-11-25 17:45:58
509
原创 CSS-线性渐变|径向渐变|圆锥渐变
12.css3渐变1.线性渐变为了创建一个线性渐变,你必须至少定义两种颜色节点。颜色节点即你想要呈现平稳过渡的颜色。同时,你也可以设置一个起点和一个方向(或一个角度)。语法:background-image: linear-gradient(direction, color-stop1, color-stop2, ...);direction:起点或方向默认情况下,线性渐变的方向时从上到下的background-image: background:linear-gradient(red,oran
2021-11-24 17:09:30
587
原创 node中模块的引入规则
5.node中的模块加载规则1.模块加载顺序从缓存中加载核心模块路径形式的文件模块第三方模块分析:优先级1:从缓存中加载模块node在执行程序时,会将引入的模块存入缓存中,方便下次引用时直接从缓存中读取,而不需要重新引用,这样做可以加快程序执行速度,减少不必要的时间浪费所以当我们加载模块时,node会优先从缓存中寻找指定模块优先级2:加载核心模块node为我们准备了一些核心模块,例如文件模块fs,网络模块http等,当我们引入模块时,node会优先加载这些文件require(
2021-11-23 21:45:20
1871
原创 es6中模块导入导出与node中的模块系统的区别
es6中的模块导入方法与node中的区别node中的导入导出方式是:导入:requirerequire('./xxx')var add = require('./main')console.log(add.add(1,2));console.log(add.obj.a);导出:exports module.exportsexport.a=1module.exports.a=1function add(x,y){ return x+y}let obj = {
2021-11-22 20:28:32
760
原创 Node.js模块的导入与导出详解
1.模块的导入与导出导入:require(xxx.js)导出:exportsexports.a = 1exports.b = 2module.exportsmodule.exports.a = 1module.exports = {a:1,b:2}区别:module.exports可以直接复制,例如module.exports=1,而exports不能直接赋值module.exports = 1//rightexports = 1//err2.exports与mod
2021-11-22 18:16:26
7736
原创 JavaScript-JS闭包的理解
闭包1.定义本质:在一个函数内部创建另一个函数。只要存在函数嵌套,并且内部函数调用了外部函数的属性,就产生了闭包!!闭包的特性:函数嵌套函数函数内部引用函数外部的参数和变量参数和变量不会被垃圾回收机制回收闭包的优点:保护函数内的变量安全,实现封装,防止变量流入其他环境发生命名冲突在内存中维持一个变量,延长变量的生命周期匿名自执行函数可以减少内存消耗闭包的缺点被引用的私有变量不能被销毁,增大了内存的消耗,造成内存泄露,解决办法是可以在使用完变量后手动将其赋值为null其次
2021-10-27 21:18:00
167
原创 JavaScript高级-原型链继承-构造函数继承-组合继承
7.原型链继承流程定义父类型构造函数给父类型的原型添加方法定义子类型的构造函数创建父类型的实例赋值给子类型的原型为子类型的原型添加方法关键子类型的原型为父类型的实例对象示例 //父类型 function Supper(){ this.supProp = 'Supper property' } Supper.prototype.showSupperProp = function(){ console.log(th
2021-10-25 16:51:22
275
原创 JavaScript高级-原型和原型链
1.函数的prototype1.函数的prototype属性每个函数都有一个prototype属性,它默认指向一个Object空对象(原型对象)原型对象中有一个属性constructor,它指向函数对象(如下图)2.给原型对象添加属性(一般为方法)作用:函数的所有实例对象都会拥有原型中的属性(方法) function Fun(){ } const fun = new Fun() console.log(fun.__proto__===Fu
2021-10-09 20:52:08
332
1
原创 JavaScript高级-数据、变量、内存的定义与联系
1.定义什么是数据?存储在内容中代表特定信息的二进制编码,本质为01001…数据的特点:可传递,可运算一切皆数据内存中所有操作的目标:数据算术运算逻辑运算赋值运行函数什么是内存?内存条通电后产生的可存储数据的空间(临时的)内存的产生和死亡:内存条(电路板)>通电>产生内存空间==>存储数据==>处理数据==>断电==>内存空间和数据都消失一块内存中包含内部存储的数据地址值内存分类栈:全局变量/局部变量堆:对象
2021-10-04 21:47:13
230
原创 JavaScript高级-数据类型
1.数据类型1.定义1.分类1.基本(值)类型String:任意字符串Number:任意的数字Boolean:true/falseundefined:undefinednull:null2.对象(引用)类型Object:任意对象Function:一种特别的对象(可以执行)Array:一种特别的对象(通过数值下标寻找,内部数据是有序的)2.判断typeof:可以判断:undefined/Number/String/Boolean类型以及Function类型inst
2021-10-04 21:45:18
301
原创 Vue-VueRouter路由的使用(超详细)
1.定义理解:一个路由(route)就是一组映射关系(key-value),多个路由依靠路由器(router)进行管理前端路由:key是路径,value是组件2.基本使用1.安装vue-routernpm i vue-router2.应用插件Vue.use(Router)3.编写router配置项在router.js中(如果没有这个文件就自己创建)import Vue from 'vue'import Router from 'vue-router'Vue.use(Router)
2021-09-15 17:16:59
3321
原创 Vue-Vuex的使用
1.定义1.vuex是什么:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信2.什么时候使用Vuex 1.多个组件以来同一状态 2.来自不同组件的行为需要变更同一状态3.Vuex工作原理图2.vuex核心概念和API1.state1.vuex管理的状态对象(存放数据的对象)2.它应该时唯一的3.示例代码:const state = { // key:val
2021-09-11 20:29:23
508
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人