- 博客(86)
- 收藏
- 关注
原创 【Java并发编程】对于Java线程池的一些研究
线程池是Java中利用池化技术创建一组线程来进行管理和复用的机制,目的在于提高系统的性能和保护CPU资源不会被耗尽。
2024-08-13 16:21:46
929
原创 在Java中利用GeoHash实现高效的‘附近xxx‘功能
GeoHash是一种高效的地理编码系统,它通过将地球表面划分为网格并用字母数字组合的字符串来表示每个区域。这种编码方法将二维的经纬度坐标转换为一维的字符串,使得地理位置的存储和检索变得更加简单。GeoHash的核心原理是将经纬度坐标转换为二进制,然后交替取位组合,最后转换为base32编码。这种方法的一个重要特性是,相邻区域通常会有相同的GeoHash前缀,这使得它非常适合用于快速查找附近位置。
2024-07-30 15:24:07
996
原创 学习网络系统的心得体会
PageCache实际上就是内核缓冲区,作用有两个,一个是缓存最近被访问的数据另一个是预读功能。读取磁盘的时候优先从PageCache里面找,有就直接返回数据,没有就从磁盘中读取然后缓存到PageCache中。举个例子,假如read方法每次只能够读取100k,虽然read刚开始只会读0100k的数据,但是内核会把后面的101200k的数据都给写入到PageCache中,这样就减少了与磁盘交互的次数。
2024-07-24 11:06:14
1050
1
原创 记一次使用“try-with-resources“的语法导致的BUG
在try块结束时,括号()中声明的资源会自动关闭,无需手动调用close()方法,也就是说不需要再使用finally来关闭资源。最近使用try-catch的时候遇到了一个问题,背景是这样的:当第一次与数据库建立连接以后执行查询完毕并没有手动关闭连接,但是当我第二次获取连接的时候报错了,显示数据库连接失败,连接已经关闭。这个时候也就真相大白了,原因就在于当第一次与数据库建立连接以后执行查询完毕并没有手动关闭连接但是由于使用了"try-with-resources"的语法所以已经自动关闭了数据库连接。
2024-07-05 14:28:42
684
原创 通过索引优化和缓存更新策略的实际应用快速响应百万级数据查询
最后选择的第三种方案,我觉得是最合适的,由于查询出来的数据量其实很少,只是查询花费的时间很多,所以使用定时任务每隔一个小时就跑一次数据,将数据存储在本地缓存里面,同时这张表的数据是更新的频率比较低,所以缓存和数据库数据不一致的问题虽然存在,但是发生的概率比较小。通过这样的做法,查询全国的数据接口的响应时间直接降低到了300ms以内。统计全国的数据,原本的方案是首先获取到所有的父类类型,然后再去查父类类型下所有拥有的子属性,也就是自身对应的属性,然后再去根据地区来进行统计父类属性和子类属性的数量。
2024-07-02 14:38:55
451
原创 阅读源码解析dynamic-datasource-spring-boot-starter中是如何动态切换数据源的
dynamic-datasource-spring-boot-starter是苞米豆提供的一个动态切换数据源的工具,可以帮助企业或者个人实现多数据源的切换,这里通过阅读源码的方式解析是如何动态的切换数据源的,采用的版本是3.5.1。
2024-06-11 17:33:47
956
4
原创 关于Git的commit message规范
前几天在提交代码的时候突然发现自己的commit message写的有点问题,然后到网上查了下发现Git的commit message也是有规范的,下面我总结了三条我认为最重要的。:重构(即不是新增功能,也不是修改bug的代码变动)3.避免过于笼统的使用"fix",而是要。1.commit message需要。:文档(documentation): 格式(不影响代码运行的变动):新功能(feature):构建过程或辅助工具的变动。您修复的是什么问题或bug。
2024-05-07 20:02:49
538
原创 造成并发安全的三大源头:可见性、原子性、有序性
线程2也进入到if (demo3 == null)这个判断中,此时线程2发现demo3不为null了直接返回demo3,但此时的demo3还没有初始化完成,所以线程2返回的demo3对象是不完整的,也就导致到线程安全问题。此时假设线程1和线程2同时想要创建demo3这个对象,线程1先进入到if (demo3 == null)这个判断中以后线程1执行1、3还没有执行2的时候,时间片刚好用完切换到线程2执行任务。一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为。程序按照代码的顺序执行叫做有序性。
2024-04-22 23:52:53
449
1
原创 如何通过Elasticsearch实现搜索的关键词达到高亮的效果
方法返回一个 Text 对象数组,每个 Text 对象表示高亮字段中的一个文本片段,最后将其中的文本片段拼接成一个字符串,最终存储到结果对象的相应属性中,最后实现高亮效果。方法返回一个包含文档中高亮字段的映射,然后从高亮字段映射中获取名为 “SUBJECT_NAME” 的高亮字段(也就是题目名字),从高亮字段中提取相关的文本片段,凸显了“高亮效果”。现在有一个场景:输入相关的面试题题目返回的结果中题目出现高亮效果,类似这样的效果。在设置好高亮的相关条件以后,就得从ES中查询相关的数据了并且处理相关的数据。
2024-04-01 00:20:14
1247
原创 快速熟悉ElasticSearch的基本概念
ElasticSearch是开源的分布式搜索和数据分析引擎,它专门用于处理大规模的文本数据和实现高性能的全文检索,如果有要实现搜索的场景,那么ElasticSearch是一个很好的选择。
2024-03-25 22:37:22
515
原创 如何在linux环境上部署单机ES(以8.12.2版本为例)
然后进入到jvm.options中进行运存的配置,不配置很有可能把服务器的内存吃满导致启动失败,我这里设置的是1gb大小,大家可以根据自己的实际情况来进行配置。这个时候就已经配置好了,现在要创建另一个对象然后去启动ES,因为ES官方处于安全考虑不允许root用户启动ES。这将创建一个名为 myuser 的用户,并且 -m 选项会自动创建用户的家目录。创建用户:可以使用 useradd 命令来创建用户。切换用户:可以使用 su 命令来切换到新创建的用户。切换到这个用户之后进入到 es 的文件夹。
2024-03-22 09:41:48
1261
原创 使用gradle工程打包失败-Execution failed for task ‘:test‘的解决方案
把这段代码输入进去,表示打包跳过test。再次build就能够成功打出jar包了。这个错误通常表明测试任务执行失败。首先找到gradle。
2024-03-19 11:55:13
1037
原创 在Java中使用Float或者Double而导致的精度丢失问题是如何产生的?
其中float表示的32个比特位,第1位为符号位表示正数还是负数,第2位到第8位表示指针数,剩下的表示有效数字,而对于double来说,第1位为符号位表示正数还是负数,第2位到第13位表示指针数,剩下的表示有效数字。假如说是0.2那么在有效数字位里面存储的就应该是0011-0011-0011-0011...这样无限循环下去,但是由于存储有效数字位有限也就导致了不能完整的存储无限循环的0011-0011-0011-0011...换句话说float能表示32个比特位而double能表示64个比特位。
2024-03-17 17:15:41
566
原创 gradle工程报错:Caused by: java.lang.NoClassDefFoundError: org/gradle/api/plugins/MavenPlugin
当你的build.gradle文件里面的东西都是正常的时候但是还是报这个插件异常的错误可以试试我这个方案。首先下载好一个gradle到本地,找一个文件夹存着然后打开setting。然后配置好再重新build一下,就可以成功解决了!
2024-03-15 15:34:00
1877
原创 使用CompletableFuture在主线程捕获子线程异常
其作用是返回一个新的CompletableFuture,如果原CompletableFuture以异常的方式完成,则使用提供的方法来计算新CompletableFuture的值。场景:我们使用线程池的时候,假如说某个线程出现了异常此时我们需要将异常捕获打印出相应的异常日志。这个时候就可以用到CompletableFuture的。exceptionally方法,下面给出代码演示一下。
2024-02-19 00:53:19
1445
原创 left join 和 right join 以及 inner join 之间的区别
right join 是右连接,使用right join 连接两张表以后,会返回右表中的所有字段以及左表中所匹配的信息。left join 是左连接,使用left join 连接两张表以后,会返回左表中的所有字段以及右表中所匹配的信息。可以看到,返回了左表中的所有信息以及右表中所匹配的信息,如果右表中没有与之匹配的信息就会以null进行代替。inner join 相当于 join,都是内连接,会返回左右表中所匹配的信息。test2中字段如下。test1中数据如下。test2中数据如下。
2024-02-03 00:05:09
529
原创 Java中的Map和Set
在Java中Map和Set分别是两个不同的接口对于Set来说,Set上面还有Collection这个接口,而对于Map来说,上面就没有接口了在这两个接口下面分别实现了一个有序的接口,sortmap和sortset,而在这个接口下面又分别有两个实现类一个是treemap,一个是treeset。同样的在set和map这两个接口下面也有两个实现实现类,一天个是hashset,一个是hashmap。配合这张图可以有更加清晰的认识。
2024-01-28 17:29:45
443
1
原创 Redis的五种常用数据结构以及其底层实现
Redis中列表是用于存储多个有序的字符串的,这些字符串被称作元素,一个列表最多可以存储2^32 - 1个元素。这些元素是有序的,同时这些元素也是可以重复的。字符串作为Redis中最基础的数据结构,他存储的值可以是任何东西,可以是字符串,数字,二进制,但是字符串存储的值不能超过512M。相比较与集合,有序集合增加了分数,帮助集合来进行排序操作,提供了指定分数,元素范围查询,计算排名等等操作。在Redis中所有的数据都是以键值对的方式存储的,那么哈希在Redis中指的是值以键值对的方式进行存储。
2024-01-28 16:50:21
796
原创 为什么重写equals以后要重写hashcode方法?(通俗易懂)
来说,首先验证两个对象的地址是否相同,如果相同直接返回true,如果不同那么就将这个对象转换成相同的对象进行比较,然后再对值进行对比来确认是返回true还是false。我们点开源码可以发现实际上还是比较两个对象的地址,所以当我们自定义一个类的时候需要重写这个类的。又是为了应对集合类的使用而创建的,用于找到对应的集合中对应的位置后进行添加查找等一系列操作。实际上还是比较的是内存地址,所以当我们自定义一个类以后需要重写这个类的。但是如果我们自定义一个类的话,不重写这个类的的话,是怎么样的呢?
2024-01-12 22:06:37
509
原创 如何使用工厂加策略模式干掉一大堆的if-else判断?
举个生活中的例子就是:洗衣机,洗衣机里面包含了不同的功能,有标准,快洗,脱水等等功能,这一个个功能就相当于不同的策略,通过洗衣机控制面板来调用不同的功能也就是不同的策略。手机是一个抽象产品,手机制造厂是一个抽象工厂,华为手机是一个具体的产品,华为手机工厂是具体的工厂,华为手机工厂只生产华为手机不会生产别的手机。策略模式的定义是定义一组算法,将每个算法封装起来,通过上下文使他们可以进行切换,策略模式让算法独立于根据使用他的客户变化而变化。工厂模式中每个工厂只生成一种具体产品,工厂模式里面分为四个角色。
2024-01-11 17:16:09
388
原创 使用MySQL来进行查询,当输入一条查询语句会发生什么?
我们把不涉及到操作数据的部分称作MySQL server功能,把操作数据的部分称作存储引擎功能。当我们使用MySQL作为数据库的时候,输入从客户端输入一条查询语句。存储引擎有各种API供MySQL server进行调用。
2024-01-10 16:52:29
459
原创 解决Redis序列化乱码问题
如果我们使用原生的JDK序列化,那么当我们将数据存储到Redis中就会出现乱码的情况。为了解决这个问题我们需要重写RedisTemplate从而解决序列化乱码问题。添加完这个配置类以后再使用RedisTemplate就不会出现乱码的情况了。
2024-01-03 20:01:48
914
原创 Undo Log 、Binary Log、Redo Log之间到底有什么区别?
Undo Log是用于数据库事务的回滚的,同时也是实现MVCC的也就是说Undo Log既保证了事务的原子性也保证了数据库的隔离性Binary Log 包含了数据库中执行过的写操作的SQL,所以更适合用于备份以及主从复制通过Redo Log可以保证在数据库突然发生崩溃的时,将数据恢复到最近一次事务提交的状态,从而保证事务的持久性由于Redo会不断地擦除一些已经写入到磁盘的数据,所以也就解释了为什么所有数据全部删除时,这个时候就得请出我们的Binary Log而不是我们的Redo Log了。
2023-12-28 11:13:42
946
原创 当使用mapstruct进行类型转换时Converter接口的实现类不自动生成代码的解决方法
然后再创建接口发现成功生成对应的类型转换!说明应该是缓存的锅,把缓存删了就好了。当我想使用Converter接口生成类型转换时发现并没有自动生成。尝试了各种方法,包括rebuild project等等都没有用。
2023-12-25 15:10:30
1249
原创 MybatisPlus报错:BindingException: Invalid bound statement (not found): 的解决办法
我这里路径写错了导致我的mapper并没有被扫描到,正确的写法应该写为。在mybatisplus中使用MapperScan来扫描mapper。当我们遇到这个报错的时候,通常意味着mapper的绑定出现了问题。后面怀疑是mapper没有被扫描到检查启动类 发现果真如此。本人使用MyBatisPlus时遇到了这个问题,再检查namescape发现也是正确的。我们需要检查相关的配置文件是否正确。通过检查映射发现没有问题。修改完成以后正常运行。
2023-12-20 16:17:53
713
原创 JVM快速入门
双亲委派模型的过程是:从下向上不断的检查该类有没有被加载过,如果没有就继续交给上一个类,不断检查。然后再从上到下不断地尝试去加载该类,只有当该类在自己的加载目录底下的时候,这个类才能被加载。
2023-12-20 10:37:46
1123
原创 log4j2的记录流程介绍(附log4j2日志的xml配置文件)
在配置文件中我们看到有logger、appender等等标签,他们具体是做什么用的?下面我就来介绍log4j2的记录流程:首先logger就是用来记录日志的,我们可以在logger的标签内说明要记录哪些日志,日志等级这段代码就表示logger要记录mybaits的日志,只记录info及以上等级的日志那么additivity是用来做什么的?这时候就要引出这个标签了。
2023-11-28 16:26:18
662
原创 No mapping for GET /swagger-ui.html的解决方法
我在配置文件设置了访问静态资源的路径,导致了在加载的时候在static包底下找不到相关页面。分析:由于之前能够打开,所以排除是配置类出现问题,根据提示。由于一直找不到页面,所以怀疑是配置文件有问题,果然。直接给这段配置文件的代码屏蔽就好了。我的Swagger配置类。
2023-11-22 17:37:25
1447
原创 java: 程序包XXX.XXX.XXX不存在解决方法
怀疑是拆模块以后引入相关包没有将相关包下载到本地maven仓库中。解决办法:先clean删除以前的编译结果,为重新编译做好准备。最后将相关包下载到本地maven中。明明已经引入了相关包。然后将相关包重新打包。
2023-11-16 21:19:14
458
原创 使用JDBC连接数据库出现The server time zone value ‘�й���ʱ��‘ is unrecognized 的解决方案
看到网上的大佬们说是引入的依赖版本太高所以导致了时区有问题。用另一种办法直接在配置文件中修改url然后成功解决。后面把这段代码删了发现但还是报错。但是我把依赖的版本改低了还是报错。一开始以为是我设置时区。
2023-11-14 16:43:35
554
原创 Redis实现消息队列
消费者可以订阅一个或者多个Channel,从Channel中获取数据,当生产者向Channel发送数据的时候,所有的消费者都可以接收数据。但是使用list作为消息队列也有弊端 - 不能实现广播功能,只能单对单的进行消息队列。但是使用PubSub作为消息队列也有弊端 - 当消息堆积以后会造成消息的丢失。stream是Redis引入的新的消息队列,是功能比较完善的消息队列。可以从头部插入数据然后从尾部取出数据,从而实现消息队列的效果。当然我们也可以创建一个消息组,利用消息组来处理消息。下面来演示一下怎么使用。
2023-10-25 11:00:09
389
原创 Redis实现分布式锁
分布式锁是满足分布式环境或者集群环境下多进程可见并且互斥的锁,分布式锁的核心思想就是让,这样就能够锁住线程,让线程能够执行分布式锁满足一些条件:可见性/高性能/互斥/高可用/安全性。
2023-10-23 20:07:31
275
原创 Redis常见问题的解决方案(缓存穿透/缓存击穿/缓存雪崩/数据库缓存数据不一致)
加互斥锁或分布式锁:在访问热点数据时,可以引入互斥锁或分布式锁,保证只有一个线程去访问后端服务或数据库,其他线程等待结果。虽然还是会有线程安全问题 比如 假设此时缓存刚好失效了 线程1 查询缓存失败 从数据库读取了旧数据 还没写入缓存的时候 被调度到 线程2执行。 对于一些热点数据,可以将其设置为永不过期,或者设置一个较长的过期时间,确保热点数据在缓存中可用,减少因为过期而触发的缓存击穿。线程2操作完了以后执行线程1 线程1将读到的旧数据写入到缓存 此时九出现了缓存不一致。的 所以说可以忽略不记。
2023-10-22 20:06:57
713
原创 一篇文章带你搞懂 单调栈 是怎么回事
单调栈实际上就是一个栈,他的作用就是存储我们遍历过的数字。当我们遍历数组的时候,遍历到后面的数组后并不知道前面遍历过的元素是什么,所以单调栈的作用就是用于存储遍历过的数字。最后要我们返回的是该日究竟在几天后才会出现温度更低的情况,所以我们的返回数组里面存放的是距离。首先明确两点:1.栈内元素是单调递增 (从栈底到栈顶)2.栈内存放的是数组的下标。介绍完单调栈的本质以及使用的注意事项以后就来介绍一下。了解完怎么使用单调栈以后就来看看常见的单调栈题目了。那么也就是寻找下一个更小的元素那么我们就使用单调栈。
2023-10-18 11:46:27
135
原创 一篇文章带你用动态规划解决股票购买时机问题
那么很自然的我们就想到了使用动态规划的思想来解决问题,接下来就根据动态规划以及解题的核心思想来解决 股票购买时机问题。第二次持有是第二题的思路,因为此时买卖股票需要结合上一次买卖股票的状态来决定(多次买卖股票)注意我们在初始化的时候是从 i = 1 开始的 也就是说 第一次持有股票时的状态还是。首先由持有状态 不持有状态(保持不持有状态,前一天是冷冻期状态) 冷冻期状态。本题遇上一题最大的不同就是可以多次买卖股票了,大题思路和上一题是差不多的。持有状态可以由不持有状态和冷冻期状态进行推导,它可以是。
2023-10-14 18:11:24
231
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人