自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(131)
  • 收藏
  • 关注

原创 程序员失业日记4:半个月拿下4个offer

最后就在外贸公司和珠宝公司选择,两个公司都是大小周,(后面面试的公司基本都是大小周)无论是薪资还是福利方面,珠宝公司都更好,而且相对来说珠宝行业也比较稳定点,所以最后就选择了珠宝公司。断断续续终于写完几篇失业日记,最开始失业的不适应、迷茫,后面找工作的屡屡碰壁,一次又一次的失败。简历一遍一遍的修改,疯狂打招呼,疯狂投简历。

2024-08-30 09:56:47 662

原创 程序员失业日记3:工作真不好找

简历写的简单面试准备的不够找了一个月之后,才发现原来工作这么难找。前两年面试大厂或者中厂还有能有面试机会,虽然面试没过,但是起码还有面试机会现在是大厂、中厂都是消息已读不回,偶尔有一个小公司回消息,其他都是外包问了很多问题,就没有下文了。小公司面试也是各种挑剔。

2024-08-15 09:59:27 742

原创 程序员失业日记2:失业后迷茫

很多人喜欢工作摸鱼,只要自己多摸鱼,那自己挣的就更多。这句话一半是比较在理,但另外一半也不对。公司裁员,一般都是先裁这类员工。无论是升职还是跳槽,大部分时候还是看工作能力。在公司想要提高能力,就需要多思考,多总结。很多人上班就不会多思考,工作完成就行,没有总结就没有进步,每天就是重复昨天的工作。多做一点总结,分析,形成一套自己的解题思路。即使企业裁员,这样做的。

2024-07-09 13:46:21 668

原创 教你写一个电商商品排行榜功能

在某多 app 上,可以看到下面的小米手表排行榜:榜单是针对某类商品进行统计,比如手机排行是统计品类为手机的商品。排行统计可以是按照某一个维度,比如订单量、一个月回购量、或者几个指数汇总成一个分数进行排行。上图就是根据热卖指数进行排行。除了排行之外,还需要展示霸榜的天数,比如霸榜榜首 n 天、霸榜前三 n 天。上面排名第一就展示了霸榜榜首的天数。商品榜单需要根据不同的统计维度、参数、统计时间来设计商品榜单表结构。再根据配置的信息,生成榜单详情信息。一般都使用定时方式生成榜单详情信息。

2024-07-08 10:58:32 588

原创 程序员失业日记1:工作五年,交接半天

之前说过,放松时候的状态,才是人最舒服的状态,其实也是思考最深的状态。很多人即使在公司做了很多事情,也是很多繁琐、琐碎的事情。做工作总结最大的好处就是打破自我感觉良好的错觉,你以为你努力、勤奋、工作出色,当总结工作之后,你就会发现忙来忙去基本都是从同样的任务,也没有创造多大的价值。而面试时候经常问在上家公司的工作经历,其实就是问你的总结能力和思考能力。如果你对自己的工作,事后有产出、有总结、有思考,这样子面试成功的概率就高了很多。因为大部分人都只是忙碌的工作,每天加班到很晚,下班之后就想着放松玩游戏之类的。

2024-07-01 09:25:46 766

原创 EasyExcel 无法读取图片?用poi写了一个工具类

在平时的开发中,经常要开发 Excel 的导入导出功能。一般使用 poi 或者 EasyExcel 开发,使用 poi 做 excel 比较复杂,大部分开发都会使用 EasyExcel 因为一行代码就能实现导入和导出的功能。但是 EasyExcel 不支持图片的读的操作,本文操作如何实现图片的读和写的功能。在 EasyExcel 官网的可以看到 EasyExcel 是不支持读取图片的功能。

2024-06-24 07:30:00 1622 6

原创 递归在多级数据结构中的简单应用

评论,评论回复评论,其他评论再回复评论。企业部门,部门有子部门,或者公司有子公司。商品分类有一级分类,二级分类。多级数据结构需要解决两个问题,一个是查询所有数据,另外一个是查询部分数据,这两个都需要使用到递归的查询。查询所有数据比较少的数据,就可以查询所有的数据,从数据库查询到所以数据,按照添加时间的先后排序,再使用递归的方式将数据组装成一个树形结构。如果是评论的数据,就需要存储评论的等级,先分页获取一级的评论,再通过一级评论获取下级评论。查询部分数据。

2024-06-06 10:43:12 852

原创 从一个程序员的角度看东方甄选“小作文”事件

