Kamafeel

求其上,得其中;求其中,得其下,求其下,必败


  • 首页

  • 归档

Redis分布式锁

发表于 2020-10-26 | 分类于 中间件 , Redis

使用规范

1.加锁必须释放锁

2.和数据集事务@Transaction 一起使用
需要注意,手动操作事务开启,提交,回滚,避免2个时间相互影响。

https://segmentfault.com/a/1190000022734691

3.尽量使用redission,避免重复造轮子

4.现在SpringBoot2 默认使用lettuce 需要参照redission,使用lua和和加锁后的“看门狗”模式。
https://juejin.im/post/6844903798125641741

zookeeper原理

发表于 2020-10-26 | 分类于 中间件 , Zookeeper

内部角色

alt

https://cloud.tencent.com/developer/article/1633533

特色总结

属于CP

不能保障A

写操作一定是 FIFO Channel ,先进先出。
选举时,存在致命服务不可用问题。

适合强一致性读多,写少场景。比如强一致性的分布式锁,比redis集群的分布式锁一致性好。

导致JAVA程序CPU过高的几种情况

发表于 2020-10-26 | 更新于 2021-08-26 | 分类于 JAVA , 运维

1、频繁的GC; 如果访问量很高,可能会导致频繁的GC甚至FGC。当调用量很大时,内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升。
2、序列化和反序列化。稍后将给出一个示例:当程序执行xml解析时,调用量会增加,从而导致CPU变满。
3、序列化和反序列化;
4、正则表达式。我遇到了正则表达式使CPU充满的情况; 原因可能是Java正则表达式使用的引擎实现是NFA自动机,它将在字符匹配期间执行回溯。
5、线程上下文切换; 有许多已启动的线程,这些线程的状态在Blocked(锁定等待,IO等待等)和Running之间发生变化。当锁争用激烈时,这种情况很容易发生。
6、有些线程正在执行非阻塞操作,例如 while(true)语句。如果在程序中计算需要很长时间,则可以使线程休眠。

排查JAVA进程CPU占用过高

发表于 2020-10-26 | 更新于 2021-08-26 | 分类于 JAVA , 运维

方式1

1.top
alt
看下
us:用户空间占用CPU的百分比
sy:内核空间占用CPU的百分比

2.查看进程内线程运行状态

1
ps -mp 进程ID -o THREAD,tid,time

3.到dump文件核查
转换16进制

1
printf "%x\n" 6766

jstack命令打印线程堆栈信息

1
jstack pid |grep tid

4.已经确定是GC导致,通过jstat查看进程内存状况
jstat -gcutil

alt

5.jstack 和 jmap 分析进程堆栈和内存状况
使用jmap命令导出heapdump文件,然后拿到本地使用jvisualvm.exe分析。(eclipse Mat)

命令: jmap [option] vmid
jmap -dump:format=b,file=dump.bin 6764

命令: jstack [option] vmid
jstack -l 6764 >> jstack.out

方式2

使用以下命令确定受影响的服务器进程的进程ID(PID):
$ jps -v
确定步骤1中标识的PID中的哪个线程正在消耗CPU:
在Unix®和Linux®系统上,可以使用top命令:
$ top -n 1 -H -p [pid]
将[pid]替换为受影响进程的进程ID。

使用以下命令之一为步骤1中标识的PID生成堆栈跟踪:
jstack 命令:
$ jstack -F -l [pid]> [outputfile.txt]
kill -3命令(仅适用于Unix®和Linux®系统),可以始终产生更好的结果:
$ kill -3 [pid]
kill -3命令将堆栈跟踪输出到定向标准输出的日志文件(通常是错误日志文件)。kill -3命令不会停止正在运行的进程。输出堆栈跟踪后,它将继续运行。
将在步骤2中确定为有问题的线程ID转换为十六进制值。在我们的示例输出中,线程ID十进制值8706转换为十六进制值2202。
使用grep在堆栈跟踪输出中搜索此十六进制值。您正在寻找与此十六进制值匹配的线程nid:
$ cat jstack-output.txt | grep -i 2202
此命令提供类似于以下的输出:
“并发标记扫描GC线程” prio = 10 tid = 0x00007f1448029800 nid = 0x2202可运行
在此示例中,我们可以看到问题是垃圾收集器(GC)线程,这表明GC的调整不正确。

Spring接口 RequestBodyAdvice使用

发表于 2020-10-21 | 更新于 2021-09-06 | 分类于 Spring , 开发

概况

该接口的实现会在 Controller 方法返回数据,并且匹配到了 HttpMessageConverter 之后。HttpMessageConverter 进行序列化之前执行。可以通过覆写 beforeBodyWrite 来统一的对响应体进行修改。

注意,需要通过标识 @ControllerAdvice 注解激活

@RequestBodyAdvice
RequestBodyAdviceAdapter

@ResponseBodyAdvice

https://juejin.im/post/6854573214707515399
https://springboot.io/t/topic/1864

慎用lombok的@Builder

发表于 2020-10-21 | 分类于 JAVA , 开发

需要注意父类属性

需要注意默认值的处理

@Builder.Default声明,注解在需要默认值

守护线程

发表于 2020-10-19 | 更新于 2022-03-08 | 分类于 JAVA , 并发

基本概念

守护线程为其他线程提供服务的线程,比如JVM 启动的main线程。

当JVM没有非守护线程运行,将立即退出,无论是否存在n+个守护线程。

守护线程不能持有需要关闭的资源

应用场景

GC垃圾回收线程

用户线程停掉,就没必要存在线程,并且不持有资源的线程可以设置为守护线程。

微信小程序开发

发表于 2020-10-19 | 更新于 2021-08-02 | 分类于 JAVA , 开发

基本概念

在微信内部运行的,有限制的(2M/5M)的前端微程序

连接后端需要HTTPS协议,域名。

要钱

登录模式

alt

开发参考

https://www.infoq.cn/article/wBPyxJTpioXF6oopEZ6N
https://cloud.tencent.com/developer/article/1677389

spring mvc执行原理

发表于 2020-10-19 | 分类于 Spring , 原理

基本概念

alt

DispatcherServle —>Map(url和controller中的对应关系)—>参数绑定(asm框架)

https://www.cnblogs.com/w-y-c-m/p/8416630.html

拦截器inteceptor和过滤器filter

Filter技术是Servlet2.3新增加的功能

① 拦截器inteceptor是基于java的反射机制实现的;
过滤器Filter是基于函数回调实现(filter接口中的doFilter方法是回调函数实现的

② 拦截器不依赖于servlet容器;
过滤器filter依赖servlet,没有servlet无法回调doFilter

⑥ 拦截器可以获取IOC容器中的各个bean,而过滤器不行

核心类

HandlerInterceptor
HandlerInterceptorAdapter (适配器,只关注其中某个方法)

spring boot 配置Filter
https://blog.csdn.net/testcs_dn/article/details/80265196
https://www.jianshu.com/p/56cae30c2a30

开发细节
https://blog.csdn.net/bigtree_3721/article/details/52091522

mysql的cross join 例子

发表于 2020-10-15 | 更新于 2021-11-18 | 分类于 数据库 , MYSQL

基本概念

cross join 笛卡儿积,区别于内连接和外连接

使用场景

查询所有的销售情况,包括有销售记录的和没销售记录的。

全数据集查询

https://www.jianshu.com/p/8f4e4b97ea92

1…111213…21

Kamafeel

204 日志
57 分类
129 标签
© 2022 Kamafeel
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.1.2