自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

谈少华的博客

主要用于描述JAVA相关的知识总结和整理

  • 博客(142)
  • 资源 (2)
  • 收藏
  • 关注

原创 logTracker错误日志跟踪组件(二)

1.client的作用:针对代码执行的过程出现错误日志,打印的logger.error()里的日志进行统一拦截,按照一定的规则封装成数据发送到服务端;2.原理介绍利用log4j2提供的扩张功能,主要是扩展log4j2的相关扩展点@Plugin(name = "LogTracker", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)public class Log

2022-02-03 15:53:07 1101

原创 logTracker错误日志跟踪组件(一)

1.背景目前的报警系统不能具体的定位到某个服务,具体的机器以及具体的方法,针对此问题对公司使用的log4j2进行扩展,将相关的异常信息进行捕获,并快速主动的进行通知和持久化;2.解决问题开发一个轻量级的错误日志通知,收集组件,实现主动通知的目的;3.业务痛点无法知道某一个服务的某一台机器会出现异常情况; 线上出现问题,无法快速的定位到某一个方法及类; 实现上线验证过程中,出现异常的快速报警;4.原理过程拦截错误日志: 将异常信息进行封装,包含内容:时间,appName

2022-02-02 08:12:18 519

原创 二分法核心思想

力扣:704. 二分查找给定一个n个元素有序的(升序)整型数组nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1...

2022-01-01 06:13:43 257

转载 微服务网关方案调研

综述经调研,使用Spring Cloud Zuul解决方案的占多数,已经能满足绝大多数公司需求。但除了一些超级公司外,比如阿里,京东,他们是自己撸的一套网关。此外,点评直接采用的nginx负载均衡前置网关,而没用第七层网关,原因据说是七层网关会影响性能,但由于对其架构不甚了解,所以也不得而知。一 各企业网关调研1 京东: tomcat sevelet ,基于netty自研京东商API网关实践目前大部分服务位于tomcat,但由于tomcat只能同步,所以正在向netty一步步迁移

2021-08-04 16:30:08 293

原创 二叉树遍历--深度优先及广度优先