最近东方甄选“小作文”风波愈演愈烈,开始小编和观众吵架,后面东方小孙本来想要平息风波,而“摔手机”和泄漏董宇辉薪资待遇有激起更大的风波,导致东方甄选粉丝每天都几万,几十万的下降。作为一个消费者,开始是不太能理解东方甄选的这些骚操作。

2023-12-19 09:20:46 887

原创 如何实现异步通知的重试机制

请求的服务器挂了。网络发生了波动。服务器响应异常,服务重启。此时无法正确的及时推送通知,无法保证通知的可靠性。这个时候就需要重试多次,而且间隔要依次增加,因为服务启动或者网络的卡顿在经过一段时间就恢复了。后续重试成功的概率就更高了。定时重试定时重试首先不符合变化的间隔时间,间隔的时间是固定的,重试的任务都堆积在一起请求,这样也会给服务器造成很大的压力。而空闲的时候,服务器的利用率有比较低。同时请求,只能一个一个同步执行任务,同时执行的任务越多,延迟就越严重。定时任务 + 线程池。

2023-11-02 16:47:08 416

原创 离开了浪浪山,简直不要太爽

现在就业行情不太好,打工人还是需要有被裁员的准备。现在可能很多公司给打工人更多的压力。这时候就需要放平自己的心态,尽量把自己的工作做好。同时也要多做积累,多做输出,未雨绸缪。有工作的就好好工作,尽量提高自己的能力,能力提高了,才有有更多的成长。失业的也不要气馁,多投简历,降低消费。无论有没有离开浪浪山,都需要努力并自信的生活。

2023-10-12 07:30:00 194

原创 图解 LeetCode 算法汇总——二分查找

搜索有序的数组的元素,使用二分查找是一个高效率的查询方法。定位左右两侧最大值和最小值,找到中间值。然后通过目标值和中间值做对比,缩小搜索范围,直到搜索找到符合条件数据。有时候无需全部有序,两部分有序也是可以通过二分查找找到符合要求的数据。

2023-09-19 16:15:35 363

原创 图解 LeetCode 算法汇总——双指针

双指针算法是一种常用于解决数组或链表相关问题的算法技巧。该算法通常涉及到使用两个指针(索引),它们可以从数组或链表的不同位置出发,根据问题的要求,以一定的方式移动这些指针,从而在数组或链表上执行一些特定的操作。一般使用左右指针和快慢指针两种方式。

2023-09-18 10:04:34 423

原创 图解 LeetCode 算法汇总——回溯

回溯算法尝试在问题的解空间中搜索可能的解,并在搜索过程中进行选择、撤销选择和终止搜索,直到找到解或确定无解为止。通常通过递归函数来实现回溯算法。在每一步,需要做出选择(选择一个分支)然后递归地探索该选择的结果。在递归返回后,需要撤销之前的选择,以便继续探索其他分支。使用条件语句或循环来控制选择的范围和条件。

2023-09-11 00:22:15 835

原创 图解 LeetCode 算法汇总——链表

链表相对数组来说,在定义的时候不需要确定好内存大小,因为链表的通过指针可以存储非连续空间的数据。链表的查询需要通过指针一个个找到对应的结点,而不能像数组一样通过索引直接找到对应的数据。在 JDK 中也会使用双链表,双链表更占内存,因为多了一个指针,带来的好处是查询数据可以从前往后查,也可以从后往前查,用空间换时间。反转链表反转指针方向,结点数据不会改变。

2023-09-09 00:56:22 431

原创 Java 设计模式实战系列—单例模式

单例模式一个最简单的一种设计模式,该设计模式是一种创建型设计模式。规定了一个类只能创建一实例。很多类只需要一个实例,这样的好处,减少内存的占用和 CPU 的开销,减少 GC 的次数。同时也减少对资源的重复使用。以生成订单系统的订单号为例,分别介绍几种单例模式。饿汉单例:线程安全,但不支持延迟加载,不使用也会占用内存,比较浪费内存。但是类加载时创建实例,可以及时的发现内存不足问题。懒汉单例:支持延迟加载,但是线程不安全。

2023-09-01 08:46:27 225

原创 TCP的可靠性之道:确认重传和流量控制

