- 博客(182)
- 资源 (4)
- 收藏
- 关注
原创 [指北]为什么选择 redis
Redis C语言开发深入底层,数据放在内存中,网络层使用epoll解决高并发问题另外,除了做缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。采用单线程: 非阻塞的异步事件处理,IO时间不会很长也能够避免线程上下文切换。(多线程处理网络IO读取和写入,核心IO负责串行处理客户端指令)
2024-08-07 09:30:00
1405
原创 rocketmq 顺序消息原理与实战
pull 为主动从broker获取消息Push为broker主动推送消息个consumer 实时性更高,但流量要自己控制PullBatchSize,代表的是每次从broker的一个队列上拉取的最大消息数。consumeThreadMax 和 consumeThreadMin 代表消费者pull消息时需要的线程最大和最小数量。
2024-07-08 10:00:00
337
原创 mac 本地启动rocketmq
Xmn512m 年轻代大小(1.4or lator)整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。如果电脑配置不高或者不希望rocketmq占用太大内存的,修改配置/bin/runbroker.sh。这两个文件有哪个修改哪个,如果都有那就都试试,看哪个生效那另一个就可以删除了。进入rocketmq目录执行命令启动nameserver。配置nameserver启动空间大小。配置成功后启动rocketmq。
2024-06-15 10:00:00
537
原创 springboot 引入traceid链路追踪实战
开发中很多数据如oauth2的认证信息,日志TracerId都是在请求线程中的,如果内部使用多线程处理就存在获取不到认证信息或TraceId的问题。这时候就需要处理子线程与主线程间数据传递的问题。这个问题需要使用线程的ThreadLocal和TaskDecorator来处理。官方文档中描述意思是TaskDecorator是一个执行回调方法的装饰器,主要应用于传递上下文,或者提供任务的监控/统计信息。实现方式就是定义一个TaskDecorator,在线程池中设置使用这个TaskDecorator。
2024-04-15 10:00:00
1426
1
原创 动态控制定时任务增删启停
2.创建 DynamicScheduledTaskRegistrar 核心类。Application启动类上添加注解@EnableScheduling。
2024-03-15 09:00:00
388
2
原创 springboot自定义注解实战
1、切面(aspect)散落在系统各处的通用的业务逻辑代码,如日志模块,权限模块,事务模块等,切面用来装载pointcut和advice2、通知(advice)所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类Before advice:在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。After advice:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
2024-02-26 09:05:00
1090
原创 spring事件监听 listener 实战
application.properties 增加配置context.listener.classes=com.example.demo.work.event.MyListener。第三四中最终也是把监听器放入ConfigurableApplicationContext对象,只不过实现有了2个特别的类,注解和配置文件的形式。3.application.properties配置context.listener.classes属性。1.用addListener 方式注入。新建 MyEventHandle。
2024-02-07 10:00:00
249
原创 springboot 整合 actuator监控详情
19 tomcat.sessions.active.max tomcat 最多活跃 session 数 是 显示在监控页面,超过阈值可报警或者进行动态扩容 重要。20 tomcat.sessions.alive.max.second tomcat 最多活跃 session 数持续时间。32 tomcat.threads.config.max tomcat 配置的线程最大数 是 显示在监控页面 重要。18 tomcat.sessions.active.current tomcat 活跃 session 数。
2024-01-14 10:00:00
1040
原创 java 探针两种模式实战
分为两种程序运行前的agent:premain程序运行中的agent:agentmain在程序运行前的agentjavaagent是java命令的一个参数,所以需要通过-javaagent 来指定一个jar包(就是我们要做的代理包)能够实现在主程序运行前来执行我们jar中的方法1.pom文件中
2023-12-16 09:00:00
379
原创 [rocketmq] 如何保证消息可靠性
1、生产者发送消息到Broker时;2、Broker内部存储消息到磁盘以及主从复制同步时;3、Broker把消息推送给消费者或者消费者主动拉取消息时;
2023-06-29 16:55:26
783
原创 [rocketmq] 浅谈结构
几乎是无状态节点,可横向扩展,节点之间无消息同步,主要负责对源数据的管理,包括对于Topic和路由信息的管理。每个 Broker 在启动的时候会到 NameServer 注册,Producer 在发送消息前会根据 Topic 到 NameServer 获取到 Broker 的路由信息,Consumer 也会定时获取 Topic 的路由信息。
2023-06-28 15:22:28
706
原创 2022年终总结
继20年发布了新年计划被男票嘲笑一年后,2022年真的是开始有改变了,确实看了一些书,有了不一样的改变,还要多亏了小郑同学的督促,以及不断的分享,我也要努力在我周围生长出一种向上的螺旋力量。
2022-12-27 19:10:27
941
2
原创 2020年终总结-未来可期
2020年是神奇的一年,我们经历了坎坷的新年,迎来了不同寻常的开篇,我们的生活中多了许多英雄,多了对医务工作者的敬仰。工作没错,我换工作了,脱离了舒适圈,迎来了属于自己的机遇与挑战。面试确实也有碰壁,但也算是有善终,进入了自己比较心仪的公司,结识了温柔美丽的测试运营小姐姐和帅气聪慧的开发小哥哥,还有非常重视个人成长的老大,组长和团队。这真的是我最大的幸运了吧。换了工作发现,当机遇挑战等于压力的时候,是最能够突飞猛进的时候,这个时候如果不积极进取那一定对不起给你机会的那个团队。学习深刻领悟了不断学
2021-01-24 11:32:05
530
9
原创 [java 并发]你真的了解线程池吗?
为什么线程池预先创建若干数量的线程,用户不能直接对线程的创建进行控制,重复使用固定或较为固定的线程来完成任务执行,消除了频繁创建和消亡线程的资源开销,面对过量任务的提交也能够平缓劣化线程池种类Executors.newCachedThreadPool()可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,智能的添加新线程来执行。队列:LinkedBlockingDeque - 由链表结构组成的双向阻塞队列Executors.
2020-08-23 21:10:07
264
原创 redis的数据类型和底层实现
String使用SDS(simple Dynamic String)存储,类似arraylist,可通过预分配冗余空间减少内存的频繁分配简单的key-value类型,value不仅可以是string,也可以是数字编码方式:raw、int、embstrString能够进行扩容,会有一定的free空间,如果删除部分字段的时候空闲时间不会立即删除而是留给下一次操作,如果下一次操作还是没有操作free空间,才会删除回收。而且是按照长度来寻找字符串。HashHashTable、ziplist内部..
2020-08-16 20:18:18
315
原创 ThreadLocal和内存泄露
1. ThreadLocal是什么?线程变量,属于当前线程,该变量对其他线程是隔离的,为变量在每个线程中都创建了一个副本,每个线程都可以访问自己内部的副本变量使用场景:1、在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。2、线程间数据隔离3、进行事务操作,用于存储线程事务信息。4、数据库连接,Session会话管理。2. 怎么用public static void main(String[] args) { //新建一个ThreadLocal
2020-07-26 20:58:03
285
原创 [面试源码] jdk8 之 LinkedList解析
概述LinkedList 是线程不安全的,允许元素为null的双向链表。其底层数据结构是链表,它实现List, Deque, Cloneable, java.io.Serializable接口,因为实现了Deque接口,所以也可以作为一个双端队列。和ArrayList相比较因为没有实现RandomAccess所以它以下标随机访问数据比较慢。因为底层是链表实现的,所以在增加和删除时只修改指针就可以了,所以时间效率高,也不需要扩容,所以空间效率比arraylist(数组实现)高。缺点就是当随机访问元素时
2020-07-19 21:32:35
276
原创 [面试源码] java8 ArrayList解析
首先看ArrayList实现了 List ,RandomAccess , Cloneable , java.io.Serializable其中的RandomAccess 代表其拥有随机快速访问的能力因为其底层数据结构是数组,是占据一块连续的内存空间,所以其空间效率不高,但是可以根据下标读写(改查)元素,时间效率很高,当集合中的元素超出容量会进行扩容操作,新容量=旧容量*1.5arraylist需要8字节来存储自己的信息,所以最大的容量就是 Integer.MAX_VALUE-8下面来看代码,首先是构
2020-07-12 20:58:36
422
原创 [java 并发] ReentrantLock公平锁和非公平锁的实现
reentrantlock可以实现公平锁和非公平锁 ReentrantLock lock=new ReentrantLock(false); public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }非公平锁中源码如下 final void lock() { // 如果cas尝试获取锁成功(将state锁状态从0设置为
2020-06-21 20:59:05
623
原创 如何在 github 上找到优质代码
在用github的时候经常会搜索到很多代码,但是又不知道哪个是我们该选择的,经常会眼花缭乱,所以需要提升一下查找效率。搜索in查找项目名字或描述或 readme 中存在搜索关键字的项目格式: XXX关键词 in:name 或description 或 readmespringcloud in :namespringcloud in :descriptionspringcloud in :readme联合查询springcloud in :name,readme,descriptio
2020-06-14 20:25:51
1322
2
原创 mysql 行转列和合并列
文中所用数据库格式如下查询所有学生 ORACLE开发,J2EE从入门到精通,EJB及设计模式 这三门课程的分数SELECT sc.grade, tc.cname, sc.sno FROM t_score sc JOIN t_course tc ON sc.cno = tc.cno where cname='ORACLE开发' or cname='J2EE从入门到精通' or cname='EJB及设计模式’我们查询出来的结果如下要把它从行转为列,,sql 如下SE
2020-06-06 16:19:44
1026
4
原创 LocalDateTime的使用
一般我们用到的 Date 类型的日期如果不经过格式化打印出的数据可读性会比较差所以会需要经过 SimpleDateFormat 来格式化,但是SimpleDateFormat 的 format是线程不安全的,parse方法也是线程不安全的。接下来我们看一下jdk8 的新日期和时间APILocalDate //获取当前年月日 LocalDate now=LocalDate.now(); //指定年月日 LocalDate localDate=LocalDate.of(2020,
2020-05-31 20:25:58
483
1
原创 DevTools 热部署配置
修改pom文件<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>添加插件<plugins&.
2020-05-24 21:01:33
330
1
原创 详解类的加载过程
类加载主要职责就是加载各种 class 文件到 JVM 中,类的加载过程主要分为三个阶段:加载、连接、初始化其中连接又分为:验证、准备、解析三个过程加载类的加载就是将class文件中的二进制数据读取到内存中,然后将该字节流锁代表的静态存储结构转换为方法区中运行时的数据结构,并且在堆内存中生成一个该类的java.lang.Class 对象,作为访问方法区数据结构的入口。连接1. 验证验证阶段主要是确保class文件的字节流锁包含的内容符合当前 jvm 规范的要求,并且不会出现危害 jvm 自
2020-05-17 20:37:49
364
原创 JUC包下关于并发的工具类
在学习多线程的时候还是需要一些工具来加持,所以介绍一下JUC中关于并发的工具类,主要有CountDownLatch、CyclicBarrierDemo、SemaphoreDemo、Phaser、ExchangerCountDownLatch 门闩门闩能够使一个线程在等待另一些线程完成各自的工作后再继续执行。通过使用计数器来实现,计数器的初始值为线程的数量,每当一个线程完成自己的任务后,通过countDown() 方法将计数器减一,当计数器的值为 0 时,表示所有的线程都完成各自的任务,这时等待的线程
2020-05-10 16:13:41
282
原创 [CAS] getAndIncrement() 和 incrementAndGet() 方法的区别
执行下段代码public static void main(String[] args) { AtomicInteger one =new AtomicInteger(5); int a =one.getAndIncrement(); System.out.println("a="+a); System.out.println("o...
2020-05-03 20:30:58
1849
1
原创 技术选型:为什么要使用Sentinel?
Hystrix已经停止更新后,大部分的技术选型会转向Sentinel,也就是 Spring Cloud Alibaba 刚刚开源的,但是为什么我们要使用它呢,我们从 Sentinel 和 Hystrix 的对比入手Hystrix 的关注点是在 隔离 和 熔断 为主的容错机制,超时或被熔断的调用会快速失败,并可以提供 fallback 机制Sentinel 主要是以流量为切入点,从流量控制,熔断...
2020-04-22 10:05:49
1651
2
原创 Sentinel 安装和流控的基本实现
安装控制台下载对应 sentinel 版本的控制台 jar 包地址:官方下载地址在下载的路径下执行 cmd 命令 ,启动该jar包java -jar sentinel-dashboard-1.7.1.jar看到启动成功后不要关闭命令窗口访问 dashboard 默认端口为 8080 ,http://localhost:8080 这样就可以看到我们对应的 dashboa...
2020-04-20 21:01:12
529
原创 spring-boot-maven-plugin:<unknown> 插件找不到的解决办法
在pom文件中引入该插件的时候一直报错,我最终解决的办法是给定了一个版本,代码如下就解决了,我尝试了其他的版本不可以,就只有这个成功解决了 <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <...
2020-04-07 11:46:25
17106
4
原创 疫情之下的互联网
2020年是不平凡的一年,当我们都准备好回家过年的那天,新冠肺炎疫情也开始了,这不是我们期盼的,也不是我们想看到的,明明该是阖家团圆共度佳节的日子,却变成了在家隔离,不能外出的闭塞日子。但在疫情期间助力最大的就是互联网了。疫情信息我们最先知道疫情是通过互联网它的传播方式有哪些症状如何做好防护全国的疫情进展所有我们想要知道的信息都会通过各种方式送到我们面前与2003年的非典相比,在2...
2020-04-05 15:01:28
337
原创 轻松理解并使用 Iterator
本身是一个接口,作用就是遍历容器内的所有元素Iterator iterator = list.iterator();实现该接口后,相当于把一个 collection 容器的所有对象,做成一个线性列表,而 iterator 是一个指针,开始时位于容器内的第一个元素之前。 具体方法hasNext()判断 iterator 内是否有下一个元素,如果存在返回 true ,否则返回 false ...
2020-04-01 11:30:45
180
原创 Java中Validator的使用
很多时候都需要校验穿的参数是否符合规则,但是这种校验的代码会重复很多,所以引入 validator 来校验参数,这样可以省去很多冗余的代码1.pom文件引入 <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</art...
2020-03-24 15:05:02
9532
1
原创 nginx的安全配置
隐藏nginx的版本在 nginx.conf 配置文件下添加此代码http { server_tokens off; }ip安全白名单:location /{ allow 192.168.23.21 deny all ;}黑名单location /{ deny 192.168.23.21 allow all ;}文件安全 location /lo...
2020-03-08 20:35:32
346
原创 Apache Shiro 简介
Apache Shiro 是 Java 的一个安全框架。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。Shiro 的 API 也是非常简单易懂;Authentication:身份认证 / 登录,验证用户是不是拥有相应的身份;Authoriza...
2020-02-29 11:49:40
481
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人