public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int value){ this.value = value; } } TreeNode root; public BinaryTree(int[] array.

2020-12-10 10:30:23 295

原创 MYSQL系列---默认隔离级别所引发的问题

1.事务的隔离级别:1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数

2020-05-23 19:53:37 1311 3

原创 redis常见应用场景

场景应用场景介绍:string应用场景:分布式锁setnx 1001 true实现分布式锁。接下来再有线程就不会执行的做完减库存的操作,删掉该key,redis中就不会出现该key了。文章浏览量:就用INCR 和 DECRINCR article:readcount:1000不用考虑数据库并发问题。Hash场景:购物车场景:...

2020-01-23 21:48:25 420 1

转载 Spring扩展点总结

经历了一系列复杂的spring应用后,你的项目可能已经用上注解,也用上了xxx.properties,你对这神奇的用法感到欣喜,但你不知道他是怎么被实现的,现在就让我们来揭开这些神秘的面纱。BeanDefinition与BeanFactory扩展在Spring生成bean的过程这篇文章中,我们了解了spring在生成bean前会先生成bean的定义,然后注册到BeanFactory中,再之...

2020-01-14 12:40:44 348

原创 Redis应用项目---抢红包功能(四)

拆红包的核心功能:拆红包功能是整个功能的核心,红包计算逻辑:剩余金额/剩余红包个数 * 2,这里有个一个点,如果保证剩余金额和剩余红包个数同时等于0,特别是在并发的情况下。核心代码:public RetDTO<?> getRedPacketMoney(int uid, long redPacketId){ //这里判断用户是否已经抢过红包了,以及是否还有红...

2019-12-26 17:14:58 5536 1

原创 Redis应用项目---抢红包功能(三)

抢红包逻辑及核心代码:先判断用户有没有抢过红包,如果没有则进行第二步 判断红包个数,如果>0 则直接返回数量 判断红包金额,如果>0则直接返回金额核心代码说明:这里特别需要说明的,redis的相关操作,全部用的lua脚本,这么做完全是为了提高性能以及降低代码的复杂度。这需要开发者对lua脚本有一定的理解,如果对lua不懂的,可以简单学习一下,本人也是做此功能的时候现学...

2019-12-26 17:07:49 5110

原创 Redis应用项目---抢红包功能(二)

发红包逻辑及核心代码:需要保证红包id的唯一性,此次用的是雪花算法,完全能够保证唯一性,关于分布式事务的唯一性ID,可以给大家推进一篇我写的博客,里面有多种唯一性ID的介绍:https://blog.csdn.net/zhuyanlin09/article/details/91945444 保证数据一致性,redis和DB的落库要保证一致性,这里写出来了,只是没有去具体实现,这里可以顺序执行...

2019-12-26 17:00:14 5222

原创 Redis应用项目---抢红包功能(一)

开篇:之前也看过一些相关的书籍,最近又在学习redis的相关知识,不过这次偏实战一些,花了几天时间做了一个抢红包的功能,把设计的思路以及最终的源码贴出来给大家分享一下,本人自己自测了一下,能非常清楚的支持10000以上的QPS,估计还能支持更高,(特别说明,这里要抛去数据库,因为数据库在插入的时候存在明显瓶颈,本人机器4核8G),压测是利用Jmeter读取脚本的形式进行压测,此次测试,源码,数...

2019-12-26 16:43:07 5616

原创 elasticsearch从入门到入门系列(五)---集群的世界

1.基本核心概念Cluster 集群:⼀个 Elasticsearch 集群由⼀个或多个节点(Node)组成,每个集群都有⼀个共同的集群名称作为 标识。 Node节点 ⼀个 Elasticsearch 实例即⼀个 Node,⼀台机器可以有多个实例,正常使⽤下每个实例应该会部署在不同的机器上。Elasticsearch 的配置⽂件中可以通过 node.master、node.data 来设置...

2019-11-18 21:16:54 9587

原创 elasticsearch从入门到入门系列(四)---搜索高级使用

1.es索引的别名使用在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了 适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整,甚⾄是重建索 引。⽽做这些操作的时候,可能会对业务造成影响,甚⾄是停机调整等问题。由此,es提供了索引 别名来解决这些问题。 索引别名就像⼀个快捷⽅式或是软连接,可以指向⼀个或多个索引,也可 以给任意⼀个需要索引...

2019-11-18 09:10:45 6718

原创 elasticsearch从入门到入门系列(三)---搜索大汇总

1.term的多种查询介绍: 单词级别的查询 这些查询通常用于结构化的查询,比如:number,date,keyword等,而不是text 也就是说,全⽂本查询之前要先对⽂本内容进⾏分词,⽽单词级别的查询直接在相应字段的 反向索引中精确查找,单词级别的查询⼀般⽤于数值、⽇期等类型的字段上 Term Query精确匹配查询(查找号码为23的球员)请求: POST ...

2019-11-14 08:40:14 6552

原创 elasticsearch从入门到入门系列(二)---快速入门C

1.分词器的介绍和使用什么是分词器 将用户输入的一段文本,按照一定逻辑,拆分为多个词语的一种工具 常见的内置分词器 standard analyzer:标准分析器器是默认分词器器,如果未指定,则使⽤用该分词器器。 请求: POST localhost:9200/_analyze { "analyzer": "standard", ...

2019-11-11 22:11:36 6748

原创 elasticsearch从入门到入门系列(二)---快速入门B

1.文档操作新增文档请求(一): PUT localhost:9200/nba/_doc/1 (指定id) { "name": "哈登", "team_name": "⽕火箭", "position": "得分后卫", "play_year": "10", "jerse_no"...

2019-11-11 21:50:22 6001

原创 elasticsearch从入门到入门系列(二)---快速入门A

1.核心概念介绍索引(index):一个索引可以理解成一个关系型数据库 类型(type): 一种type就像一个类表,比如user表,order表 注意 ES 5.X中一个index可以有多种type ES 6.X中一个index只有一种type ES 7.X中已经移除了type的概念 映射(mapping):mapping定义了每个字段的类型等信息,相当于...

2019-11-11 15:34:18 4879

原创 elasticsearch从入门到入门系列(一)---简单介绍及安装

1.什么是搜索引擎全⽂文搜索引擎是⽬目前⼴广泛应⽤用的主流搜索引擎。它的⼯工作原理理是计算机索引程序通过扫描⽂文章中的每⼀一个词,对每⼀一个词建⽴立⼀一个索引,指明该词在⽂文章中出现的次数和位置,当⽤用户查询时,检索程序就根据事先建⽴立的索引进⾏行行查找,并将查找的结果反馈给⽤用户的。2.常见搜索引擎LuceneLucene是⼀一个Java全⽂文搜索引擎,完全⽤用Java编写。L...

2019-11-11 10:53:48 5088

原创 Netty系列---源码实例

服务端代码:package com.tsh.common.learn.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.Chan...

2019-10-24 20:43:25 5509

原创 Netty系列---线程模型与Reactor 模式

Netty的线程模型是基于NIO的Selector构建的,使用了异步驱动的Reactor模式来构建的线程模型,可以很好的支持成百上千的 SocketChannel连接。由于 READ/WRITE都是非阻塞的,可以充分提升I/O线程的运行效率 ,避免了IO阻塞导致线程挂起,同时可以让一个线程支持对多个客户端的连接SocketChannel的 READ/WRITE 操作,从根本上解决了传...

2019-10-24 20:01:50 4001

原创 Netty系列---IO多路复用技术

形成的原因:如果一个I/O流进来,我们就开启一个进程处理这个I/O流。那么假设现在有一百万个I/O流进来,那我们就需要开启一百万个进程一一对应处理这些I/O流(——这就是传统意义下的多进程并发处理)。思考一下,一百万个进程,你的CPU占有率会多高,这个实现方式及其的不合理。所以人们提出了I/O多路复用这个模型,一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力。...

2019-10-24 19:52:42 6631

原创 Netty系列---网络IO模型

网络IO的本质就是socket流的读取,通常一次IO读操作会涉及到两个对象和两个阶段。两个对象分别是:用户进程(线程)Process(Thread)内核对象 Kernel两个阶段:等待流数据准备(wating for the data to be ready);从内核向进程复制数据(copying the data from the kernel to the process);...

2019-10-24 19:39:27 4004

原创 JVM系列---对象的创建,定位及访问

Java对象创建底层原理1.虚拟机遇到一条new指令时,首先检查这个对应的类能否在常量池中定位到一个类的符号引用;2.判断这个类是否已经被加载,解析,初始化3.为这个新生对象在java堆中分配内存空间,其中分配内存空间的方式有两种 指针碰撞:分配内存空间包括开辟一块内存和移动指针两个步骤;非原子步骤可能出现并发问题,Java虚拟机采用CAS配上失败重试的方式保证更新操...

2019-10-07 15:05:06 3858 1

原创 RocketMQ系列---常见问题

1.RocketMQ如何避免重复消费?RocketMQ本身不保证消息重复消费,如果业务有要求不能重复消费,需要在自身的业务处理,常见的操作有两种;接口幂等,消费端业务消息保持幂等性,例如redis的setNx()命令,当然要注意设置key的超时时间,以及key的唯一性。 redis的Incr命令,确定消息的唯一值,在set之前先判断值是否存在,同时也是需要注意超时时间。2.Rocket...

2019-10-02 13:54:41 5105 2

原创 RocketMQ系列---事务消息

简单总结:通过保证“消息发送”与本地事务的原子性,而消息的订阅则交由MQ本身的机制实现。执行流程说明:Producer向borker发送消息; 服务端将消息持久化后,向发送方确认消息已经发送成功后,此事为半消息。 发送方开始执行本地事务逻辑。 发送方根据本地事务执行结果向服务端二次确认(Commit或者Rollback),服务端收到commit状态则半消息标志为可投递,订阅方最终...

2019-10-02 11:50:30 4170 2

原创 RocketMQ系列---消息消费者及消费方式

1.消息消费public class Consumer { public static void main(String[] args) throws InterruptedException, MQClientException { // 实例化消费者 DefaultMQPushConsumer consumer = new DefaultMQPushCon...

2019-10-01 09:04:40 13402 1

原创 RocketMQ系列---消息发送者及发送方式

RocketMQ发送三种类型消息:同步消息,异步消息和单向消息,其中前两种是可靠,因为会有发送是否成功的应答,而最后一种没有应答,一般用于可靠性要求比较低的情况,例如日志收集。1.Produce端发送同步消息:这种使用比较普遍,比如重要的消息通知,短信通知。public class SyncProducer { public static void main(String[] args...

2019-10-01 08:34:19 4533 2

原创 RocketMQ系列---集群模式架构分析

1.单master模式:优点:本地开发测试,配置简单,同步刷盘消息一条都不会丢失;缺点:不可靠,如果宕机,会导致服务不可用;2.主从(异步,同步双写)模式:优点:同步双写消息不丢失,异步复制存在少量丢失,主节点宕机,从节点可以对外提供消息的消费,但是不支持写入;缺点:主备有短暂的消息延迟,毫秒级,目前不支持自动切换,需要脚本或者其他程序进行检测,然后进行停止broker,重启让...

2019-09-30 16:43:27 3468 2

原创 RocketMQ系列---RocketMQ原理及架构

RocketMQ 核心组件图RocketMQ是开源的消息中间件,它主要由NameServer,Producer,Broker,Consumer四部分构成。NameServer:NameServer主要负责Topic和路由信息的管理,功能类似Dubbo的zookeeper。Producer:消息生产者,负责产生消息,一般由业务系统负责产生消息。Broker:消息中转角色,负...

2019-09-30 09:12:43 4639 1

原创 RocketMQ系列---MQ的好处

MQ简介什么是MQ 跨进程的消息队列,主要角色包括生产者与消费者。 生产者只负责生产信息,无法感知消费者是谁,消息怎么处理,处理结果是什么。 消费者负责接收及处理消息,无法感知生产者是谁,怎么产生的。作用及意义1.消息异步:上游直接调用下游缺点:上游关注执行结果,但执行时间很长 上游需要同步等待下游执行结果 下游系统故障导致上游系统无法使用 下游增加需修改上游代码...

2019-09-30 08:57:20 9058 1

原创 RocketMQ系列---RocketMQ,ActiveMQ,RabbitMQ,Kafka对比

本文将从多个维度综合对比Kafka、RabbitMQ、RocketMQ、ActiveMQ这4款当前最主流的MQ消息中间件产品,希望能为您的下一次产品的架构设计和MQ消息中间件选型提供参考依据。特点 RabbitMQ ActiveMQ Kafka RocketMQ 资料文档 资料数量多 资料数量多 资料数量中等 资料数量少,建议去官网上看 ...

2019-09-30 08:24:22 5196 1

原创 MySQL系列---锁的种类和概念

在mysql当中,关于innodb的锁类型总共可以分为四种,包含了行锁和表锁,分别是基本锁 - [ 共享锁(Shared Locks:S锁)和排它锁(Exclusive Locks:X锁)] 意向锁 - [ intention lock,分为意向共享锁(IS锁)和意向排他锁(IX锁)] 行锁 - [ record Locks、gap locks、next-key locks、Insert ...

2019-09-24 16:14:39 6207 1

原创 MySQL系列---索引(下)

索引的使用原则:索引由于其提供的优越的查询性能,似乎不使用索引就是一个愚蠢的行为了。但是使用索引,是要付出时间和空间的代价的。因此,索引虽好不可贪多。下面介绍几个索引的使用技巧和原则。1.写操作比较频繁的列慎重加索引:索引在提高查询速度的同时,也由于需要更新索引而带来了降低插入、删除和更新带索引列的速度的问题。一张数据表的索引越多,在写操作的时候性能下降的越厉害。2.索引越多占用磁...

2019-09-23 17:35:34 6128 1

原创 MySQL系列---索引(中)

常见索引种类(应用层面):1.主键索引:主键索引是唯一的,通常以表的ID设置为主键索引,一个表只能有一个主键索引,这是他跟唯一索引的区别。2.唯一索引:唯一索引主要用于业务上的唯一约束,他跟主键索引的区别是,一个表可以有多个唯一索引3.单列索引:以某一个字段为索引4.联合索引:两个或两个以上字段联合组成一个索引。使用时需要注意满足最左匹配原则!例如:比如在(a,b,c)三个字段...

2019-09-22 20:44:01 6158 1

原创 MySQL系列---索引(上)

什么是索引:索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,索引就相当于目录。当你在用新华字典时,帮你把目录撕掉了,你查询某个字开头的成语只能从第一页翻到第一千页。累!把目录还给你,则能快速定位!索引的优缺点:可以大大加快数据的检索速度,这也是创建索引的最主要的原因。,且通过使用索引,可以在查询的过程中,使用...

2019-09-22 20:30:31 6082 1

原创 MySQL系列---事务相关

什么是事务:什么是事务?事务是作为单个逻辑工作单元执行的一系列操作,通俗易懂的说就是一组原子性的 SQL 查询。事务的 ACID 属性原子性(Atomicity):作为逻辑工作单元,一个事务里的所有操作的执行,要么全部成功,要么全部失败。一致性(Consistency):数据库从一个一致性状态变换到另外一个一致性状态,数据库的完整性不会受到破坏。隔离性(Isolation):通...

2019-09-22 20:18:35 6096 2

原创 MySQL系列---explain解析

explain命令概述工作中,MySQL会记录执行时间比较久的SQL语句,找出这些SQL语句是第一步,重要的是查看SQL语句的执行计划,对于MySQL执行计划的获取,可以通过explain方式来查看,这条命令的输出结果能够让我们了解MySQL优化器是如何执行SQL语句的。MySQL优化器是基于开销来工作的,是在每条SQL语句执行的时候动态地计算出来的,命令用法十分简单, 在 SELECT ...

2019-09-22 15:41:13 4474 1

原创 Redlock:Redis分布式锁最牛逼的实现

普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx。后一种方式的核心实现命令如下:- 获取锁(unique_value可以是UUID等)SET resource_name unique_value NX PX 30000- 释放锁(lua脚本中,一定要比较value,防止误解锁)if red...

2019-09-22 15:05:46 1777 2

原创 MySQL系列---数据库引擎

MySQL 有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,下面对这两个引擎做一个简单的介绍。MyISAMMyISAM 是 MySQL 5.5.5 之前的默认引擎,它支持 B-tree/FullText/R-tree 索引类型。锁级别为表锁,表锁优点是开销小,加锁快;缺点是锁粒度大,发生锁冲动概率较高,容纳并发能力低,这个引擎适合查询为主的业务。此引擎不支...

2019-09-22 15:05:16 1881 2

myspring.rar

手工撸一个springIOC框架,对于理解springIOC的原理有很大的帮组,特别是想学习spring框架的同学,特别是spring的启动原理。

2020-01-11

抢红包源码及表结构完整代码.rar

改功能是一个抢红包的完整代码,包含了源码,大家可以下载下来玩一下,本人测试能够支持10000的QPS,特别说明一下,在去掉数据库的情况下,多机器的情况下完全可以支持更大的能力。

2019-12-26

空空如也

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

TA关注的人

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