报文段序号和确认号每个报文都有序号和确认号,序号表示报文段第一个字节号,确认号表示下一个接收字节的序号。发送确认和重传机制每个报文段发送后,都会确认应答 ACK,表示已经报文段已经成功发送。当网络异常数据包无法达到时,就会触发重传机制。重传主要有两种方式:超时重传和快速重传。超时重传:设置一个定时器,超过时间未收到确认应答,就会重新传数数据包。这个重传方式周期比较长。

2023-08-22 11:21:56 967

原创 Java 设计模式实战系列—工厂模式

在 Java 开发中如果将对象的创建和使用耦合在一起,不利于后期的维护,这就需要引入工厂模式。工厂模式将对象的创建和使用分离,降低代码的耦合度。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。引入工厂模式之后,调用方无需关注对象的创建过程,根据传参调用对应的实例对象,后续新增或更新对象只需要修改工厂方法即可,降低代码的维护成本。

2023-06-30 08:52:46 616

原创 Java 设计模式实战系列—策略模式

定义一系列的算法,把每个算法封装起来, 并且使它们可相互替换。根据调用者传参来调用具体的算法。将策略的定义、创建和使用三个部分解耦。下面就上面的打折方案的方法使用策略模式进行改造。策略的定义包含一个策略接口和一组实现这个接口的策略类,所有的策略类都实现相同的接口。// 创建一个接口// 打六折@Override// 打八折@Override// 满100减20,满200减50@Override// 满100减20,满200减50// 省略具体算法....

2023-06-25 09:15:22 491

原创 Jconsole 开启远程连接遇到的一些坑

网上都是相互抄来抄去的,都是缺少 RMI 配置,完整配置如下JMX 是一套标准 API,用于管理和监控 Java 应用程序。而 RMI 为 JMX 提供了远程连接。关闭的报错的解决方案也是互相抄来抄去,解决方案都是治标不治本。在配置上面添加 if 判断条件 添加判断条件 if [ “$1” = “start” ]。

2023-06-20 14:15:49 2122

原创 Java 实战介绍 Cookie 和 Session 的区别

HTTP 是一种不保存状态的协议,即无状态协议,HTTP 协议不会保存请求和响应之间的通信状态,协议对于发送过的请求和响应都不会做持久化处理。无状态协议减少了对服务压力,如果一个服务器需要处理百万级用户的请求状态,对服务器的压力无疑的是巨大的。无状态的 HTTP 由于其简单和易用性,应用比较管广泛。而且早期的 Web 服务对于状态的需求也很低,所以应用场景也比较广泛。

2023-06-13 08:48:09 378

原创 一篇文章告诉你什么是Java内存模型

在单线程系统中,代码按照顺序从上往下顺序执行,执行不会出现问题。int a = 1;int b = 2;程序从上往下执行,最终c的结果一定会是3。但是在多线程环境中,代码就不一定会顺序执行了。代码的运行结果也有不确定性。在开发中,自己本地没问题,一行行查看代码也没有问题,但是在高并发的生产环境就会出现违背常理的问题。单核的cpu改成多核的cpu,每个cpu都有自己的缓存。多个线程可以在cpu线程切换。代码可能根据编译优化,更新代码的位置。这些优化会导致可见性原子性以及有序性。

2023-05-23 07:30:00 295

原创 由浅入深详解四种分布式锁

分布式锁是由于单机锁无法满足分布式系统锁,在分布式环境下,需要分布式锁来控制共享内容,保证线程的安全。分布式满足几个特性互斥性超时释放锁自动续期分布式锁实现方式Mysql使用排它锁,。实现比较简单,但是数据库无法支撑大量请求访问,性能较差。Zookeeper先创建一个持久类型的节点,当多个线程请求时,在持久类型节点创建顺序临时节点,先判断自己是否是最小节点,如果是持有锁,执行后续逻辑,如果不是就找到上一个顺序节点,并添加watch监听事件。线程处理结束后。

2023-04-19 09:21:16 1075

原创 详解一致性哈希算法

常见的哈希算法,先计算出哈希值,再根据服务数量取模(hash%N),将数据存储到固定的服务器下。当节点增加或者减少,N发生了变化,原来hash%N方式都失效了,数据也无法正常的获取了。一致性哈希算法就是为了解决节点数量发生变化时,数据一致性的问题。在一个环上有2^32节点,新增一个数据,先算出来哈希值,然后取模,算出来在环上的位置,往顺时针找到第一个服务节点,就是存储的服务节点。如果添加或者减少服务,比如服务挂了,或者服务扩容了。

2023-03-06 08:58:29 498

原创 延迟队列实现订单超时自动取消

