- 博客(73)
- 收藏
- 关注
原创 使用原生Redis完成分布式锁
线程1获取到锁之后,在执行业务的时候时间太长,导致redis自动消除了数据完成了锁的释放,然后线程2获取到锁开始执行业务,这时线程1执行完成开始释放锁,这个时候会导致线程1释放了线程2的锁,然后线程2释放线程3······。先查看redis中是否存有对应的商品ID,如果没有对应的id,就可以使用redis的set命令对redis中添加数据,添加数据的键为对应商品的ID,值为获取的雪花ID。整个业务最重要的就是如何获取锁和释放锁,要保证整个过程不会出现任何的并发问题(两个线程拿到同一个商品的锁之类的)。
2024-11-07 23:18:11 444
原创 学习索引时想到的问题
答:数据库会先评估怎样使用索引是最快的(两个单独的索引和一个包含两个字段的复合索引会使用复合索引而不是用两个单独的索引,也有可能会使用一个索引,取决于在当时的环境),然后根据(这里使用两个单独的索引)第一个单独的索引进行查询然后使用另一个索引进行查询,最后进行回表。答:如果把全部字段都放在复合索引中,在查询的时候会比不添加索引快,但是要对索引进行维护所以在插入、删除和修改的时候会比较慢,维护索引的时间会比较长而且哪怕是这样搜索也不是最佳选择,所以不常用,要保持复合索引中的字段尽可能的简洁。
2024-10-16 01:31:26 358
原创 Vue学习
pinia提供了pinia-plugin-persistedstate插件来对数据进行持久化处理,我们如果需要数据长时间保存那么我们只需要对数据进行一个标记,pinia-plugin-persistedstate插件就会自动的帮我们保存这个数据(保存的原理是将数据保存在了浏览器的。类似于javabean中的set方法,如果需要改变State中的数据,推荐尽量对于任何的对State中的数据都要通过Mutations提交进行改变,Mutations是同步的。然后在main.js中把pinia在全局引用。
2024-09-13 01:38:24 589
原创 暑期知识总结
前端和后端的拦截器,双token,文件上传,文件下载,三层架构,通过注解和反射来包装servlet对请求进行分发,通过注解对对象进行注入,websocket,推荐算法(协同过滤算法).使用servlet根据自定义注解对请求自动分发,对参数自动注入,对返回的数据进行自动序列化。在没有使用Websocket之前,前端和后端之间的数据都是通过http协议进行的。http协议是单工的,他只允许前端向后端发送数据,后端无法主动发送数据到前端,如果需要实时更新就只能使用轮询(轮询效率极低所以)。
2024-09-10 22:55:43 848
原创 2024下学期学习总结加今日学习总结
仔细想来下半年好多事情要做啊:每天要抽时间锻炼、要学spirngboot、要写项目、还要考四级,这个学期要是把这些任务都完成了就成了时间管理大师了,这个springboot项目需要写好一点,争取写出令自己满意的项目。要在这个学期结束之前把能力加强到可以写出一个令自己满意的项目,这样才可以面对明年初的比赛。在下个学期到来之前把《Java核心技术卷》、《并发编程的艺术》、《设计模式之美》这几本书给看了对于书中的知识要多去思考把每个知识点都去想一想别的优化或者平替方法,再去学习java虚拟机。
2024-09-08 23:23:47 342
原创 Spring boot
SpringBoot实现拦截器需要类去实现HandlerInterceptor接口,实现其中的preHandle、postHandle、afterCompletion方法@Override// 处理请求前逻辑System.out.println("被拦截到了");// 返回 false 会阻止请求继续// 处理请求后逻辑,但在视图渲染之前// 完全请求处理后执行。
2024-09-05 23:19:01 1011 3
原创 Vue学习
Vue.js(读音 /vjuː/, 类似于view)是一个构建数据驱动的 web 界面的库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
2024-09-03 22:40:03 1615
原创 java通过jwt生成Token
JWT(JSON Web Token)简而言之,JWT是一个加密的字符串,JWT传输的信息经过了数字签名,因此传输的信息可以被验证和信任。一般被用来在身份提供者和服务提供者间传递被认证用户的身份信息,以便于从资源服务器获取资源,也可以增加一些额外的业务逻辑所需的声明信息。
2024-07-15 01:08:34 446
原创 Cookie和Session
如果设置了 Domain 属性,浏览器在发送 HTTP 请求时,会检查请求的域名是否包含在该 Cookie 的 Domain 属性中,如果包含,则浏览器会发送该 Cookie。定义:Cookie是存储在用户计算机上的小型文本文件,由服务器发送给客户端(通常是Web浏览器),然后客户端会将Cookie保存并在每次请求时发送回服务器。如果设置了 Path 属性,浏览器会检查请求的路径是否包含在该 Cookie 的 Path 属性中,如果包含,则浏览器会发送该 Cookie。常用于跟踪用户的会话状态。
2024-07-12 02:04:30 505
原创 Axios
SqlSession 对象是线程不安全的,因此它的最佳实践是在每个请求或线程中创建一个新的 SqlSession 实例,并在执行完数据库操作后关闭它,以确保资源的正确释放和避免潜在的资源泄漏问题。在浏览器中所有的连接都是短链接,如果在网站中有登录的操作,那么服务器就很难根据不同的用户展示不同的数据,因为服务器无法识别每一个用户。cookie相当于给每一个用户发送了一个身份证,在拥有身份证以后每一个用户在访问服务器获取相应的数据时都携带上自己的身份证以便服务器进行识别。请求指定的页面信息,并返回实体主体。
2024-07-10 00:56:58 637
原创 axios和Mybatis
发送 PUT 请求通常用于更新服务器上的资源。在这个例子中,我们向发送了一个 PUT 请求,更新了 ID 为 1 的文章数据发送 DELETE 请求通常用于从服务器删除资源。在这个例子中,我们向发送了一个 DELETE 请求,删除了 ID 为 1 的文章。以上使用的都是别名。MyBatis 是一个持久层框架,专注于将 Java 对象与关系型数据库的记录进行映射,通过 XML 或注解配置 SQL 查询语句,简化了与数据库的交互过程。
2024-07-08 01:33:35 482
原创 【无标题】
Servlet 容器根据请求中的 URL 或其他条件找到对应的 Servlet,并创建一个 Servlet 实例(第一次使用ervlet时)。继承servle必须重写三个方法(init、service、destroy),init方法在创建servlet对象的时候会调用并且只会调用一次,service方法在每一次被访问的时候都会去调用,destroy方法在释放servlet对象时运行。Flexbox(弹性盒子)是一种用于布局设计的 CSS 技术,它提供了一种更加灵活的方式来组织、对齐和分布容器中的项目。
2024-07-05 08:05:50 400
原创 7.2学习总结
java是动态加载的语言,因为设计者并没有限定Class一定是从磁盘来的,也可能是网络,也可能是压缩包,总之Class是符合规则的二进制代码就行,剩余的建立对象的任务都会交由JVM虚拟机来建立,而且每个Class一定是独一无二的.所以反射最重要的用途就是开发各种通用框架。记住,用这三种方法获取的Class永远的只能获取且仅有的一个,所以这三种方式获取的Class类都是一致的(内存地址相同)答:Class是一个类,小写的class代表这是个类型,大写的Class代表了这个类的名称。
2024-07-03 01:48:15 353
原创 JavaScript
在建立JSON格式的字符串之后无法直接的进行使用要使用JSON.parse()函数把字符串变成JSON对象才可以作为对象进行使用,如果重新转化为字符串也需要使用相应的函数JSON.stringify()把对象转化为字符串。使用起来很像双列集合,都是一个key对应唯一一个value,但是JSON对于不同数据类型的value有不同的格式要求,这点在使用的时候需要注意,要牢记value对于不同的数据类型的格式要求。- location对象提供了当前URL的信息,并允许你重定向浏览器到新的URL。
2024-06-20 23:40:40 685
原创 HTML学习和JAVAScript学习
Javascript对变量类型的要求不高变量可以存放不同类型的值,所以统一使用。和java大致一样,有小部分不同就是每行代码结尾的分号可有可无。输入用户名和密码点击提交之后数据会显示在url之后,可以被看见。cellspacing:规定单元之间的空间。外部js文件的后缀名要求是.js。定义表格的行,必须嵌套在<table>中。js中的数组的特点是长度可变,类型可变。定义标题单元格,必须嵌套在<tr>中。定义表格整体,可以包含多个<tr>width:规定表格的宽度。定义单元格,必须嵌套在<tr>中。
2024-06-18 22:58:08 326
原创 javaweb和Mysql学习
在绝大多数情况下,我们不需要在使用索引时去操心使用什么索引类型比较好,数据库会自动的根据你创建的索引和查询的需求来选择合适的索引类型,我们只需要专注于创建合适的索引。当你执行查询语句时,数据库引擎可以利用索引来快速定位符合条件的数据行,从而减少了数据检索的时间。空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少。不同的数据库管理系统支持不同类型的索引,每种索引类型都有其适用的场景和性能特点。如果不加 CREATE 后面不加索引类型参数,则创建的是常规索引。
2024-06-13 23:55:01 415
原创 6.9学习总结
先开起事务(标记一个事务的开始),然后执行想要在一个事务中运行的语句,最后可以根据情况选择提交事务(事务运行成功,数据改变)或者回滚事务(事务运行失败,数据回到开始事务之前),至此一个事务结束。幻读:一个事务读取到了另一个事务中已提交的插入或者删除的数据。不可重复读:一个事务读取到了另一个事务中已提交的被改变的数据,导致了对同一条数据进行多次查找得到不同结果。脏读:一个事务读取了另一个事务中未提交的数据,导致得到了不一致和不准确的数据。多个事务同时运行时,一个事务读取到了另一个事务未提交的数据。
2024-06-12 07:33:34 488
原创 6.6学习总结
ignore关键字:在使用update和insert关键字进行多列修改时只要有一列的修改数据出现错误那么整个update语句的修改都会被撤销(已被修改的数据会被回溯成没有修改之前的值),为了在出现错误时也可以进行修改,遇到重复插入可以不进行插入,就会使用到ignore关键字,可以使update和insert在发生错误时也可以运行。注意:不同类型的引擎之间的表不能混合引用,即使用一个引擎的表不能引用具有使用不同引擎的表的外键。这样插入的数据会根据你的给出的顺序插入,如果想只对最后一个数据进行插入就很难做到。
2024-06-07 00:28:00 987
原创 数据库学习总结
函数说明AVG()返回某列的平均值COUNT()返回某列的行数MAX()返回某列的最大值MIN()返回某列的最小值SUM()返回某列值之和例:AVG函数:COUNT函数:MAX函数:MIN函数:SUM函数:以上的五个函数都有以下用法对所有的行执行计算,指定ALL参数或不给参数(ALL为默认)只包含不同的值,指定DISTINCT参数如果指定列,那么distinct只能用于count函数,且distinct只能用于列名。例:(X)(√)
2024-06-02 23:09:59 952
原创 Mysql学习
单个字段:select 字段名 from 表名;多个字段:select 字段名,字段名 from 表名;搜索多个字段时,字段名之间使用逗号隔开所有字段:select * from 表名;搜索所有字段时使用 '*' 替代字段名搜索不同的行:select distinct 字段名 from 表名;distinct关键字必须放在所有的字段名之前,不能放在部分的字段名之前;限定返回结果的行数:select 字段名 from 表名 limit 行数;
2024-05-30 22:29:02 1137
原创 5.28学习总结
hashcode():在Object里这个方法是通过返回地址的整数值来生成哈希值。equals():在Object里这个方法是通过比较他们的内存地址来确定两个对象是否相同。hashcode的时间复杂度为O(1)(因为只要计算一次哈希值就行了),equals的时间复杂度为O(n)(因为要比较每一个值),所以在比较是否相同时要优先使用hashcode方法获取的值是否相同。当输入样本量足够大时,不相同的对象调用hashcode是会产生相同输出的,也就是形成哈希冲突。
2024-05-29 01:02:13 473
原创 复习java5.26
String类是不可改变的,在保存字符串时使用的是byte数组来进行存储的,而这个数组是使用final进行修饰的,所以String类是不可以改变的,对String类进行+运算则是生成了一个新的变量。继承:从已有的类中派生出新的类(新的类继承旧的类,旧的类叫做新的类的父类),新的对象具有父类的属性和方法并可以具有自己独有的属性和方法,java中继承是单继承(每一个子类都只能有一个直接的父类)如果传输的是对象,那么传输的是对象引用的副本,在方法中改变对象的值,那么对象引用的值也会和方法中一样。
2024-05-26 22:43:37 1339
原创 java学习和项目总结
JRE:JRE是Java 运行时环境,主要包括了两个运行需要的组件:JVM 和 Java 核心类库,如果不进行java开发只想运行就可以只下载JRE。而Java语言,它的代码会先通过javac编译成字节码,再通过jvm将字节码转换成机器码(0和1)执行,即解释运行和编译运行配合使用,所以是混合型。在程序运行之前,通过编译器将源程序编译成机器码可运行的二进制,以后执行这个程序时,就不用再进行编译了。JVM:JVM是java进行编译的虚拟机,是Java 能够跨平台运行的核心。特点:执行速度慢、效率低;
2024-05-24 02:08:26 973
原创 学习通项目总结:
暴露出来的需要加强的:自我学习能力太差,java的基础知识不牢固(看书做笔记看资料),对数据库的使用掌握的太少了(看Mysql必知必会),对项目的结构与规范不了解。选择题,先要能保存做题目的进度,老师那边要提供正确答案每一题的分数,所有的题目都要显示正确的答案、错题集(选择题)、老师可以修改学生的签到状态。4.对数据库的认识太少了,就只使用了最简单的增删改查,相关的知识点了解的太少。5.对项目的结构没有一个很好的认识,导致在完成功能点的时候走了很多的弯路。2.只是做了基础的功能点没有自己的想法(没有创新)
2024-05-22 00:59:45 204
原创 5.15项目进度总结
实时显示的思路:在登录后开一个线程用一个socket去链接服务端并查询需要实时的信息,同时服务端把这个socket记录下来(标记为用来更新状态的socket),然后客户端就可以进入循环开始等待服务器发送消息了,服务端只要一但进行了需要同步消息的操作就判断该操作是否需要客户端进行更新数据或是只需要跳出提示框,若要更新就向所有最先记录的socket发送一个消息”让他们来服务器更新消息“。今天完成了随机选人和实时显示的功能(还需要维护),使得程序可以对用户的操作进行实时的显示。
2024-05-15 01:44:33 298
原创 5.13总结
在登录后开一个线程用一个socket去链接服务端并查询需要实时的信息,同时服务端把这个socket记录下来(标记为用来更新状态的socket),然后客户端就可以进入循环开始等待服务器发送消息了,服务端只要一但进行了需要同步消息的操作就判断该操作是否需要客户端进行更新数据或是只需要跳出提示框,若要更新就向所有最先记录的socket发送一个消息”让他们来服务器更新消息“。这个问题是使用同一个ObjectOutputStream和ObjectInputStream向一个地方进行多次写入后读取时信息不对等导致的。
2024-05-13 15:40:52 211
原创 项目总结和图
发布资料:在客户端获取到文件的地址之后创建一个资料的实类来保存资料的详细信息(编号、名字(包括后缀)、对应的班级编号、文件大小),把这个实类发送到服务端服务端把从实类中把信息提取出来然后保到对应的表中,客户端通过获取到的地址把这个文件发送到服务端,服务端接收并将其保存到对应的文件夹下,接受完毕后服务端发送一个信号发送给客户端。注册:用户自由设置密码、邮箱、昵称和真实姓名(正则判断)注册成功后显示使用雪花算法获取到的账号,邮箱获取到验证码之后一分钟内不能再点击,验证码五分中内有效。自动获取老师id和姓名。
2024-05-11 11:28:30 357
原创 【无标题】
fxml文件中的JavaFX控件在Java文件中绑定,在Java类的构造函数中还没有初始化,所有的控件还都是null,如果Java类实现了Initializable接口,则在构造函数之后自动调用Initializable接口的方法,此时JavaFX控件已经初始化,就可以可以进行设置了。先在服务端用一个集合将需要的数据从数据库里提取出来,再将这个集合通过网络传输到客户端最后使用ListView的方法将它显示出来就行了,难的是如何双击对应的ListView的行来进入对应的课程页面。
2024-04-29 01:12:59 222 2
原创 java4.23学习总结
下载两个发送邮件的包并导入到java:activation-1.1.1.jar,javax.mail.jar;然后我们只要通过类名来调用这个类中的sendEmail(to)静态方法就行了。
2024-04-23 23:47:43 272 2
原创 JDBC学习
PreparedStatement是Statement的升级版作用是预编译SQL语句并执行,防止恶意的SQL注入;executeQuery(sql):用来执行查询的操作,查询的结果借助ResultSet对象来访问;Statement唯一的作用就是用来执行SQL语句,在使用是还有被恶意SQL注入的风险。这个方法用于与数据库建立链接,参数分别是数据库的地址,用户名,用户的密码;这一行的作用就是注册Mysql驱动(把我们下载的jar包加载到内存里去)getXxx(参数):参数是你需要的数据表的字段。
2024-04-21 23:45:29 418
原创 4.18学习总结
现在有两条线程在运行,其中一条线程可以创造一个特殊的数据供另一条线程使用,但这个数据的创建也有要求:在同一时间只允许有一个这样的特殊数据,那么我们要怎样去完成呢?如果用普通的多线程在理想环境下(也就是两个线程分别每个抢到一次)可以完成,但是很多时候没有这么美好,如果任意一个线程连续运行就会发生错误。我们可以让线程在运行的时候去判断这个特殊数据是否存在,然后再去根据这个结果去运行程序或是放弃占用CPU让另一个线程运行就行了。该程序实现了多个客户端与服务端的多次通信。
2024-04-19 00:20:10 504
原创 4.14java学习总结
注意:每一个要被序列化写入文件的对象都要实现Serializable这个接口,实现这个接口不需要去重写任何方法,仅仅只是做一个标记而已,在做这一个标记的时候,系统会根据类中所有的内容来自动的分配一个唯一的long类型的记号,序列化和反序列化就是根据这与这唯一的记号进行的,当类发生变化的时候记号也会发生改变,这是因为文件中的记号与java中的不匹配就会报错。在这里我们发现输出跟我们想的有点不一样,在写代码最后的,输出“主线程”的语句反而第一个运行,这跟java的线程的实现有关;
2024-04-14 23:22:56 1259 1
原创 4.11java学习总结
因为不同平台的换行符号是不一样的(mac:\r,windows:\r \n,Linux:\n)这个方法会自动根据你所使用的系统自动的去输出换行符号。除了创建对象有点不一样其他的使用都是和FileInputStream、FileOutputStream一样的在此就不过多介绍了。缓冲区大小为8192(char),运行速度没有得到显著的提升,主要是多了两种特有的方法。其他的和FileReader、FileWriter一样的。按每次获取的字节大小分为字节流和字符流.返回值为读取或的字节的个数。
2024-04-12 00:08:52 1026
原创 4.9java学习总结
Object是类结构中的根(顶级父类),几乎所有的类都是它的子类,所以所有的类都拥有他的方法,所以一般都要求使用之前重写Object中要使用的方法。3.如果Lambda表达式的方法体只有一行,(大括号,分号,return)(要省略必须一起省略)可以省略不写;Stream是一种工具类,借助Stream流可以让我们更方便的处理集合完成(筛选,排序等操作)中间方法的返回值为一个新的Stream流,旧的抛弃不用所以要用链式编程;Lambda表达式只能简化函数式接口的匿名内部类的接口.
2024-04-09 23:28:53 1387
原创 4.6java学习总结
注意:1.泛型中不能写基本类型数据.2.指定泛型的具体类型后,传递类型时可以传递该类型或其子类类型.3.如果不写泛型,类型默认为Object.我们在程序中加入泛型//创建链表//添加数据//遍历集合里的每一个元素运行结果。
2024-04-07 23:41:26 384
原创 bfs例题
爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在 x1,y1 处,车站在 x2,y2 处。现在给出一个 n×n(n≤1000) 的地图,00 表示马路,11 表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(每两个相邻坐标间距离为 11)。
2024-04-07 19:28:32 346
原创 4.4java学习总结
数组能保存基本数据类型和引用数据类型,集合比他广泛,集合能保存数据类型(对象),但不能保存引用数据类型,要注意的是当保存的是基本数据类型时会自动将它装箱变成对象.写在成员位置,属于外部类的成员,与成员内部类相似只是多了一个static进行修饰,可以说它是一种特殊的成员内部类.其中只有int和char的包装类需要特殊记一下其它的包装类都是对应的基本数据类型的首字母大写得出来的.当要用数组保存的数据的数量未知时,就可以用集合来保存,集合会自动增加内存所以不会出现内存不够用的情况.
2024-04-04 23:08:47 745
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人