自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java交易所源码SpringCloudAlibaba版

交易所

2024-04-15 16:03:23 187 2

原创 spring-cloud-gateway负载均衡失效问题

使用NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1这个顺序会使负载均衡失效,最后我把它的order顺序改为Ordered.LOWEST_PRECEDENCE,负载均衡就正常了。spring-cloud-gateway 2.2.2.RELEASE遇到一个很奇怪的问题,配置中配置的是。

2024-04-09 11:02:30 407

原创 Java多线程实现交替打印(Condition)

【代码】Java多线程实现交替打印(Condition)

2024-01-26 14:57:02 109

原创 Java多线程实现交替打印(LockSupport)

【代码】Java多线程实现交替打印(LockSupport)

2024-01-26 14:55:03 94

原创 Java多线程实现交替打印(wait/notify)

【代码】Java多线程实现交替打印。

2024-01-26 14:53:47 157

原创 Spring中的循环依赖

在每个Bean的生成过程中,经过实例化得到一个原始对象后,代理对象所代理的原始对象也是没有经过完整生命周期的,所以放入earlySingletonObjects我们就可以统一认为是未经过完整生命周期的bean。都会提前基于原始对象暴露一个Lambda表达式,并保存到三级缓存中,这个Lambda表达式可能用到,也可能用不到,如果当前Bean没有出现循环依赖,那么这个Lambda表达式没用,当前bean按照自己的生命周期正常执行,执行完后直接把当前bean放入singletonObjects中,

2024-01-26 14:49:22 490

原创 Mybatis执行流程

Executor组件有两个直接实现类,分别是BaseExecutor和CachingExecutor。CachingExecutor静态代理了BaseExecutor。Executor组件封装了Transction组件,Transction组件中又分装了Datasource组件。Executor、StatementHandler 、ParameterHandler、ResultSetHandler,Mybatis的插件会对上面的四个组件进行动态代理。

2024-01-26 14:47:33 136

原创 操作系统相关知识