使用Java自带的延迟消息,系统重启或者挂了之后,消息就无法发送,不适于用在生产环境上。RabbitMQ本身不支持延迟队列,可以使用存活时间ttl+ 死信队列dlx实现消息延迟。发送的消息设置ttl,所在的队列不设置消费者。队列绑定死信队列,消息超时之后,变成死信消息,再发送给死信队列,最后发送给消费者。发送多条不同延迟时间消息,前面消息没有到延迟时间,会阻塞后面延迟更低的消息,因为队列有先进先出的特性。RabbitMQ的插件可以解决消息时序问题。带有ttl的消息发送。

2023-03-04 06:30:00 1166

原创 Spring Cloud Alibaba 整合 Seata 实现分布式事务

本文介绍了整合分布式事务seta添加相关依赖配置配置,主要添加nacos配置中心和注册中心的配置。实现一个下单服务,先创建订单,然后扣减库存。库存不够,创建订单回滚。搭建服务完成之后,事务不回滚,对比官网实例项目。需要添加数据源代理,同时关闭据源自动代理。分布式事务就生效了。控制台一直报错,通过调试源码,找到问题的根源,这里学到了通过源码解决问题。以前前段时间一直在看源码,这次通过源码解决问题,努力还是会有收获的。

2023-03-03 07:00:00 1222

原创 调式源码解决 seata 报错 can not get cluster name 问题

整合seata,控制台报错查询文档,nacos添加了配置,就需要在yml文件上配置。添加后控制台还是报错。调式源码,找到报错代码位置,一步一步向上调试,找到分组事务无法设置的原因,最后发现分组事务是根据属性来设置。官方文档更新不及时的时候,这就需要我们调式源码的能力。前段时间一直在写解析源码的文章,所以也在尝试一步步调式代码,最终解决了问题,对自己能力也是一次提高。平时开发遇到问题,通过调式源码,可以快速的定位问题。授人以鱼不如授人以渔,作为程序员,重要的不是找到问题,而是找到问题的解决方案。

2023-02-24 09:02:11 6586

原创 Nacos服务发现原理分析

Ribbon项目启动时,会创建一个负载均衡拦截器。从Ribbon发起服务请求开始,最终会调用到拦截器的拦截方法。拦截方法又调用ServerList获取实例接口,而实现获取实例列表。Nacos调用服务实现了获取服务实例列表。类方法最终调用了方法方法先从集合中获取本地缓存,如果本地缓存找不到,就请求获取服务实例,并更新本地缓存。获取服务之后,定时更新本地缓存。

2023-02-21 08:00:00 1081

原创 Nacos服务注册原理分析

从依赖上找到需要启动的是要加载的服务注册类,主要配置三个对象类的register方法,封装实例和心跳信息通过http请求,定时发送发送心跳包,默认时间间隔是5秒。通过http请求,发送实例信息。服务端接收到心跳请求,更新心跳包最新时间。服务端在15秒没有收到心跳包会将实例设为不健康,在30秒没有收到心跳包会将临时实例移除掉。接收到服务注册接口,通过ephemeral判断是否走AP还是走CPAP模式使用Distro协议。通过调用接口实现,持久化实例信息。

2023-02-07 08:00:00 403

原创 Nacos 源码环境搭建

最近在学习nacos,通过调式源码查看服务注册和发现流程和原理,本地部署naos源码需要一定的步骤,本文主要做nacos源码部署。

2023-01-11 11:42:58 819

原创 2022年终总结:点滴积累让我不再迷茫

公众号的粉丝量增长速度开始是很慢,开始的时候基本是不涨的。因为公众号本身也不做粉丝的推广,如果自己不做推广,基本就是没人关注。随着文章写的越来越多,当文章的量达到了几十篇的时候,每天都偶尔有几个粉丝关注,虽然少,但是还是有一些变化,慢慢的也累计到了一百多粉丝。也算是一个好的开头了。头条的流量比公众号大的多,写一篇流量大的文章,阅读量和粉丝数量都增加的很快,有时候就能增加几十个粉丝,好的文章可以有几千的阅读量。但是如果停止文章的更新的话,阅读量和粉丝也不会增加。

2022-12-31 21:34:38 651

原创 mvn 打包报错:no compiler is provided in this environment

maven打包报错,首先需要分析是不是idea配置问题。在终端也报同样的错,大概率是maven问题,找到启动文件mvn.cmd。找打mvn.cmd文件找不到JAVA_HOME:在第一行设置JAVA_HOME添加JAVA_HOME环境变量。

