自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java8 日期Date、LocalDate、LocalDateTime、字符串String的转换

【代码】java8 日期Date、LocalDate、LocalDateTime、字符串String的转换。

2024-04-25 21:06:31 45

原创 java8 LocalDateTime

LocalDateTime: 可以设置含年月日时分秒的格式 , 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的。LocalDate: 只能设置仅含年月日的格式,表示没有时区的日期, LocalDate是不可变并且线程安全的。LocalTime: 只能设置仅含时分秒的格式,表示没有时区的时间, LocalTime是不可变并且线程安全的。Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔。after 只在大于(>)情况下才为true (相等时不会)

2024-04-25 21:04:33 178

原创 intellij idea 使用git的 cherry pick 摘取其他分支的comment

如果想把 feature_v1.0 分支的comment 摘到 feature_v1.0_new 分支上,

2024-04-04 11:37:58 357

原创 intellij idea 使用git ,快速合并冲突

可以选择左边的远程分支上的代码,也可以选择右边的代码,而中间是合并的结果。

2024-04-04 11:28:40 332

原创 dubbo 统一异常处理

指定切入点,进行环绕通知。如果有异常,就捕获后处理。

2024-04-03 23:42:56 348

原创 intellij idea 使用git撤销(取消)commit

Soft 回退到某个版本,只回退了 commit 的信息,不撤销git add ,不删除工作空间的改动代码。如果还要提交,直接 commit。点击 Git 分支,选择 Remote 的分支, Reset Current Branch To Here。Hard 彻底回退,本地源码也会变成上一个版本内容,不保留之前 commit 的代码。Git,选择分支后,右键 Undo Commit ,会把这个 commit 撤销。选中分支, 新建 分支,避免后续因为操作不当,导致内容丢失。接着选择 是否保留本地的代码。

2024-04-01 23:22:43 682

原创 dump文件分析OOM及线程堆栈

可以看到,在出现 OutOfMemoryError 异常错误时进行了堆转储,导致 OutOfMemoryError 异常错误的线程 是哪一个。点击 Profiler ,再点击 Open Snapshot ,选择 上面的 dump 文件 D:/heapdump.hprof。打开 VisualVM 后,点击左上角的图标 ,装入, 文件名选择 之前的 dump 文件 D:/heapdump.hprof。这里的 D:/heapdump.hprof ,就是 dump 文件保存的路径。

2024-03-27 22:52:52 486

原创 SonarBug修复

解决方法:不要直接抛Error,RuntimeException/Throwable/Exception这样的通用的异常,使用更具体的异常代替。解决方法:使用BigDecimal.valueOf()代替。解决方法: 重写equals()必须重写hashCode()。IDEA可以通过Alt+Insert自动生成。解决方法:使用(long)类型转换,或者在数字后面加上L转换类型。解决方法: logger.error(“错误提示字符串:”,e);解决方法: 浮点数不应该用==去比较,可能会精度丢失导致不准确。

2024-03-26 14:28:22 547

原创 feign设置超时时间

调用 feign ,会调用 FeignClientFactoryBean 类的 feign() 方法,再用 configureFeign() 配置 feign。feign的 本质是 调用 http请求,如果不设置超时时间,请求长时间连接着,占用系统资源,影响用户体验。feign设置超时时间,可以通过 Request.Options 来设置。

2024-03-20 17:54:13 325

原创 idea import的maven类报红

这个 import 的 ccc 这个词报红,那就点击 ccc 路径的上一层, 此处点击 bbb ,就可以看到具体是哪个 jar 包报错。如果版本不对,可以尝试备份文件夹,把jar 包删除后,重新 点击 Reload All Maven Projects,重新引入依赖。(1) 关掉所有代码的文件,然后对 maven 进行 clean,然后 重新 install 这个类所在的 jar 包。一般报红,显示红色,是因为 idea 在此路径下,找不到这个类。点击报红的路径的上一层,进入jar 包。

2024-03-19 14:07:07 683

原创 feign请求添加拦截器

