- 博客(29)
- 收藏
- 关注
原创 使用HttpClient和HttpRequest发送HTTP请求
项目中经常会用到向第三方系统发送请求来传递数据或者获得信息,一般用的比较多的为HttpClient 和 HttpRequest,这里简要总结一下 HttpClient 和 HttpRequest 的用法1. 发送get请求1. 发送post请求优点:连接池(复用HTTP连接)、重试、代理机制,社区活跃,性能更加优异缺点:配置和API使用较为复杂1. 发送get请求2. 发送post请求优点:功能简单,整体比较易用缺点:性能一般,社区支持较弱hutool 的 HttpReques
2025-02-01 17:16:12
978
原创 金额存储类型-浮点数的精度丢失问题
所以在Java中涉及到支付金额相关的计算时优先采用 BigDecimal 类,在数据库中存储金额字段时 decimal 是最佳的选择,不仅避免了浮点数的精度丢失问题,同时对于数据量也有更大的灵活性。
2025-01-24 23:56:34
840
原创 Arrays.sort和Collections.sort排序基本用法
自定义类进行排序时只需要重写 compare 方法并将排序的标准在方法中体现即可,注意基本数据类型的拆箱类型只能使用运算符,装箱类型可以使用运算符和compareTo方法,而String类型只能使用compareTo方法@Override});
2024-12-19 20:00:00
339
原创 登录对接微信扫码
我们在实现登录功能时除了输入账号密码或者验证码的方式外,还可以使用第三方软件进行扫码授权登录,今天主要讨论一下对接微信公众号扫码的登录方式对接微信公众号流程大致为:在微信公众平台填写服务器接口配置,服务器对于该接口提供一个GET接口和一个POST接口,微信调用该接口进行验签GET 以及回调POST 操作微信调用服务器接口进行验签操作通过调用微信接口获取到二维码获取微信二维码时调用对应接口需要提供 ticket 凭证而获取ticket凭证又需要通过 accessToken 全局唯一接口调用凭据。
2024-12-06 19:44:05
985
原创 Java-线程池技术
线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,多余的空闲线程即临时线程不会立即销毁,而是会等待,直到等待的空闲时间超过了 keepAliveTime 才会被回收销毁,线程池回收线程时,会对核心线程和非核心线程一视同仁,直到线程池中线程的数量等于 corePoolSize ,回收过程才会停止。因此这种策略会降低对于新任务提交速度,影响程序的整体性能。同时使用线程池还可以减小 this 逃逸的风险:线程池执行是延迟的,受当前线程池空闲线程以及任务队列等因素影响;
2024-10-24 22:34:53
1131
原创 this逃逸
在多线程并发编程时要注意避免以上this逃逸出现的情况,尽量不要在构造方法中将当前this对象逃逸到外部以及不要在构造方法中启动多线程等。
2024-09-22 23:12:06
338
原创 group_concat
最近有遇到这样一个问题,将数据库中查询得到的数据根据其他共同信息字段将某字段进行整合,即将多行数据连接成为一行,从而简化了查询结果,结果更加简洁方便。函数是MySQL提供的一种聚合函数,它可以将多行数据通过指定的分隔符合并成一行。group_concat 函数主要使用步骤为。使用逗号连接相同分组中的不同字段。() 函数,包含需要整合的字段。
2024-09-16 21:08:14
380
原创 Builder构建者模式
Builder构建者模式主要表现在:如果类的属性之间有一定的依赖关系或者约束条件,那么可以使用构建者设计模式对类对象进行创建将创建对象时使用的繁杂的setter方法去除,通过链式进行选择性的属性赋值并创建获取对象。
2024-08-20 23:25:10
344
1
原创 对称加密与非对称加密
客户端服务器双方统一一个密钥,每次发送数据时都使用该密钥进行加密解密,对称加密由于没有任何的身份标识验证,一开始发送密钥很容易被截胡从而伪装客户端向服务器进行请求:非对称加密主要是通过每个客户端以及每个服务器都存在一对私钥和公钥,私钥只能由当前客户端/服务器单独持有,而公钥则是公开的。
2024-07-19 18:50:41
1118
原创 分布式id-雪花算法
UUID是无序的且数据非常大(128bit),且一般会使用36位长度的字符串存储,这样会导致id存入数据库时需要大量的存储空间来存放id,且id一般为主键,则在生成聚簇索引时则会耗费巨大的空间,并且UUID一般不呈递增趋势,在生成数据库索引时会出现大量页分裂等情况,影响性能;而在分布式情况下,需要考虑大量服务器之间生成的id全局唯一,所以就使用了今天要介绍的雪花算法来生成分布式下的全局id。时间戳则不满足高并发情况下的id,对于在某一毫秒只能生成的一个id,无法应对高并发场景下的id生成。
2024-05-20 17:21:28
1056
2
原创 解决缓存穿透 - 布隆过滤器
查询时则通过相同的hash算法得到映射的位置并判断映射的位置的值,若存在一个及以上的位置为0则代表该数据不存在布隆过滤器中,若映射的位置全部都为1则代表该数据可能在布隆过滤器中,可能不在存在误判的可能性。由于请求的数据在缓存和数据库中都不存在,此时当系统出现恶意攻击,大量请求访问缓存和数据库都不存在的数据,所有的请求将会到达数据库从而对数据库造成的攻击导致数据库宕机。解决布隆过滤器不能删除数据的问题我们使用了 redis 的 set 结构在判断完布隆过滤器后再加一层是否为已删除的数据判断;
2024-04-02 20:16:14
704
1
原创 内网穿透natapp基础用法
由于公网无法访问本地地址内网环境,所以在做一些本地项目时,但需要调用第三方公网API并执行回调操作我们可将本地项目部署到云服务器上公网即可访问但为了本地联调方便,我们就需要用到技术将本地的网络环境配置成公网可访问的我们可借助工具完成内网穿透技术bad02e40(natapp刚购买的隧道中的authtoken)
2024-03-02 21:27:27
992
2
原创 Java中重写equals()时都要重写hashCode()?
若每个数据都进行equals()比较的话,对于大量数据下将会带来巨大的比较成本,大大增加代码的时间复杂度,而引入hashCode则减少了equals()比较次数。equals()在Object类中是比较两对象的地址是否相同,比如String字符串重写equals方法变成比较两字符串的值是否相等。equals()方法和hashCode()方法都是Java中Object父类定义的方法。而如果重写equals()而不重写hashCode()?如果重写hashCode()不重写equals()?
2024-02-22 21:21:11
338
1
原创 微服务OpenFeign服务间调用
而OpenFeign则是一个更加方便的HTTP客户端,OpenFeign为Feign的升级版,在Feign的基础上增加了支持REST调用,通过注解绑定服务name和路径端口进行调用。总结:openfeign是微服务之间互相调用的重要方法,也可结合注册中心进行进一步的使用,在微服务调用的使用频率也是比较高的,后续也还会持续更新升级~最后对OpenFeign客户端及接口进行测试,直接注入OpenFeign客户端Bean,并调用客户端中的方法即可,最后会将被调用方的结果返回给该方法。1 . 首先需要引入。
2024-02-01 11:26:39
865
1
原创 链表算法题总结
链表的特点主要是存储地址分散,无索引访问一个链表节点主要是通过头节点依次遍历链表主要分为单链表,双链表,循环链表,当然用得最多的还是单链表首先,链表算法题主要是遍历链表,遍历过程中最需要注意的点就是容易产生所以在访问链表某节点的值或者下一节点时需要提前判断一下节点是否为空node!= null。
2023-11-26 00:23:49
62
1
原创 Redis哨兵机制详解
哨兵机制是针对于Redis集群模式下对主从进行监控而存在的哨兵机制会对Redis主从进行监控,当主节点故障下线时会从从节点中选出一个性能好的变成新主节点,并将IP地址和端口号发送给连接了旧主节点的客户端哨兵机制在判断主节点是否故障下线时,为了减小误判的可能性,所以哨兵机制一般会部署为集群模式。
2023-10-15 17:36:02
111
1
原创 Redis持久化完整总结
AOF日志更倾向于数据安全问题,能更大程度减小数据丢失风险,但是数据恢复效率较低RDB快照更倾向于数据恢复效率较高,数据丢失风险更大混合持久化居中,更大程度保证数据安全和数据恢复效率。
2023-10-08 16:39:13
75
1
原创 Redis的数据类型全面总结
接下来总结一下Redis的数据类型数据类型是基于数据结构实现,每一种数据类型底层对应一种数据结构,也有数据类型可由多个数据结构实现Redis底层结构:dictEntry[]数组保存Redis键值对key-value结构,key-value都指向redisObject,redisObiject包含三个字段:对象类型,底层数据结构,指向底层数据结构的指针。
2023-10-04 23:00:22
192
1
原创 Redis的数据结构全面总结
压缩链表不适合数据过多,适合少量数据及数据变化量小哈希表适合保存对象数据且对数据操作较简单整数集合只适用于保存整数对象且数据量少跳表的查询效率较双向链表更快。
2023-09-27 22:21:02
1984
1
原创 CountDownLatch类实际用法
适用于需要for循环创建多个子线程执行任务当前线程需要等待所有子线程执行完毕再继续执行若某个线程阻塞,到达指定时间后该线程会继续执行。
2023-09-17 23:02:57
83
1
原创 力扣热题100-环形链表
首先链表存在环是指节点重复,并非节点值重复HashSet去重需要计算hash值并存储等等,时间复杂度会更高环形链表适合使用快慢指针解决。
2023-09-17 22:37:24
179
1
原创 力扣热题100-字符串中所有字母异位词
如果两个数组相同,则说明两字符串字符相同(字符位置不一定相同)同时删除当前窗口的第一个字符以及加入窗口的下一个字符。相同则说明当前窗口组成的字符串是字符串p的异位词。使用长度为26的数组统计字符串中每个字符的个数。以字符串p的长度为滑动窗口的长度。,返回这些子串的起始索引。题目:给定两个字符串。
2023-08-09 21:57:06
76
原创 面试精选-TCP篇
当某个IP分片丢失时,接收端数据无法传送到传输层,发送端无法收到ACK响应,于是触发超时重传机制重传IP报文的所有分片。窗口实际上是操作系统开辟的一段缓存空间,发送方在等到接收方的确认应答之前必须将发送的数据保存在缓存空间中,若按期收到了确认应答则将发送的数据从缓存中清除。等于0时,server扔掉client发送的ACK报文,开启定时器,重传第二次握手报文,超过限制则删除连接。可标识发送的数据哪些已被对方成功接收。,当IP的数据超过MTU长度时,IP层会对其进行分片,保证每一片都小于MTU,
2023-08-02 19:52:59
477
1
原创 面试精选-HTTP篇
对响应数据进行语法压缩后,对原始资源建立统计模型,利用统计模型将常出现数据使用较短二进制比特序列表示,不常出现数据使用较长二进制比特序列表示。的配置,用于限制一个连接上能够传输的请求数量,避免动态表无限增大,请求数量到达上限后,就会关闭 HTTP/2 连接来释放内存。请求头部的If-Modified-Since字段与响应头部的Last-Modified字段(响应资源的最后修改。,再次访问相同资源时判断是否过期,若未过期直接使用,否则再次请求服务端,再次更新过期时间。
2023-07-30 15:47:09
124
1
原创 剑指Offer-左旋转字符串
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。1、String类型的可变性(String类型的不可变特性(每改变一次字符串,等于重新创建了一个新字符串,导致内存占用过大)
2023-07-02 18:01:16
94
1
原创 剑指Offer-合并两个排序的链表
链表指针本质上是一个类new出来的对象,JVM中对象存储在栈中(实际存储的是堆中对应内存地址),而对象封装的变量是存储在堆中,new对象实际上是指向堆中的对象封装的变量。问题2:为什么一开始不直接对tail进行赋值运算,而是对tail.next进行赋值运算?,后续链表的全部变化head始终为该链表的头指针,最后返回head.next即可。输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。不可行,直接对tail进行赋值运算会导致tail指针本身的丢失。当直接对tail进行赋值运算时,
2023-07-02 17:54:14
123
1
原创 剑指Offer-替换空格
1、URL中无法识别空格,必须转为其他字符形式(将空格转换为“%20”)2、String类型的不可变特性(每改变一次字符串,等于重新创建了一个新字符串,导致内存占用过大)
2023-06-11 23:26:09
68
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人