(保存现场),在CPU中,ALU是最快的,可以在一个核里,放两组程序计数器和寄存器,这样一个核里就可以放两个线程,就可以充分利用ALU,ALU的切换可比恢复现场那种方式要快的多,(一个。例如有两个线程A,B, A需要去内存中拿取数据,这个过程相对于cpu来说是很慢的,这个期间,cpu发现自己没事干了,为了优化cpu的执行速度,他会继续看下面一条指令,如果发现。2.Registers:寄存器,从内存中拿取数据到cpu进行计算,存数据的地方,寄存器的数量很多,多达好几十个,每个寄存器都有不同的作用,

2023-11-13 17:37:54 171

原创 java BIO、NIO、多路复用

select 使用固定长度的 BitsMap,表示文件描述符集合,而且所支持的文件描述符的个数是有限制的,在 Linux 系统中,由内核中的 FD_SETSIZE 限制, 默认最大值为 1024,@对于select 这种方式,需要进行 2 次「遍历」文件描述符集合,一次是在内核态里,一个次是在用户态里 ,而且还会发生 2 次「拷贝」文件描述符集合,先从用户空间传入内核空间,如果快递箱发现你的快递没有被取出,它就会不停地发短信通知你,直到你取出了快递,它才消停,这个就是水平触发的方式。

2023-11-10 17:44:01 564

原创 java 垃圾收集器

Serial垃圾回收器为单线程串行回收器,为HotSpot中Client模式下默认的新生代垃圾回收器,采用复制算法、串行回收和STW机制进行内存回收;Serial Old是运行在Client模式下默认的老年代垃圾回收器;Serial Old在Server模式下主要有两个用途:与新生代的Parallel Scavenge配合使用;作为老年代CMS回收器的后备垃圾收集方案。

2023-11-10 17:31:26 286

原创 java synchronized关键字

ABA问题的解决思路是每次变量更新的时候把变量的版本号加1,那么A-B-A就会变成A1-B2-A3,只要变量被某一线程修改过,改变量对应的版本号就会发生递增变化,从而解决了ABA问题。由偏向锁升级而来,当一个线程获取到锁后,此时这把锁是偏向锁,此时如果有第二个线程来竞争锁,偏向锁就会撤销(这个步骤也是十分耗资源的),升级为轻量级锁,之所以叫轻量级锁,是为了和重量级锁分开来,轻量级锁底层是通过自旋来实现的,并不会阻塞线程如果自旋次数过多仍然没有获取到锁,则会升级为重量级锁,重量级锁会导致线程阻塞。

2023-11-08 10:28:41 143

原创 java volatile关键字

在volatile修改之后,增加了一个内存屏障lock;addl $0,0(%%esp),内存屏障之前并不是原子的。偷懒了,并没有根据不同的CPU做优化,而是使用的所有CPU都通用的lock指令。

2023-11-08 10:26:01 123

原创 fastdfs报错Read timed out后上传的文件会发生错乱

通过减小soTimeout和connectTimeout的值,发现当报错超时之后,真的发生了这种情况,上网搜索这种现象也没有答案,于是去查看com.github.tobato的源码,后来去gitHub查看com.github.tobato的Issues,发现同样有人遇到了这种情况,上面给出了2种解决方案,一种是将连接池设置为1,测试了一下可行,但是上传效率会受影响。有用户反映线上查看文件时,文件名与文件内容中的不是同一个,内容也不对,测试环境试了很多次,代码检查了很多次都没有发现问题,于是又去分析日志,

2023-11-03 17:54:52 287

原创 elasticsearch分布式原理

如何查看节点属性?v集群应该至少有两个区域包含数据节点。除了主分片之外,每个 不是可搜索快照索引的索引都应该有每个主分片的至少一个副本。分片分配感知配置为避免将分片的所有副本集中在单个区域内。集群至少有三个候选节点。这些节点中至少有两个不是仅投票节点,均衡分配在至少三个区域中。客户端被配置为将其请求发送到多个区域中的节点,或者被配置为使用负载平衡器来平衡一组适当的节点之间的请求。

2023-11-03 17:50:49 55

原创 elasticsearch数据建模

Elasticsearch没有内部对象的概念,因此,ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表。实体关联查询时间消耗是很昂贵的,关联的越多,消耗就越昂贵。现实世界有很多重要的关联关系:博客帖子有一些评论,银行账户有多次交易记录,客户有多个银行账户,订单有多个订单明细,文件目录有多个文件和子目录。关系部分在文档中定义了一组可能的关系,每个关系是一个父名和一个子名。索引是独立文档的集合体。合适应用场景是:当索引数据包含一对多的关系,并且其中一个实体的数量远远超过另一个的时候。

2023-11-02 10:19:34 71

原创 elasticsearch搜索推荐:Suggester

搜索一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能,即在用户输入搜索的过程中,进行自动补全或者纠错。以此来提高搜索文档的匹配精准度,进而提升用户的搜索体验,这就是Suggest。

2023-11-02 10:05:03 81

原创 elasticsearch模糊查询和智能搜索推荐

match_phrase_prefix与match_phrase相同,但是它多了一个特性,就是它允许在文本的最后一个词项(term)上的前缀匹配,如果 是一个单词,比如a,它会匹配文档字段所有以a开头的文档,如果是一个短语,比如 "this is ma" ,他会先在倒排索引中做以ma做前缀搜索,然后在匹配到的doc中做match_phrase查询,(网上有的说是先match_phrase,然后再进行前缀搜索, 是不对的)

2023-11-01 10:01:20 203

原创 elasticsearch索引的批量操作

bulk api对json的语法有严格的要求,除了delete外,每一个操作都要两个json串(metadata和business data),且每个json串内不能换行,非同一个json串必须换行,否则会报错;bulk操作中,任意一个操作失败,是不会影响其他的操作的,但是在返回结果里,会告诉你异常日志。create/1/ ( 老版本的语法为 PUT /pruduct/

2023-11-01 09:59:29 244

原创 elasticsearch脚本查询

早先某些版本正则表达式默认情况下处于禁用模式,因为它绕过了painless的针对长时间运行和占用内存脚本的保护机制。而且有深度对战行为。如果需要开启正则,需要配置:script.painless.regex.enabled: true注意:通常正则的使用范围比较小,应用范围基本限制在数据量比较小和并发量比较小的应用场景下。

2023-11-01 09:58:30 106

原创 elasticsearch聚合查询

fixed_interval:ms(毫秒)、s(秒)、 m(分钟)、h(小时)、d(天),注意单位需要带上具体的数值,如2d为两天。用途:用于在某种聚合的计算结果之上再次聚合,如统计不同类型商品的平均价格,就是在按照商品类型桶聚合之后,在其结果之上计算平均价格。上面例子中,avg_price的计算结果是基于query的查询结果的,而all_avg_price的聚合是基于all data的。agg_type:聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)

2023-11-01 09:57:36 97

原创 elasticsrarch分词器

char_filter:内置或自定义字符过滤器。token filter:内置或自定义token filter。tokenizer:内置或自定义分词器。

2023-11-01 09:56:42 54

原创 Query DSL(Domain Specific Language)

概念:相关度评分用于对搜索结果排序,评分越高则认为其结果和搜索的预期值相关度越高,即越符合搜索预期值。:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。使用query关键字进行检索,倾向于相关度搜索,故需要计算评分。因为filter不计算评分,所以性能更高,可以先根据filter筛出部分数据,再进行其他条件的筛选。排序:相关度评分为搜索结果的排序依据,默认情况下评分越高,则结果越靠前。

2023-11-01 09:55:31 64

原创 倒排索引核心算法

全文检索:索引系统通过扫描文章中的每一个词,对其创建索引,指明在文章中出现的次数和位置,当用户查询时,索引系统过就会根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

2023-11-01 09:53:48 44

原创 MongoDB分片集群

根据节点定义一个Zone,比如国际区号:1开头的读写美国的服务器,86开头的读写中国的服务器,方便完成国际化的全球项目的部署。

2023-11-01 09:43:15 271

原创 MongoDB高级进阶

writeConcern 决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:• 0:发起写操作,不关心是否成功;• 1~n(n为集群最大数据节点数):写操作需要被复制到指定节点数才算成功;• majority:写操作需要被复制到大多数节点上才算成功。发起写操作的程序将阻塞到写操作到达指定的节点数为止默认行为w: “1”默认的writeConcern,数据写入到Primary就向客户端发送确认大多数节点确认模式w: “all”全部节点确认模式j:true。

2023-11-01 09:41:43 157

原创 MongoDB应用与开发

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。注意B-树中的B不是代表二叉(binary),而是代表平衡(balance),因为B-树是从最早的平衡二叉树演化而来,但是B-树不是一个二叉树。skip(), limit(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。平衡二叉树的查找性能是比较高的,但是维护一棵平衡二叉树的代价是非常大的。

2023-11-01 09:40:00 55

原创 SpringBoot中使用动态数据源和多数据源配置

这种方式的核心是使用Spring提供的AbstractRoutingDataSource抽象类,注入多个数据源。@Component@Primary // 将该Bean设置为主要注入Bean// 当前使用的数据源标识// 写库@Autowired// 读库@Autowired// 返回当前数据源标识@Override@Override// 为targetDataSources初始化所有数据源// 为defaultTargetDataSource 设置默认的数据源。

2023-11-01 09:34:53 359 1

原创 Redisson原理分析

加锁:首先使用lua脚本,使用hset将key设置到redis,leaseTime默认30s,如果加锁成功返回nil(null),如果加锁失败,返回这个key的超时剩余时间。如果ttl=25s,此时有1000个线程阻塞在tryAcquire,但是业务10s就执行完了,那么这1000个线程还会继续阻塞吗?此时,那些订阅这个channel的客户端就会收到通知,从而进到onMessage内。首先,那些抢锁失败的线程会订阅一个channel,当解锁成功会就会发布一个事件。

2023-11-01 09:29:08 500 1

转载 Kafka 到底会不会丢数据?

越来越多的互联网公司使用消息队列来支撑自己的核心业务。由于是核心业务,一般都会要求消息传递过程中最大限度的做到不丢失,如果中间环节出现数据丢失,就会引来用户的投诉,年底绩效就要背锅了。那么使用 Kafka 到底会不会丢数据呢?如果丢数据了该怎么解决呢?为了避免类似情况发生,除了要做好补偿措施,我们更应该在系统设计的时候充分考虑系统中的各种异常情况,从而设计出一个稳定可靠的消息系统。

2023-11-01 09:25:09 102 1

原创 Netty内存泄漏原理

Netty内存泄漏原理

2023-11-01 09:21:39 206 1

原创 Netty内存管理系统原理八

Netty内存管理系统原理八

2023-11-01 09:20:44 60 1

原创 Netty内存管理系统原理七

如果是别的线程,是不能push到别的线程的Stack的,会放到线程本地的一个WeakHashMap里面,key是Stack,value是一个Link链表,把对象放到Link链表中,当Recycler去拿对象的时候,本地线程的Stack中没有了,就会找到head指向的链表,从Link中取出那些待回收的对象,把他们转移到本地的Stack中,这个WHM是一个单消费者,单生产者模型,不会有并发安全问题,即使在极端的情况下,也不会出现,顶多拿不到就new一个新的对象返回。

2023-10-31 17:02:17 42 1

原创 Netty内存管理系统原理六

理论上来说,如果想减少内存碎片,分配的时候应该优先从75%的Chunk去分配,但是如果从最小的里面去分配,那就很有可能分配失败,还要重试多次,上多次锁,所以取了个折中值,先从50%里去分配。如果连50都分配不成功,那说明空间不够,所以从空间利用率25%的里面去分配,以此类推。池化是我们提升性能的手段之一,比如线程池、内存池以及接下来讲的对象池。池化的作用目的是减少创建和销毁对象的开销,提高并发处理能力,而且利用池化也可以降低 GC 压力。

2023-10-31 17:01:44 31 1

原创 Netty内存管理系统原理五

如果是fastGet,那么就把FastThreadLocalThread内部的InternalThreadLocalMap直接返回,如果为空就创建一个新的。DefaultThreadFactory在创建线程时默认使用的是FastThreadLocalThread,那么为什么叫Fast呢?如果是slowGet,那么就是把InternalThreadLocalMap放到了原来的ThreadLocal里。可以看到第15行使用的是与运算得到数组下标。

2023-10-31 17:01:05 32 1

原创 Netty内存管理系统原理四

当分配了一个8KB后,子页的maxOrder变为12,父页16KB变为11,所以满足memoryMap[id] > depth_of_id,已经分配了一个子页。memoryMap和depthMap在初始化的时候是一模一样的,所以memoryMap[id] = depth_of_id表示还没有被分配。当 memoryMap[id] = maxOrder + 1也就是=12时,表示已经分配完了。正常来说,32KB页应该等于13才对,但是实际却是12。depth_of_id作为参照物,是不变的。

2023-10-31 17:00:15 41 1

原创 Netty内存管理系统原理二

netty4.1.44之前的版本是jemalloc3,之后的版本都是经过优化之后的jemalloc4。

2023-10-31 16:59:32 39 1

原创 Netty内存管理系统原理一

设置为一个线程也可以,只不过这一个线程既处理连接事件,又处理读写事件,那有多个行不行呢?多个也可以,当调用一些方法时,或者处理timeEvent,就会调用next(),这时就增加了性能。Netty 提供一个专门用来操作缓冲区(即 Netty 的数据容器)的工具类。说白了就是一个工具类,使用门面模式,可以创建池化和非池化的ByteBuf,屏蔽了细节。如果使用业务线程调用了write方法,那么netty会检查是否在事件循环组中,如果不在,那么封装成一个任务丢到线程组的队列中。

2023-10-31 16:58:47 47 1

原创 Netty事件循环组源码六

tomcat的启动器Bootstrap,它是一个外部独立部署tomcat的启动器,Server.xml最终会返回一个配置好的Server对象,假如我的tomcat是嵌入到Spring中的, 那么我是不需要这个启动器的,因为Spring自己搞了一个启动器,来做了Server.xml的配置工作,这里主要看一下AbstractApplicationContext的refresh方法,正方法内会调用一个onRefresh();ChannelHandler原理。

2023-10-31 16:57:44 59 1

原创 Netty事件循环组原理五

AbstractEventExecutorGroup只是对接口进行了抽象实现,将部分方法的实现的委托给next()方法返回的EventExecutor,但是没具体实现next()方法。

2023-10-31 16:56:52 78 1

原创 Netty之整体概念分析四

这里的ServerSocketChannel为什么不用ServerSocket?

2023-10-31 16:55:50 37 1

空空如也

空空如也

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

TA关注的人

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