在 configuration 属性中,指定配置为 以上设置的 FeignInterceptorConfigDemo 即可添加拦截器。Feign 注解 @FeignClient 的 configuration 属性,可以对 feign 的请求进行配置。feign 的拦截器,需要实现 RequestInterceptor 接口,重写 apply() 方法。feign 请求添加拦截器,也可以通过这个 configuration 属性 来指定。apply() 方法参数为 RequestTemplate。

2024-03-18 10:37:33 580

原创 策略模式代码示例(二)

策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。策略模式 ,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。策略模式,可以避免大量的if和else。

2024-03-01 15:45:21 545

原创 统一异常处理@ControllerAdvice及参数校验@Validated

直接throws Exception,抛的异常太过宽泛,最好能抛出准确的异常,比如throws IOException之类。Controller层的参数通常都需要检验,经常会看到大量的判空,然后返回错误提示,比如"名字不能为空"之类的提示。但是,如果在Controller层进行大量的捕获异常,可能会出现大量的非常多的try catch代码块。阿里巴巴的java规范中有一条,“最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。而且,异常一直向上抛,上层的类还是得处理这些异常。

2024-02-28 14:23:02 399

原创 电商业务知识总结(三)--退货退款

退款单号,订单号,子订单号,退款状态,退款金额,用户id,用户名称,支付方式,退款的银行流水号,退款原因,退款完成时间。必须做好事务处理,订单状态、退款单状态等状态同时成功,或者同时失败,避免出现 退货不退款的客诉,或者 退款不退货的资损。做好风控,针对账号和ip进行记录和监控,发现有异常行为的账号或者ip,及时做名单限制,避免黑产。一般情况,不建议有 退款失败 的状态,可以用 退款处理中。产品需要明确,退款是否存在时间限制,像支付宝,过了交易期限,是不支持退款的。退款可以分为 仅退款、退货退款。

2024-02-22 00:03:47 372

原创 电商业务知识总结(二)--订单和支付

最好设置冷库和热库,时间比较久远的订单,可以归档,放到冷库,避免数据越积越多,影响查询和更新等业务的响应速度。调用第三方的支付,添加支付单后,会返回支付要素,用户输入密码确认,之后系统会收到第三方系统的支付回调。支付成功,收到回调通知,修改订单状态,执行业务逻辑,需要保证事务性,要么全部成功,要么全部失败。调用第三方添加支付单,返回支付要素,用户输入密码后,再根据支付回调,更新订单状态。订单号,用户id,支付流水号,支付状态,支付方式,支付金额,支付回调时间。取消订单,或者退款后,订单变为关闭状态。

2024-02-22 00:02:44 584

原创 电商业务知识总结(一)

店铺相关属性:店铺编码、店铺详情、联系电话、联系人、楼层编码、营业时间、店铺图片oss地址。营销的形式有多种:好物(打折扣)、积分兑礼、秒杀、领券(类似100兑200)、抽奖。商品相关属性:商品编码、商品名称、商品图片oss地址、地址、物流配送方式、对应店铺。帖子相关属性:发帖人id,帖子标题,帖子内容,帖子关联的话题id,审核人id。电商、营销、券、会员、积分、内容(feed流、信息流)、停车。OCR积分的关键,在于识别率。业务领域: 店铺、商品、订单、支付、交付、退货、退款等。

2024-02-21 23:57:54 337

原创 支付功能设计及实现思路

订单日志表,记录下所有的操作,包括生成订单,提交订单,支付回调,支付状态,操作记录(是第三方回调,还是前端轮询,还是定时任务)等。可以用另一个新的Redis队列,当失败达到一次的次数后,就用新队列来存放这些未支付或者支付失败的订单。当回调结果为支付成功,而且数据库的支付状态不是支付成功时,才将支付状态改为支付成功,并执行业务功能。支付系统:指的是提供聚合支付服务的系统,同时提供微信支付,支付宝,银联等多种支付方式。性能太差,应付不了并发。订单日志表,最主要的就是订单号,支付状态,操作记录,支付渠道。

