- 博客(89)
- 收藏
- 关注
原创 Redis知识4
/multiSet 相当于 redis 中的 mset。//multiGet 相当于 redis 中的 mget。6.1 sadd、smembers、srem 和 sismember。5.1 hset、hget、hexists 和 hdel。7.1 zadd、zrange、zrem 和 zcard。//redis 中 setrange。//redis 中 getrange。4.1 lpush 和 lpop 和 lrange。3.2 getrange 和 setrange。3.1 mget 和 mset。
2026-05-09 11:28:13
124
原创 Redis知识3
如果对应的值是负数,则视为减去对应的值。为了解决这个问题,可以使用 Redis 将用户的 Session 信息进行集中管理,如图 2-13 所示,在这种模式下,只要保证 Redis 是高可用和可扩展性的,无论用户被均衡到哪台 Web 服务器上,都集中从Redis 中查询、更新 Session 信息。1)首先 Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。
2026-05-08 09:16:02
281
原创 Redis知识2
前提:这些socket都是不冲突且不繁琐的,不然还是乖乖多创建几个吧。4.redis的核心功能比mysql要更加简单。大部分的时候都是闲置的(对计算机来说)然后就让一个线程管理多个socket。一个线程可以管理多个socket。3.单线程模型不会出现线程冲突。
2026-05-07 09:33:19
449
原创 Redis知识1
与很多键值对数据库不同的是,Redis 中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能提高开发效率。Redis 提供了简单的 TCP 通信协议,很多编程语言可以很方便地接入到 Redis,并且由于 Redis 受到社区和各大公司的广泛认可,所以支持 Redis 的客户端语言也非常多,几乎涵盖了主流的编程语言,例如:C、C++、Java、PHP、Python、NodeJS 等,后续我会对 Redis 的客户端使用做详细说明。
2026-05-07 09:32:08
156
原创 WebSocket
Websocket是一种协议,用于在客户端和服务器之间建立持久的双向通信连接,广泛应用于需要实时数据交换的应用程序,例如在线聊天、实时游戏、股票行情等。是从 HTML5 开始支持的一种网页端和服务端保持长连接的消息推送机制WebSocket 协议 与 HTTP 协议有什么区别呢?HTTP 协议通常使用在 "一问一答" 的应用场景中:客户端向服务器发送一个 HTTP 请求,服务器给客户端返回一个 HTTP 响应上述情况中,服务器属于被动的一方,若客户端不主动发起请求,服务器就无法主动给客户端响应。
2026-05-06 11:54:44
322
原创 @Transactional
7.Propagation.NESTED :如果你没房,就⼀起买房.如果你有房,我们就以房⼦为根据地,做点小⽣意.(如果如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏.如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED )1.Propagation.REQUIRED :需要有房⼦.如果你有房,我们就⼀起住,如果你没房,我们就⼀起买房.(如果当前存在事务,则加⼊该事务.如果当前没有事务,则创建⼀个新的事务)
2026-05-05 19:12:20
194
原创 Spring事务
本篇文章主要内容为以下两个方面对事务进行一个简单的介绍Spring中事务如何实现事务的概念,我相信很多人在数据库的时候已经听过和了解了,所以这里只进行简单的介绍什么是事务?事务是⼀组操作的集合,是⼀个不可分割的操作。事务会把所有的操作作为⼀个整体,⼀起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。为什么需要事务?我们在进行程序开发时,也会有事务的需求.举个例子吧比如转账操作,A向B转账第⼀步:A账⼾-100元.第⼆步:B账⼾+100元.
2026-05-04 14:00:26
223
原创 SpringAOP原理(代理模式)
对上述代码做一个简单的讲解:1.InvocationHandler接是Java动态代理的关键接⼝之⼀,它定义了⼀个单⼀⽅法 invoke() ,用于处理被代理对象的方法调用.通过实现 InvocationHandler 接⼝,可以对被代理对象的方法进⾏功能增强.2.Proxy 类中使⽤频率最高的⽅法是: newProxyInstance() ,这个⽅法主要⽤来⽣成⼀个代理对象。
2026-05-03 17:17:26
770
原创 Spring AOP详解
AOP是Aspect Oriented Programming的简称(又称为面向切⾯编程)什么是面向切面编程呢?切面就是指某⼀类特定问题,所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢?比如在前面文章实现的"登录校验",就是⼀类特定问题.登录校验拦截器,就是对"登录校验"这类问题的统⼀处理.所以,拦截器也是AOP的⼀种应用.AOP是⼀种思想,拦截器是AOP思想的⼀种实现.Spring框架实现了这种思想,提供了拦截器技术的相关接⼝.
2026-05-02 14:00:24
376
原创 java之拦截器和适配器模式
适配器模式,也叫包装器模式.将⼀个类的接⼝,转换成客⼾期望的另⼀个接⼝,适配器让原本接⼝不兼容的类可以合作⽆间.简单来说就是⽬标类不能直接使⽤,通过⼀个新类进⾏包装⼀下,适配调⽤⽅使⽤.把两个不兼容的接⼝通过⼀定的⽅式使之兼容.比如下⾯两个接⼝,本⾝是不兼容的(参数类型不⼀样,参数个数不⼀样等等适配器模式角色Target:⽬标接⼝(可以是抽象类或接⼝),客⼾希望直接⽤的接⼝Adaptee:适配者,但是与Target不兼容。
2026-05-01 07:17:32
417
原创 Mybatis之动态sql
前面我们学习如何使用 Mybatis 框架来操作数据库,可以发现相比于 JDBC 来说,Mybatis 相当的简单,与 JDBC 繁琐的步骤不同,Mybatis 只需要创建一个接口类,然后可以选择使用注解的方式或者XML的方式来实现该接口类中的方法即可,后续Service层的代码只需要调用mapper接口类中的方法即可实现对应的SQL语句的功能。相比于XML的方式,注解的实现可谓是简单易上手,并且可读性也很好,但是XML也有它自己的好处,现在我们就来学习哪种场景下使用XML更好。
2026-04-30 10:05:55
687
原创 Mybatis操作数据库
在MySQL的学习阶段,我们知道了如何使用JDBC去操作,也正是因为学习了JDBC也知道其操作的繁琐,每次的CRUD操作都需要从数据库连接池中去获取数据库连接,然后再编写SQL语句,并绑定对应的参数,接着通过连接执行SQL语句,如果返回值的话还得处理返回值,最后还得释放连接等资源。明明在增删改查阶段只需要修改SQL语句以及对应的参数和处理返回结果即可,但还是存在很多重复性的操作的。
2026-04-29 10:51:56
504
原创 springboot日志
对于子系统角色而言,它本身是不知道有外观角色的存在的,就像上述计算操作,无论是通过机器语言来实现该操作,还是通过图形化界面来操作,本身对于计算这个操作来说,两者都是使用方,即客户端。上述的所有日志都是输出到控制台上的,但是在实际生产环境中,我们需要将日志保存到本地,以便于后续排查与追溯问题。我们可以从上述图中文件的大小来看,其并不是按照文件大小进行严格划分的,当该行的文件已经超过10KB的话,会将该行的所有日志全部存储完之后,再去新开一个文件来存储,而不是说一满10KB的话,就新开一个文件来存储。
2026-04-29 08:31:48
336
原创 SpringBoot文件配置
计算机上有数以千计的配置⽂件,我们使⽤的绝⼤多数软件,⽐如浏览器,微信,Idea, 甚⾄电脑,⼿机,都离不开配置⽂件.我们可能永远不会直接与其中的⼤部分⽂件打交道,但它们确实以不同的形式散落在我们的计算机上,⽐如C:\Users,C:\Windows⽂件夹,以及各种*.config ,*.xml⽂件。配置⽂件主要是为了解决硬编码带来的问题,把可能会发⽣改变的信息,放在⼀个集中的地⽅,当我们启动某个程序时,应⽤程序从配置⽂件中读取数据,并加载运⾏。并且上述文件名字不能有错,否则配置无效。
2026-04-28 17:15:55
364
原创 依赖注入详解
依赖注入依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象.在上⾯程序案例中,我们使⽤了 @Autowired 这个注解,完成了依赖注⼊的操作简单来说,就是把对象取出来放到某个类的属性中.在 ⼀些⽂章中,依赖注⼊也被称之为"对象注⼊","属性装配",具体含义需要结合⽂章的上下⽂来理解。
2026-04-28 09:13:05
325
原创 Spring IOC(1.0)
传统程序开发先设计轮⼦(Tire),然后根据轮⼦的⼤⼩设计底盘(Bottom),接着根据底盘设计⻋⾝(Framework),最 后根据⻋⾝设计好整个汽⻋(Car)。这⾥就出现了⼀个"依赖"关系:汽⻋依赖⻋⾝,⻋⾝依赖底盘,底盘依赖轮⼦最终程序的实现代码如下:问题分析这样的设计看起来没问题,但是可维护性却很低.接下来需求有了变更: 随着对的⻋的需求量越来越⼤,个性化需求也会越来越多,我们需要加⼯多种尺寸的轮胎.
2026-04-25 10:36:06
428
原创 SpringMVC5.0
什么是应用分层?应用分层 是一种软件开发设计思想, 它将应用程序分成N个层次, 这N个层次分别负责各自的职责, 多个层次之间协同提供完整的功能. 根据项目的复杂度, 把项目分成三层, 四层或者更多层.常见的MVC设计模式, 就是应用分层的一种具体体现.应用分层的目的在最开始的时候,为了让项目快速上线,我们通常是不考虑分层的. 但是随着业务越来越复杂,大量的代码混在一起,会出现逻辑不清晰、各模块相互依赖(高耦合)、代码扩展性差、改动一处就牵动全局的问题。
2026-04-24 17:54:52
531
原创 SpringMVC4.0
密码:<input name="password1" type="password" id="password"><br>用户名:<input name="userName1" type="text" id="userName"><br><input type="button" value="登录" onclick="login()">如果作用在类上, 表示该类的所有方法, 返回的都是数据, 如果作用在方法上, 表示该方法返回的是数据。return "<h1>计算结果: "+sum+"</h1>";
2026-04-23 08:06:07
417
原创 SpringMVC3.0
HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾端发送的数据, 响应头,状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容。HttpServletRequest对象代表客⼾端的请求,当客⼾端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信息.拿取Cookie有两种方式。这也是传统的Servlet的做法,也就是Spring底层。
2026-04-22 08:55:10
819
原创 SpringMVC1.0
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中. 通常被称为Spring MVC什么是ServletServlet 是一种实现动态页面的技术. 准确来讲Servlet是一套 Java Web 开发的规范,或者说是一套Java Web 开发的技术标准. 只有规范并不能做任何事情,必须要有人去实现它. 所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等.
2026-04-20 08:24:31
484
原创 java之JVM
在执行程序时,要在堆上申请一块内存空间.在C/C++中,上述内存空间需要手动方式进行释放.如果不手动释放的话,这块内存的空间就会持续存在,一直存在到进程结束(堆上的内存生命周期比较长.不像栈,栈的空间会随着方法执行结束,栈帧销毁而自动释放,堆则默认不能自动释放.)那么这就可能会导致一个严重的问题—内存泄漏.如果内存一直占着不用,又不释放,就会导致剩余空间越来越少.进一步导致后续的内存申请操作失败.因此,大佬们想了一些办法,来解决内存泄漏的问题.
2026-04-20 08:23:50
301
原创 Tomcat
Tomcat就是基于Java实现的一个开源的、免费的、最广泛使用的一个HTTP服务器,基于tomcat我们程序员可以对它进行修改自己实现一个想要的服务器。logs中放的就是日志(就是通过 System.out.println 等方式打印的一些字符串.),日志是调试一个服务器程序最重要的手段,后续自己写的程序,代码中打印的日志,就可以在上述目录中看到,对于动态页面tomcat 提供了一组 api,可以让程序猿更方便的编写动态页面,称为 Servlet,这就是下节课的内容了,它的内容比较多,需要很详细的讲述。
2026-04-20 08:23:18
415
原创 java之http协议2
但事情没这么简单. 要想进行对称加密,就需要客户端和服务器都具有同一个对称密钥,服务器同一时刻其实是给很多客户端提供服务的. 这么多客户端, 每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, 黑客就也能拿到了). 因此服务器就需要维护每个客户端和每个密钥之间的关联关系,这是个极其累的事,如果还要服务器再生成密钥的话就太负载了。上述过程,黑客面对服务器的时候,扮演客户端的角色,面对客户端的时候,扮演服务器的角色,那么客户端和服务器都不知道黑客的存在,这样就很神秘的泄露出去了。
2026-04-20 08:23:03
335
原创 java之http协议1
但是HTTP 协议是文本格式的协议,TCP, UDP, IP才是二进制格式的协议,这里为什么好端端的文本格式协议变为二进制格式的协议(文本格式协议和二进制格式协议区别在于看不看得懂内容),这是因为HTTP 响应通常会被压缩为二进制格式的协议,压缩之后体积变小,传输的时候节省网络带宽(一台服务器最贵的就是网络带宽)实际上更容易想到的是,把这样的数据直接存储到本地文件中,但是实际上不可行的.浏览器为了考虑到安全性,禁止网页直接访问你的电脑的文件系统),网页代码中也就无法直接生成一个硬盘的文件来储数据了.
2026-04-19 08:18:17
182
原创 基础网络原理3
TCP优势:可靠传输,TCP 适用于绝大部分场景.UDP优势:更高效率,UDP 更适合于 对于"可靠性不敏感”,"性能敏感”场景如果要传输比较大的数据包,TCP 更优先(UDP 有 64KB 的限制)如果要进行"广播传输",优先考虑 UDP,UDP 天然支持广播,TCP 不支持 (应用程序额外写代码实现)有一种特殊的场景,需要把数据发给局域网的所有的机器.这个情况就是广播。
2026-04-19 08:18:04
147
原创 基础网络原理2
TCP最核心的功能就是可靠传输,可靠传输之所以能达成,主要是依靠"确认应答"机制,这里是通过应答报文来通知发送方,我已经收到请求,这是一切顺利的情况,如果不顺利呢?当A从发送数据之后,到正常收到ACK,在这中间肯定也需要一定的时间,A就会进行等待,如果等待时间超过了某个阈值,还没有收到ACK,此时就可以认为出现丢包了,此时就会触发重传。在上述的32位序号和32位确认序号,此时32位序号就是发送数据的序号,32位确认序号就是给应答报文用到,这样的数据就可以根据确认序号区分出要应答哪个上面的数据了。
2026-04-19 08:17:37
170
原创 基础网络原理1
1234|180E40N”或者“1234,180E40N”等都可以为自定义格式,我们在这字符串里面用什么样的分隔符都是可以灵活进行选择的,
2026-04-19 08:17:27
233
原创 网络原理2
数据包的封装是指在数据从高层向低层传递的过程中,每一层协议都会在数据包的前面添加自己的控制信息(头部),有时也会在数据包的后面添加一些信息(尾部)。集线器工作在物理层。我们通过协议分层去传输,在确定好协议分层相对应的各个协议后,数据会从应用层一直传输到物理层,通过网络再到另一个电脑的物理层,而后一直传输到另一个电脑的应用层,从而成功接受信息。数据链路层:数据链路层协议(如以太网)接收来自网络层的数据包,并添加自己的头部信息,如源MAC地址、目的MAC地址等,同时也会添加尾部信息,如帧校验序列(FCS)。
2026-04-18 13:56:32
564
原创 网络原理1
IP地址描述了一个设备,在网络上的地址,生活中: 天津市张家窝镇XXX而在计算机中: 使用一个 32 位, 4 字节数字, 表示地址一般来说,我们会把 IP 地址给表示成 4 个 0-255 之间的十进制数字,并且使用 3个点进行分隔.点分十进制(192.168.2.100)在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的程序。简单说:端口号用于定位主机中的程序。类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)格式为:
2026-04-18 13:56:05
307
原创 文件操作-IO
文件描述符我们之前在讲解pcb时讲过,每个打开的文件都有一个唯一的文件描述符,它存储在顺序表中,一个进程每次用输入流输出流打开一个文件,就需要在这个表里分配一个文件描述符,而这个数组的长度是存在上限的,如果你的代码,一直打开文件,而不去关闭文件,就会使这个表里的文件描述符,越来越多,一直到把这个数组占满了,后续再尝试打开其他文件,就会出错了,导致系统崩溃,这也叫做文件资源泄露,非常类似于内存泄露。(字符流本质上是针对字节流进行的一层封装)所以如果上次读满了数组,下次再进行读写会直接覆盖上次读写的数据。
2026-04-18 13:55:43
196
原创 java之线程池
在前面我们都是通过new Thread() 来创建线程的,虽然在java中对线程的创建、中断、销毁、等值等功能提供了支持,一个线程的创建和销毁虽然消耗虽然小,但从操作系统角度来看,如果我们频繁的创建和销毁线程,是需要大量的时间和资源的,那么有没有什么开销更小的方法?1.直接创建/销毁线程,是需要在用户态+内核态配合完成的工作,对于线程池,只需要在用户态即可,不需要内核态的配合,这样开销就更小。2.等线程用完之后,线程池不会销毁该线程,而是让其阻塞,等下次用的时候会再次利用它,所以不用频繁的进行创建和销毁。
2026-04-18 13:55:26
208
原创 java之定时器
当创建 MyTimer 对象,调用无参构造方法时,便创建一个线程,循环执行从队列中取出任务的操作:取出队列中 “绝对时间” 最早的任务——如果当前时间 >= 此任务的时间(已经到达此任务的执行时间),便可调用run方法执行,执行完毕后从队列中删除;如果使用线程安全的队列,会导致代码中从 一把锁 变成 两把锁,很容易出现死锁的情况,比如持有和请求的情况(并非100%一定出现,但是需要程序员精心控制加锁顺序,使得编写代码的复杂度提高了。//比如,当前时间是 10:30,任务时间是 12:00,不应该执行。
2026-04-18 13:55:07
320
原创 java之阻塞队列
首先,我们上述代码中用的是if而非while,但是wait被唤醒的方法不止notify一种,它还可能被interrupt所‘唤醒’,这样的话可能队列还是空的或者满的就进行的取和入的操作,所以要用while,再进行一次判断,判断它是不是由于notify所唤醒。这样的判断,当t1进行读取内存中的数据的时候,t2可能刚修改完cpu中的数据,还没来的及去修改内存中的数据,这样的话,t1就还是原来的size,这个就是内存可见性的案例,所以我们可以在变量前面添加volatile进行修饰,来避免这个问题。
2026-04-17 08:15:04
275
原创 java之单例模式
在这三步中,第2、3步有可能会发生指令重排现象,创建对象的顺序变为1-3-2,会导致多个线程获取对象时,有可能线程A创建对象的过程中,执行了1、3步骤,此时经过线程的调度执行线程B,线程B判断instance已经不为空,然后return这个还未初始化的instance获取到未初始化的singleton对象,就会报异常。这些套路就是设计模式。指令重排序是指:JVM在保证最终结果正确的情况下,可以不按照程序编码的顺序执行语句,尽可能提高程序的性能。单例模式是一种经典的设计模式,是校招中最常考的设计模式之一.
2026-04-17 08:14:40
155
原创 java之多线程3
此时JVM就会怀疑,这个①号load 的操作是否还有存在的必要(节省开销),于是经过load试探很多次发现都是一样的,JVM索性就认为load 的值一直都一样(速度太快了,等不到我们scanner输入flag的值),在load一次后,寄存器保存了它的值,然后把load这个操作给优化掉,只留一个访问寄存器的操作指令,访问之前寄存器中保存的值,大大提高循环的执行速度。这段代码想要表现出来的效果是,t1,t2线程同时运行,通过t2线程中输入的flag的值来控制t1线程是否结束。
2026-04-17 08:14:22
355
原创 java之synchronized
如果用该代码,按照之前对于锁的设定, 第二次加锁的时候, 该线程就会阻塞等待. 直到第一次的锁被释放, 才能获取到第二个锁. 但是释放第一个锁也是由该线程来完成, 结果这个线程已经堵塞了, 也就无法进行解锁操作. 这时候就会 死锁.• 在同一个线程连续加锁时,每次加锁,锁的计数器加 1;第四点破除循环等待:约定好加锁的顺序,让所有的线程都按照约定要的顺序来获取锁。第四点破除循环等待:约定好加锁的顺序,让所有的线程都按照约定要的顺序来获取锁。其他线程必须等待当前线程释放锁后才能获取锁并执行代码。
2026-04-17 08:13:32
344
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