后端
文章平均质量分 65
天青色 等烟雨
这个作者很懒,什么都没留下…
展开
-
一文解密网络背后的秘密
我们需要先知道一些基础的概念,例如SYN: 请求建立连接ACK: 对请求做出响应SYN_SEND: 等待匹配连接的请求ESTABLISHED:代表一个打开的连接三次握手需要保证客户端和服务端都要保证一发、一收信息,过程如下:一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;原创 2023-10-22 17:41:25 · 196 阅读 · 0 评论 -
【Es基础入门必看】
做了缓存之后虽然我们的QPS可以达到8万左右,但是对于一个大型的商业项目这也是远远不够的,所以ElasticSearch诞生了,亿级的QPS加上简单易扩展,可以独立部署,简直就是一个完美的搜索引擎。倒排索引也叫做反向索引,我们通常理解的索引可能就是通过key寻找value的键值对,倒排做因简单来说,就是通过value来寻找key,所以才叫做倒排索引。区别于关系型数据库的是,ES是一个非结构化的数据库,每个文档可以有不同的字段,并且有一个唯一标识。这个概念就不用太关注了。,带有倒排索引的文件被称为倒排文件。原创 2023-10-09 22:14:17 · 188 阅读 · 0 评论 -
一文搞清楚Java中常见的IO模型
首先,我们要清楚什么是IO,根据冯诺依曼结构,计算机结构分为5部分:运算器、控制器、存储器、输入设备和输出设备。输入设备和输出设备都属于外设,网卡、硬盘这种既可以属于输入设备也可以属于输出设备。输入设备向计算机输入数据,输出设备接收计算机输出的数据。从数据结构的时间来看的话,IO描述了计算机系统与外部设备之间通信的过程。为了保证操作系的稳定性和安全性,一个进程的地址划分为用户空间和内核空间。原创 2023-10-06 16:25:02 · 113 阅读 · 2 评论 -
Java基础知识回顾
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.序列化是一种将对象转换为字节流的过程,以便可以将对象保存到磁盘上,将其传输到网络上,或者将其存储在内存中,以后再进行反序列化,将字节流重新转换为对象。序列化在 Java 中是通过接口来实现的,该接口没有任何方法,只是一个标记接口,用于标识类可以被序列化。当你序列化对象时,你把它包装成一个特殊文件,可以保存、传输或存储。原创 2023-09-29 21:47:31 · 213 阅读 · 0 评论 -
搞明白 行锁、表锁、意向锁、间隙锁、next-key锁。。。
最近在复习Mysql的时候发现对于锁这方面的知识掌握的真是一言难尽,起因是在看到Innodb如何解决幻读的问题。原创 2023-09-15 20:48:17 · 97 阅读 · 0 评论 -
聊聊spring-cloud的负载均衡
在微服务架构中,负载均衡是非常重要的一个环节,可以有效地提高系统的可用性和稳定性。在使用Spring Cloud提供的负载均衡组件时,需要注意减少负载均衡对系统性能的影响。具体来说,可以选择合适的负载均衡算法、合理设置超时时间、缓存服务实例列表、使用断路器和使用缓存等。原创 2023-07-22 22:07:39 · 962 阅读 · 1 评论 -
RBAC详解
RPAC模型是一种基于角色的访问控制模型,它将用户分配到不同的角色中,每个角色都有一组权限。用户通过被分配到的角色来获得访问系统资源的权限。在本文中,我们详细讨论了RPAC模型的工作原理,并使用一个数据库示例来说明如何实现RPAC模型。我们还提供了相关的代码示例,帮助读者更好地理解RPAC模型的实现。原创 2023-07-19 09:10:25 · 2256 阅读 · 2 评论 -
分析eureka与nacos的区别
当我们启动服务提供者和Nacos服务注册中心后,可以在Nacos服务注册中心中看到服务提供者的注册信息。当我们启动服务提供者和Eureka服务注册中心后,可以在Eureka服务注册中心中看到服务提供者的注册信息。同时,当服务消费者需要调用服务提供者时,可以通过Eureka服务注册中心进行服务发现和负载均衡。Nacos通过使用Raft算法来实现服务注册和发现,并使用DNS和HTTP等多种方式来实现服务的发现。Nacos提供了健康检查的功能,可以定时检测服务的健康状态,并且可以配置自定义的健康检查规则。原创 2023-07-17 15:47:24 · 558 阅读 · 3 评论 -
深入理解 Spring 框架
Spring 是一个优秀的企业级开发框架,它提供了丰富的功能和工具,帮助开发者构建可靠、灵活和高效的应用程序。在学习和使用 Spring 的过程中,我们需要深入理解其核心概念和特性,以便更好地应用于实际项目中。原创 2023-07-12 11:22:08 · 726 阅读 · 4 评论 -
Java对象结构与内置锁
Java内置锁的很多重要信息都存放在对象结构中。原创 2023-03-11 16:00:51 · 480 阅读 · 0 评论 -
对于ThreadLocal的理解
在Java的多线程并发执行的过程中,为了保证多个线程对变量的安全访问,可以将变量放到ThreadLocal类型的对象中,是变量在每一个线程中都有独立的值,不会出现一个线程读取变量时被另一个线程修改的现象。ThreadLocal类通常被翻译为本地变量类或者线程局部变量。ThreadLocal位于JDK的java.lang核心包中。如果程序创建了一个ThreadLocal实例,那么在访问这个变量的值时,每个线程都会拥有一个独立的、自己的本地值。原创 2023-03-04 08:33:30 · 429 阅读 · 0 评论 -
记录直播功能的实现
这里的直播功能依赖的是腾讯云的云直播接口,我们只负责编写的配置类中自己的参数即可实现,甚至不需要导入额外的依赖。原创 2023-02-28 20:26:02 · 550 阅读 · 0 评论 -
对象的 生 | 死
线程私有的程序计数器、虚拟机栈、本地方法栈随着线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊的执行者入栈和出栈。每一个栈帧中分配多少内存基本是在类结构确定下来时就已知的。,因此这几个区域的内存分配回收都具备确定性,在这几个区域内就不需要过多考虑垃圾回收的问题,当方法结束或者线程结束的时候,内存自然就跟着回收了。原创 2023-02-24 17:41:39 · 376 阅读 · 0 评论 -
Jvm -堆对象的划分
所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区,在《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组对象都应当在运行时分配在堆上。为对象分配内存是意见非常严谨和复杂的任务,jvm的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC完成垃圾回收后在内存空间产生的内存碎片。Java堆区域的大小在jvm启动时就已经被确定下来了,是jvm管理的最大的一块内存空间,但对的大小也是可以调节的。对GC指向垃圾回收的重点区域。原创 2023-02-18 16:53:41 · 696 阅读 · 0 评论 -
Class文件结构
常量池是class文件中内容最丰富的区域之一,随着Java虚拟机的不断发展,常量池的内容也不断丰富。同时,常量池对于Class文件中的字段和方法解析也有着至关重要的作用,可以说,常量池是整个class文件的基石。在版本号之后,紧跟着就是常量池的数量,以及若干个常量池表项。Java代码可以跨平台运行的基础就是因为jvm的跨语言特性,无论哪种语言编写的程序,只要能编译成class文件,就能通过Jvm在各种平台上运行。实现这一特性的关键就是同意而强大的Class文件结构,它是异构语言与jvm之间的重要桥梁。原创 2023-01-15 15:22:55 · 111 阅读 · 0 评论 -
【无标题】
无论是通过哪种方法退出,在方法推出后都要返回到方法被调用的位置,方法非正常退出时,调用着的pc计数器的值作为返回地址,即调用该方法指令的下一条指令的地址,而通过一场退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。每一个操作数栈都会拥有一个明确的栈深度用于储存数值,其所需要的最大深度在编译时就定义好了,保存在方法的Code属性中名为max-stack的值。操作数栈就是jvm执行引擎的一个工作区,当一个方法开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈是空的。原创 2022-12-11 12:39:53 · 293 阅读 · 0 评论 -
详解jvm的5种引用
在Java虚拟机中有5中常见的引用,强引用,软引用,弱引用,虚引用和终结器。强引用:直接引用。软引用和弱引用在没有没强引用引用且进行垃圾回收时,如果内存不足,软引用对象就会被垃圾回收,而弱引用只要进行垃圾回收就会被回收掉。虚引用虚引用并不会决定对象的生命周期,在任何时间内都会被回收掉在使用虚引用的时候,必须和引用队列一起使用,虚引用的构造器必须传入一个该类型的引用队列。一般用来跟踪垃圾回收的过程,在对象被垃圾回收时收到一个系统消息。程序可在收到某个虚引用对象被回收后做相应的措施。原创 2022-11-26 19:18:59 · 335 阅读 · 0 评论 -
JVM的内存结构
因为Java虚拟机是多线程的,多线程是通过线程流切换、分配处理器执行时间的方式来完成的,在任何一个确定的时间,一个处理器都只会执行一条线程种的指令,因此,为了线程切换后能回到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立储存,也就是所谓的。Java在执行Java程序时,会把他所管理的内存划分位若干个不同的数据区域,这些区域都有各自的用途、创建和销毁的时间,有的区域会随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁的。原创 2022-11-10 22:16:43 · 443 阅读 · 0 评论 -
如何实现用拼音查询数据库字段
所以,我就在想这个功能应该怎样去实现,百度到说要用ElasticSearch,折腾了两天,只能查关键字,还是没办法查拼音,后来偶然看到一篇博客。现大多数的网站都实现了利用拼音查询数据库的功能,像腾讯视频。里面采用了自定义函数的方式去实现拼音转文字。需要建立一个表,将汉字和拼音对应起来。原创 2022-11-05 16:01:16 · 535 阅读 · 0 评论 -
源码学习day04 (HashTable)
由无参构造器我们可以看到HashTable的默认数组大小为11,至于为什么是11呢?一会儿再进行解释,我们也可以看到,与HashMap不同的是,数组的初始化是在构造器中完成的。HashTable底层是基于数组加量表实现的,与HashMap相比,少了红黑树,但是HashTable是线程安全的。原创 2022-10-20 20:49:55 · 97 阅读 · 0 评论 -
源码学习day03 (TreeMap)
【代码】源码学习day03 (TreeMap)原创 2022-10-19 20:17:32 · 82 阅读 · 0 评论 -
源码学习day02 (HashMap)
经过这一段时间的源码学习,越发感觉到自己基础知识的不牢靠,看源码感觉很吃力,经常看着看着就变成了天书,只能去百度,但是这也让我学到了很多,在项目跟考核的压力下,感觉这段时间挺充实的,往后继续努力,加油!上个图。原创 2022-10-14 17:20:20 · 490 阅读 · 0 评论 -
源码学习day01(ArrayList)
经过观察我们会发现,再涉及到对列表结构修改时,modCount就会自增,然后我们接着寻找我们可以看到再涉及到列表的保存以及迭代时都提到了modCount,并且都有一个变量来引用modCount在方法中也会对modCount和expectedModCount进行判断,如果不相等就会抛出ConcurrentModificationException()异常,原创 2022-10-07 17:21:18 · 593 阅读 · 3 评论 -
解析位运算
位运算能够高效率的完成数值的计算,因为机器本身就是基于二进制的存储和计算,所有的数值或者对象最终都要转化为二进制,对象的话,可能需要一些编解码的动作,位运算主要是针对数据运算的,把人们熟悉的数字转化为机器熟悉的数字,其中又牵扯到原码,反码和补码,补码的出现是为了减低机器运算的复杂度,把减法转变为加法,可以这么说机器运算只有加法和移位,乘法最终是通过加法和移位操作完成的,而除法首先转变为乘法。输入: nums = [1,1,2,3,3,4,4,8,8]输入: a = 1, b = 1。原创 2022-09-14 08:54:13 · 832 阅读 · 0 评论 -
使用tika判断文件类型中遇到的问题
在web项目中,我们通常会上传文件到服务器,这时就会对上传文件的类型进行判断,最简单的就是对文件的后缀名进行判断,但是,但某些用户恶意修改文件后缀时,这种方法就无法对其进行拦截。所以我们应该使用tika来对文件的类型进行判断,tika是判断文件的魔术字节来对文件类型进行判断的。第二个就是tika会把xlsx与docx mine type解析为zip的mine type类型,这个的原因看了大佬的博客理解了一点。第三就是对于空的doc文件,跟有内容的doc文件,mine type类型竟然是不一样的。原创 2022-09-10 11:20:55 · 715 阅读 · 0 评论 -
sql语句学习
如果employee_id对2取余的结果等于1就进行第二次判断,否则返回0,第二个判断用到了截取字符left(),即截取左边开始的第一个字符,如果结果为真就返回salary,否则返回0.datediff()会返回两个日期之间的差值,语法为datediff(day1,day2)在写项目时,我们会发现,日期的比较时必不可少的,那么,如何进行日期的比较呢?IF 语句允许我们根据表达式的某个条件或值结果来执行一组 SQL 语句。如果a1的值为true, 那么就返回a2否则就返回a3。可以将多个字符串拼接在一起。原创 2022-09-10 08:13:20 · 283 阅读 · 0 评论 -
算法训练(重建二叉树)
知道了这些之后我们可以看出前序遍历结果的第一个值就是该二叉树的根节点,再根据中序遍历的结果,我们可以找到二叉树的左子树与右子树,输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。先遍历根节点,然后遍历左子树,最后遍历右子树。先遍历左子树,然后遍历根节点,最后遍历右子树。先遍历左子树,然后遍历右子树,最后遍历根节点。以上操作可通过递归加队列进行实现。先说一下二叉树的三种遍历方式。然后点用递归函数即可。原创 2022-09-03 10:11:35 · 134 阅读 · 0 评论 -
队列(Java)
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。采用链表实现的队列,没有个数限制。插入元素时直接接在链表的尾部,取出元素时直接从链表的头部取出即可。采用数组实现的队列,通常是循环数组,受限于数组的大小,存在天然的个数上限。插入和取出元素时,必须采用队列头部指针和队列尾部指针进行队列满和队列空的判断。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。队列的简单使用。......原创 2022-08-13 12:31:51 · 125 阅读 · 0 评论 -
dp数组解决背包问题
在当前的这种算法中dp[N][M]代表的就是存放N个物品的最大价值,首先使用双重for循环来对背包容量以及物品价值进行遍历,然后对与物品的大小与容量的关系及进行判断,看是否可以存到数组中,然后再去判断是存到数组中价值最大,还是不存进数组价值大,最后将结果返回。有 n 个物品和一个承重为 m 的背包. 给定数组 W表示每个物品的重量和数组 V 表示每个物品的价值。背包问题,我们首先要知道的就是每一个数据究竟代表什么,以及数组的元素代表什么,然后再去思考怎么去计算背包容量与价值。...原创 2022-08-06 20:36:36 · 202 阅读 · 0 评论 -
基于tika实现对文件类型进行判断
判断文件类型一般可采用两种方式1.后缀名判断简单易操作,但无法准确判断类型2.文件头信息判断通常可以判断文件类型,但有些文件类型无法判断(如word和excel头信息的前几个字节是一样的,无法判断)使用tika就可轻松解决这两种方式存在的问题。......原创 2022-07-31 09:45:57 · 1276 阅读 · 0 评论 -
springbootSecurity自定义登录
然后,对密码进行加密紧接着,要对用户进行认证,对特定的Authentication进行认正再然后,用configure(AuthenticationManagerBuilder)来使AuthenticationProvider容易地添加来建立认证机制,也就是说用来记录账号,密码,角色信息之后实现UserDetailsService接口,但是实现这个接口后我们会发现其返回参数是UserDetails类型,这就需要我们去实现改接口,并将账号密码相关的实体类放进去,然后就可以去实现UserDetail原创 2022-07-08 21:31:51 · 1144 阅读 · 2 评论 -
springsecurity简介
springsecurity的核心就是认证和授权,其本质就是一组链式的过滤器,用户发送请求进来,判断有没有请求的权限。启动项目可以看到下面的登陆页面,用户名默认user,密码在控制台输出当然,security还可以自定义登陆页面并从数据库获取用户如果要实现查询数据库,就要实现UserDetailsService类,添加自己的配置,并且在serviceImpl层通过UsernamePasswordAuthenticationToken,提交用户名和密码到UserDetailsService,在User原创 2022-07-01 21:15:25 · 482 阅读 · 0 评论 -
redis在项目中的使用
1.引入依赖org.springframework.bootspring-boot-starter-data-redis2.在yml文件中进行配置3.redis相关配置类4.进行测试原创 2022-06-26 07:13:41 · 1929 阅读 · 0 评论 -
如何在Linux安装redis
1.安装wegt2.利用wegt下载redis安装包3.解压安装包4.因为redis底层是由c语言编写,所以需要下载gcc环境5.进入到解压过的文件redis6.移动配置文件7.修改配置文件,改成后台运行改bind,不然远程无法访问8.测试进入redis的bin目录启动redis-server启动redis-cli输入ping命令测试。另外还要测试下远程链接远程连接成功!...原创 2022-06-18 15:43:56 · 192 阅读 · 0 评论 -
Redis的简单了解
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。那么我们为什么要使用redis,redis的读写速度很快,方便扩展,且数据类型多样。1.stringstring是最常用的数据类型,只需要set 名称 内容即可。2.listredis中的lists在底层实现上并不是数组,而是链表,插入的速度很快,但是定位比较慢。3.setset和Java中的set一样,都不能存在重复元素,且元素没有先后顺序,集合相关的操作也很丰富,如添加新元素、删除已有元原创 2022-06-11 17:32:33 · 169 阅读 · 0 评论 -
如何在springboot中实现简单的草稿箱
如何在springboot中实现简单的草稿箱建表sql语句相关代码建表我们只需要给表加一个状态的字段来进行判断他是不是草稿即可例如CREATE TABLE `recipe` ( `id` int NOT NULL AUTO_INCREMENT, `recipe_name` varchar(220) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `author` int NOT NULL, `time` varchar(220原创 2022-05-18 20:23:10 · 941 阅读 · 0 评论 -
springboot目录结构
springboot目录结构简介结构总结简介经过上次考核的洗礼,越发认识到项目目录结构的重要性,所以这次在学习springboot时便首先了解了springboot的目录结构,经过我不懈努力,终于得到了一个清晰的答案。结构1.src/main/java 这个是必不可少的java代码存放的地方2.src/main/resource 这个就很重要,这儿不仅仅是存放各种配置文件的地方了,还被用来存放前端的html页面,css,js等静态资源resource中首先要存放的就是application.p原创 2022-05-11 15:01:01 · 8236 阅读 · 0 评论 -
浅谈ssm框架中的请求转发和重定向
浅谈ssm框架中的请求转发和重定向ssm究竟是什么controller到底该怎么去写理解重定向与请求转发总结ssm究竟是什么ssm框架由spring、springmvc、mybatis构成,spring的作用就是减少各层之间的耦合度,将对象交给ioc容器进行管理。。springmvc则是将各层的作用清晰的凸显出来,controller就是负责视图渲染,service层则是进行逻辑处理。mybatis则是让对数据库的操作变得更加清晰,并且我们可以利用动态sql语句来实现各种灵活的功能。controlle原创 2022-05-09 23:57:38 · 1007 阅读 · 0 评论 -
食谱项目总结
食谱项目总结其实一开始对于接手一个相对于大佬来说小菜一碟的项目,我还是有点小激动的,尤其是当我知道了我们组救我一个后端的时候,这既是一个缺点,但是我觉得这也是一个优点,优点就是,我一个后端,自己的java代码绝对不可能有冲突,而且因为所有的接口都是自己写的,应对前端小伙伴的问题也可以非常快速,清晰的解决,其次就是,我觉得这样更加锻炼了一种能力,独立思考一种问题如何解决,一项功能到底该如何实现,怎样才能做到最简单。当遇到实在无法解决的问题,就去疯狂百度,B站的弹幕也很有用,一堆大佬,再不懂就回去找其他后端的原创 2022-05-08 07:59:13 · 109 阅读 · 0 评论 -
基于springmvc实现支付宝沙箱模型
基于springmvc实现支付宝沙箱模型引入依赖以及支付宝官网注册支付宝的配置类最后Controller层总结引入依赖以及支付宝官网注册最新依赖<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.22.49.ALL&原创 2022-04-30 15:28:00 · 602 阅读 · 0 评论