2024-02-21 23:55:06 892

原创 Netty面试题

Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。

2024-02-18 23:00:10 821

原创 Spring/SpringBoot 拦截器

还可以通过 addPathPatterns 匹配请求的url,excludePathPatterns 排除特定的 url。配置拦截器,需要实现 WebMvcConfigurer 接口,通过 addInterceptor 添加拦截器。Spring的拦截器,需要实现 HandlerInterceptor 接口。可以多次调用 addInterceptor,支持添加多个拦截器。拦截器,可以进行请求过滤、权限管理、打印日志、数据校验等。拦截器,可以在请求前、请求后进行处理。

2024-02-18 21:21:54 630

原创 团队管理--程序员值班

用户反馈问题,客服提工单,或者是客服转告值班的研发,然后值班研发再根据业务领域找到对应的研发。如果业务领域划分的清楚些,客服知道要找谁解决,也可以直接找业务领域的研发,减少信息传播的次数。值班的研发,可以拉个群,让熟悉的研发解决,自己也了解一下,下次遇到了,至少有个思路。如果都让值班的研发去解决问题,有些不熟悉的业务,有可能半天都找不到原因。当然,值班的研发,还是要简单地了解一下的,不然连问题都听不懂就尴尬了。如果研发不清楚问题是怎么产生的,可以先让值班的测试同事,帮忙复现问题。

2024-02-13 12:45:47 471

原创 Git分支和迭代流程

因此,先从 feature 分支合并到 release 分支,在验证通过后,才将 release 分支合并到 master 分支,会更加稳妥一些。需要先切换到 feature_v1.0_new分支,然后点击 下面菜单栏的 git,点击Local Changes旁边的 Log,这时能看到 local和remote的分支,点击feature_v1.0分支。因为feature分支是从master分支拉出来的,如果还有新的feature分支提交到master,那么自己的feature分支代码就是滞后的。

2024-02-12 23:13:07 1734

原创 策略模式的代码实践示例

策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。策略模式 ,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。策略模式,可以避免大量的if和else。

2024-02-09 17:33:57 386

原创 LeetCode回溯算法的解题思路

回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试。输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]输入:nums = [0]输出:[[],[0]]

2024-02-07 23:58:54 633

原创 LeetCode 二叉树/n叉树的解题思路

(3)在遍历过程中,使用 Queue的 offer()方法得到队列中的节点,根据节点查出它的左节点和右节点,并用offer()方法放入队列中。(1)获取 Queue的size, 因为Queue中存放的其实就是每一层中所有的节点, size就相当于每一层的数量,也就是宽度。1、使用 Queue的 offer()方法(或者是add()方法)把树的根节点放入 Queue;(2)找出与此点邻接的且尚未遍历的点(也就是子节点),进行标记,然后全部放入stack中;前序遍历:根节点,左节点,右节点。

2024-02-07 23:58:08 895

原创 链表常见操作及解题思路

可以将链表的节点,作为HashMap的key,再用HashMap的containsKey()来判断当前节点是否已经存在。(3)可以通过栈实现,将链表数据放入栈里面,再拿出来。思路:处理环形链表时,也可以使用快慢指针,一个走得快,一个走得慢,如果是环形链表,那么这两个指针最终会相遇。将当前节点node的指针next指向下一个节点的下一个节点,就相当于删除下个节点了。8.A指针走完了一个链表,就指向另一个链表,B指针也是。涉及到下标的问题,都可以将链表转化为数组解决,数组的每一个元素都是一个节点。

2024-02-07 23:57:21 407

原创 LeetCode解题思路

参考资料: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/bao-li-mei-ju-dong-tai-gui-hua-chai-fen-si-xiang-b/9.LeetCode有时会报一些莫名其妙的错误,比如 error: cannot find symbol ,有可能是函数中的参数拼错了,比如没有注意大小写,或者是多了_之类的。元素的计算结果,比如元素x2的计算结果由元素x1的计算结果等等决定。