2022-12-16 07:30:00 1764

原创 详解 Redis 中 big keys 发现和解决

在使用 Redis 时,可能会出现请求响应慢、网络卡顿、数据丢失的情况。排查问题的时候,发现是 big keys 的问题。在 Redis 中,一个字符串类型最大可以达到 512MB,其他非字符串类型的集合类型(list、set、hash、zset等)可以存储 40 亿个(2^32-1),但在实际业务场景中,并不需要这么大的内存。而且对于一个请求量大的互联网软件,对数据的大小要求更加的严格。如果达到如下标准,就可以认定是 big keys 了:一般来说,big keys 的产生都是由于程序的设计不当,或者对数

2022-12-05 09:00:26 1783

原创 面试官:介绍一下 Redis 三种集群模式

主从模式:单机宕机或者磁盘出现故障,会导致数据丢失,主从模式将数据复制给多个从服务器上,即使一台数据库宕机了,其他数据也能正常提供数据。主从模式有一台主数据库,多台从数据库的模式。客户端对主数据库进行读写,从数据库只能读操作。启动主从数据库之后,从数据库发送SYNC同步命令给主数据库,主数据库接收到命令之后,生成RDB文件。并且使用缓冲区记录所有写命令。写完毕后发送RDB文件给每个从数据库解析,以及发送缓存写命名给所以从数据库执行。主数据库更新数据后,数据会同步更新到从数据库中。

2022-11-28 08:15:00 863

原创 Nacos 版本不一致报错: Request nacos server failed

Nacos服务端和Nacos依赖的版本号要一致和版本号要保持一致,也需要对应匹配。具体查看。

2022-11-14 08:00:00 7532

原创 Websocket集群解决方案

最近在项目中在做一个的功能,比如客户下单之后通知给给对应的客户发送,这种消息推送需要使用到全双工的websocket推送消息。所谓的表示客户端和服务端都能向对方发送消息。不使用同样是全双工的http是因为http只能由客户端主动发起请求,服务接收后返回消息。websocket建立起连接之后,客户端和服务端都能主动向对方发送消息。上一篇文章介绍了websocket用户A和用户B和web服务器建立连接之后,用户A发送一条消息到服务器,服务器再推送给用户B。

2022-11-09 08:15:00 541

原创 SpringBoot 自动装配原理

自动配置原理1、注解导入类。2、执行方法调用扫描所有jar下面的对应的文件.3、限定为对应的value,将这些装配条件的装配到IOC容器中。自动装配简单来说就是自动将第三方的组件的bean装载到IOC容器内,不需要再去写bean相关的配置,符合约定大于配置理念。基于约定大于配置的理念,配置如果没有额外的配置的话,就给按照默认的配置使用约定的默认值,按照约定配置到IOC容器中,无需开发人员手动添加配置,加快开发效率。

2022-11-06 08:30:00 417

原创 Spring Cloud 整合 nacos 实现动态配置中心

配置首先添加依赖。在配置列表添加配置添加地址和namespace配置dataId有两种方式手动配置,配置自动配置,根据规则配置,其中prefix为项目名称,为项目运行环境,配置内容的数据格式。通过设置在字段上就能获取到属性,要实现自动更新配置需要添加注解。

2022-10-31 10:14:46 2189

原创 Seata 环境搭建

seata安装版本是1.5.2,版本不同,安装流程也可能不同,这里的版本需要保持一致执行sql创建数据表使用脚本添加配置到nacos配置中心修改文件,分别修改store、config、registry相关配置。启动服务,成功登陆seata控制台。查看nacos控制台,服务列表新增seata服务。

2022-10-27 15:33:51 4259 2

原创 java.sql.SQLException: MONTH 报错解决方法

报错。先定位到对应字段,如果无法确认问题原因,先去掉字段,去掉后没有问题,应该就是时间字段的问题。然后查看时间,就能确认是格式问题,报错中MONTH说明是时间无法转换。

2022-10-26 10:51:37 1714 1

原创 使用LEFT JOIN 统计左右存在的数据

企业分组统计收款和发票表,只需要对企业做group by分组即可。企业和账套一起分组,left join只会统计左边存在的数据,而需要统计两边都存在的数据。使用union多表查询比较繁琐。left join使用on 1 = 1查询不添加限制条件,查询所有公司的账套,再关联发票和收款。

2022-10-24 11:01:20 913

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除