2024-02-07 23:56:04 744

原创 mysql的慢sql优化

all: 表示全表扫描, 这个类型的查询是性能最差的查询之一. 通常来说, 我们的查询不应该出现 ALL 类型的查询, 因为这样的查询在数据量大的情况下, 对数据库的性能是巨大的灾难. 如一个查询是 ALL 类型查询, 那么一般来说可以对相应的字段添加索引来避免.range: 表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, , >, >=,

2024-02-07 23:43:56 1851 6

原创 后端的技术设计文档

拆解成多个工作项,每个工作项,需要多少人力。

2024-02-07 23:37:37 1099

原创 LeetCode动态规划的解题思路

对于dp[i][1],按照同样的方式考虑转移状态,那么可能的转移状态为前一天已经持有一支股票,即 dp[i−1][1],或者前一天结束时还没有股票,即 dp[i−1][0],这时候我们要将其买入,并减少 prices[i] 的收益。考虑 dp[i][0] 的转移方程,如果这一天交易完后手里没有股票,那么可能的转移状态为前一天已经没有股票,即 dp[i−1][0],或者前一天结束的时候手里持有一支股票,即 dp[i−1][1],这时候我们要将其卖出,并获得 prices[i]的收益。

2024-02-07 23:12:12 1267

原创 链表:反转链表

接着向下一个节点3,迭代,反转,将3->2,也就是变成了3->2->1,依此类推。首先,从第一个节点开始,反转,将1->null,反转链表,常用的方法有迭代,栈反转,递归反转。接着向下一个节点2,迭代,反转,将2->1,比如,现有链表1->2->3->4->5,

2024-02-06 22:59:48 738

原创 nacos注册中心调用服务失败

发现有两个 ip,明显一个是开发/测试环境,一个是本地启动的 ip, 将本地的 ip 进行 【下线】。如果没有用 k8s,那进入服务器,使用 命令 ifconfig 查看 ip。最近同事反馈后台的接口,一会可以调通,一会又报错,反复无常。如果有用 k8s ,可以直接从 k8s 查看服务器的ip。这样就不会干扰到其他的环境了。

2024-02-05 23:55:51 400

原创 Intellij Idea的数据库工具 DataGrip

可以直接在数据表上修改数据,改完了,记得点一下DB(后面的箭头会变绿)提交,或者直接用 ctrl+enter 提交。可以在左边的选项中,选择用 Insert Sql,Update Sql,也可以选择导出 excel。注意,此处界面只会展示10条插入的sql,如果想要完整的sql,可以把提示的sql文件中去查找。将鼠标放在数据表上,右键,选择 Export Data,可以导出数据表数据。将鼠标放在数据表的列上,右键,可以看到数据表的菜单,包括各种快捷键。还可以选择 导出sql,这也是非常实用的一个功能。

2024-02-05 23:42:59 2447

原创 Jvm FullGC 如何排查?

分析结果默认是以包为单位进行分组显示,分析内存泄漏问题主要会使用到其中的 “Heap Histogram”,可以找到内存中总量最大的对象。以下命令是将进程号为72的dump文件,输出到 /tmp/dump_file这个路径,也可以是其他任意路径。jps可以列出正在运行的jvm进程,并显示jvm执行主类名称( main()函数所在的类),以及进程id。搜索找到 nid=0x4f 的线程,就可以拿到线程的堆栈,找到出问题的代码了。我们主要观察FGC这个参数,可以发现,每隔几秒,FGC的次数就会变多。

2024-02-04 22:38:06 2035

原创 kafak入门(十一):Kafka怎么保证可靠性?

就Kafka而言,越多的副本数越能够保证数据的可靠性,副本数可以在创建主题时配置,也可以在后期修改,不过副本数越多也会引起磁盘、网络带宽的浪费,同时会引起性能的下降。如果要提升可靠性,那么生产者可以采用同步或异步的模式,在出现异常情况时可以及时获得通知,以便可以做相应的补救措施,比如选择重试发送(可能会引起消息重复)。对于发后即忘的模式,不管消息有没有被成功写入,生产者都不会收到通知,那么即使消息写入失败也无从得知,因此发后即忘的模式不适合高可靠性要求的场景。消息发送的3种模式,即发后即忘、同步和异步。

2024-02-04 00:08:56 609

原创 实践理解 Transactional 是否生效

执行A方法,抛异常后,update_time 已更新为最新时间,更新成功,说明事务没有回滚。@Transactional 底层是通过 AOP 动态代理实现的,如果在同一个类中调用,就不是通过代理类调用了,事务不会生效。如果在 Service 服务层 catch异常,那么 @Transactional 会认为方法正常执行,没有异常,不会回滚。执行A方法,抛异常后,update_time 没有更新成功,说明事务回滚了。执行A方法,抛异常后,update_time 没有更新成功,说明事务回滚了。

2024-01-31 23:45:20 392

原创 Notepad 将多行转换成字符串,合并成一行

(即 CR,Carriage Return)表示回车,使光标到行首;(1) 快捷键 ctrl+ H ,选择 【替换】,如果需要将多行转变成字符串,再合并成一行,就输入。当然,也可以是其它的字符串,根据实际需要去输入。比如 输入 , 逗号,表示每一行用逗号隔开。(3) 下面的【替换为】 输入 分隔符,再将第一个和最后一个的 格式修正就可以了。(即 LF,Linefeed)表示换行。(4) 【查找模式】,选择 【扩展】(2) 【查找目标】,输入。(5) 最后点击【全部替换】

2024-01-28 19:33:14 595

原创 Notepad在文件中查找多行相同内容的文字

详情见: https://blog.csdn.net/sinat_32502451/article/details/133656087。查找:打开 Notepad++软件, Ctrl F 查找。输入关键词, 点击【在当前文件中查找】。复制:直接在下方的【搜索结果】复制。

2024-01-27 00:35:09 627

原创 怎样才是优秀的程序员?

工作工作,学习,效率非常高。知道该做什么事情,什么事情优先级高。独立思考的能力,不盲目听从。目标多给自己定目标。心仪的薪酬想要 X 万,Y 点下班。技术熟悉开源技术。学习有长期价值的技术。十年后还有用的技术。linux、mysql、redis、kafka、netty.学习系统性地学习,而不止于碎片知识。善于向优秀的人学习~每解决一个问题,就多进步一点点。知其然,还知其所以然。看书,看官方文档,阅读源码。善于使用搜索引擎。思维What,Where,When

2024-01-24 22:49:15 380

原创 kafka为什么不支持读写分离?

读写分离可以均摊一定的负载,却不能做到完全的负载均衡,比如对于写压力很大而读压力很小的情况,从节点只能分摊很少的负载压力,而绝大部分压力还是主节点上。而kafka 的主写主读,可以做到负载均衡。在kafka中,生产者写入消息,消费者读取消息的操作都是与 leader 副本进行交互的,从而实现的是一种主写主读的生产消费模型。类似 Redis ,数据从写入主节点,再同步到从节点中的过程需要耗费一些时间。如果对延时的要求比较高,读写分离并不太适用。(3) 副本稳定的情况下,不会出现数据不一定的情况。

2024-01-24 22:12:08 1434

原创 kafka入门(十):副本数据同步

随着follower副本不断与leader副本进行消息同步,follower副本的LEO也会逐渐后移,并最终追赶上leader副本,此时该follower副本就有资格进入ISR集合。追赶上leader副本的判定准则是此副本的LEO是否不小于leader副本的HW,注意这里并不是和leader副本的LEO相比。在ISR集合之外,也就是处于同步失效或功能失效(比如副本处于非存活状态)的副本统称为失效副本,失效副本对应的分区也就称为同步失效分区,即under-replicated分区。(注:lag,表示滞后)

2024-01-21 22:28:56 761

空空如也

空空如也

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

TA关注的人

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