- 博客(238)
- 资源 (7)
- 收藏
- 关注
原创 MYSQL索引理解
MYSQL索引本质帮助高效查询的一种数据结构 数据存储在磁盘中,每次默认查询一页大小16K二叉搜索树,平衡二叉搜索树(缺点)(父节点至多只有2个子节点)最坏情况:单边树/高度多,层数多,查询效率很低。(数据量大情况下) 查询很多次,IO次数很多,开销大。三、B-Tree (多叉,多路平衡树) 特性:每个节点包括:关键字索引,数据区,指针。 高度降低,原来只有俩个路,现在多路,可以放更多节点。 每个节点放更多数据指针,水平扩展。B+Tree特性:只有叶子节点放的数据,非叶子..
2022-03-13 23:57:47
428
2
原创 Java Future与CompletableFuture的用法、区别
Future的用法多线程场景时,一般是实现runnable接口,覆写run方法,返回值是void类型,因此这种情况下不需要线程的返回结果。如果需要线程的返回结果,就需要用callable接口来代替了。callable用法和runnable一样,只不过覆写的是call方法,该方法有一个泛型返回值类型,可以根据需要指定。那么何时到Future呢?当你启动callable线程时,就可以声明一个Future对象,用于接收返回结果。Futrue可以监视目标线程调用call的情况,当你调用Future的...
2021-08-27 12:07:14
1018
转载 架构即未来--AKF 可扩展立方体
我是一个服务,我的名字叫闪客。我提供的服务很简单,给我一个标题,我输出一篇文章, 日复一日,年复一年。X但随着粉丝数的不断增多,我对文章的质量也有了更加严格的要求,所以我很容易累死,累死了就会鸽文。为了防止这种情况发生,我使用了我的技能,分身术。我分出了 N 多个和我一模一样的服务,平时他们不干活,但当我累死的时候,他们随时顶上来。当然,他们也可以和我一起干活,或者帮我干一部分活,分担一下我的压力,减少我累死的概率。这样,我通过简单的分身之术,就..
2021-07-12 11:49:58
1344
1
转载 内容建设--关注流
有这样一个场景,需要你来做个架构设计。一、有一群作者,可以发布文章。二、有一群用户,可以关注作者。三、用户有一个页面,可以展示所关注作者发布的文章,并且按发布时间排序。好吧,其实就是简化版的公众号消息列表。作者就是一个个的公众号,用户就是可爱的你,而这个展示的关注流列表,就是我们手机微信上点开订阅号消息后的部分。这回熟悉了吧。你会怎么设计呢?先把表设计出来首先有三表是必须的,用来存储元信息,毋庸置疑。作者表:存储作者的信息
2021-07-12 11:40:29
318
原创 2021张家界五一出行攻略
一.天气 早晚温差较大,出门带价厚一点的外套,小小着凉,白天光照也较强,防晒霜也要备,有时会下雨,雨伞也不要忘了。二.旅游路线张家界游玩分为三大块景点:1.武陵源景区(张家界森林公园)「张家界核心景点,景点主要有天子山,黄石寨,十里画廊,金鞭溪,袁家界等,建议游玩2~3天,门票:淡季 成人139,学生票71;旺季 成人248,学生票168」2.天门山景区「拥有亚洲最长索道,世界公路奇观,玻璃栈道等,建议游玩时间半天,门票:成人258,学生票155.(包括了往返的索道,..
2021-05-01 00:07:09
1124
5
原创 分布式系统的技术栈
构建分布式系统的目的是增加系统容量,提高系统的可用性,转换成技术方面,也就是完成下面两件事。大流量处理。通过集群技术把大规模并发请求的负载分散到不同的机器上。关键业务保护。提高后台服务的可用性,把故障隔离起来阻止多米诺骨牌效应(雪崩效应)。如果流量过大,需要对业务降级,以保护关键业务流转。说白了就是干两件事。一是提高整体架构的吞吐量,服务更多的并发和流量,二是为了提高系统的稳定性,让系统的可用性更高。提高架构的性能咱们先来看看,提高系统性能的常用技术。缓存系统。加入缓存系统,可以有.
2021-04-20 23:22:26
264
原创 Java数值计算精度、舍入和溢出问题
1. “危险”的 Double 先从简单的反直觉的四则运算看起。对几个简单的浮点数进行加减乘除运算System.out.println(0.1+0.2);System.out.println(1.0-0.8);System.out.println(4.015*100);System.out.println(123.3/100);double amount1 = 2.15;double amount2 = 1.10;if (amount1 - amount2 == 1.05) ..
2021-03-28 15:49:51
993
原创 线程重用导致用户信息错乱--Threadlocal
线程重用导致用户信息错乱1.业务案例 ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。如果用户信息的获取比较昂贵(比如从数据库查询用户信息),那么在 ThreadLocal 中缓存数据是比较合适的做法。但为什么会出现用户信息错乱的Bug呢? // imitate saveUserInfo private static final ThreadLocal<Integer> currentUser = ThreadLocal.withInitial.
2021-03-24 21:15:20
1355
转载 阿里RocketMQ如何解决消息顺序&重复?
分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ有哪些关键特性?其实现原理是怎样的?关键特性及其实现原理一、顺序消息消息有序指的是可以按照消息的发送顺序来消费。例如:一笔订单产生了 3 条消息,分别是订单创建、订单付款、订单完成。消费时,要按照顺序依次
2021-03-16 11:32:01
544
转载 MySQL数据实时同步到Hive的架构与实践
背景在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据。在互联网企业中,常见的ODS数据有业务日志数据(Log)和业务DB数据(DB)两类。对于业务DB数据来说,从MySQL等关系型数据库的业务数据进行采集,然后导入到Hive中,是进行数据仓库生产的重要环节。如何准确、高效地把MySQL数据同步到Hive中?一般常用的解决方案是批量取数并Load:直连MySQL去Select表中的数据,然后存到本地文件作为中间存储,最后把文件Lo
2021-02-25 10:05:20
3106
7
原创 高并发场景--缓存与数据库数据一致性解决方案
一、业务背景在高并发的业务场景下,数据库是相对薄弱的环节,通常用户请求先访问到redis。如下图:业务场景1:从Redis缓存读数据业务场景2:数据库和缓存更新 一般设计数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。举一个例子:1.如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读...
2021-02-23 21:04:10
523
3
转载 深入理解--ES之倒排索引
正向索引(forward index),反向索引(inverted index)更熟悉的名字是倒排索引。在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合。例如“文档1”经过分词,提取了20个关键词,每个关键词都会记录它在文档中的出现次数和出现位置。得到正向索引的结构如下:“文档1”的ID > 单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表;…………。“文档2”的ID > 此文档出现的关键词列表。一般是通过key,...
2021-01-29 14:48:00
2034
原创 深入理解--Threadlocal原理,及可能导致内存泄露
一.原理(1)什么是ThreadLocal变量?ThreadLoal 变量,线程局部变量,ThreadLocal 提供了线程本地的实例,它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。总的来说,ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。(2)ThreadLocal内部数据结构首先 Th
2021-01-23 20:33:11
354
转载 【Java进阶】并发编程
1. 概述三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到。缓存可导致可见性问题。 原子性:一个或多个CPU执行操作不被中断。线程切换可导致原子性问题。 有序性:编译器优化可能导致指令顺序发生改变。编译器优化可能导致有序性问题。 三个问题 安全性问题:线程安全 活跃性问题:死锁、活锁、饥饿 性能问题: 使用无锁结构:TLS,Copy-On-Write,乐观锁;Java的原子类,Disruptor无锁队列 减少锁的持有时间:让锁细粒度。如Concurr
2021-01-13 23:17:50
113
转载 52条SQL语句性能优化策略
本文会提到 52 条 SQL 语句性能优化策略。1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引。2、应尽量避免在WHERE子句中对字段进行NULL值判断,创建表时 NULL 是默认值,但大多数时候应该使用 NOT NULL,或者使用一个特殊的值,如 0,-1 作为默认值。3、应尽量避免在WHERE子句中使用 != 或 <> 操作符。MySQL 只有对以下操作符才使用索引:<,<=,=...
2020-12-29 09:00:05
116
转载 总结Minor GC、Full GC触发条件
GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。GC机制要准确理解Java的垃圾回收机制,就要从:“什么时候”,“对什么东西”,“做了什么”三个方面来具体分析。第一:“什么时候”即就是GC触发的条件。GC触发的条件有两种。(1)程序调用System.gc时可以触发(会建议JVM进行垃圾回收,不代表一定会进
2020-12-18 16:52:41
809
2
原创 深入理解RocketMQ事务源码--TransactionMQProducer、TransactionListener
前言上篇文章,介绍了RocketMQ消息类型支持事务消息,常见用在分布式系统中,保证数据的一致性。接下来一起去走进 TransactionMQProducer、TransactionListener俩个核心类
2020-12-16 18:34:19
4105
1
原创 深入理解RocketMQ--基础知识
1.简介 消息队列RocketMQ版是阿里云基于Apache RocketMQ构建的低延迟、高并发、高可用、高可靠的分布式消息中间件,可为分布式应用系统提供异步解耦和削峰填谷的能力。2.核心概念nameserver:主要管理Broker、路由信息管理Broker,接受来自Broker集群发送的注册,以及提供心跳机制来检查Broker是否还存活。 管理路由信息,每一个NameServer都存储有路由信息和队列信息,提供给Producer和Consumer查询broker:主要负责...
2020-12-16 15:54:00
433
原创 深入理解RocketMQ--事务消息
消息队列RocketMQ版提供的分布式事务消息适用于所有对数据最终一致性有强需求的场景。本文介绍消息队列RocketMQ版事务消息的概念、优势、典型场景、交互流程以及使用过程中的注意事项。概念介绍事务消息:消息队列RocketMQ版提供类似X或Open XA的分布式事务功能,通过消息队列RocketMQ版事务消息能达到分布式事务的最终一致。 半事务消息:暂不能投递的消息,发送方已经成功地将消息发送到了消息队列RocketMQ版服务端,但是服务端未收到生产者对该消息的二次确认,此时该消息被标记成“暂
2020-12-16 11:29:23
356
原创 Linux RocketMQ搭建、及常用命令
首先进入进入/RocketMQ/bin 在该目录下有个 mqadmin 脚本 .查看帮助: 在 mqadmin 下可以查看有哪些命令 a:查看具体命令的使用 :sh mqadmin b: sh mqadmin help 命令名称 例如,查看 updateTopic 的使用sh mqadmin help updateTopic2. 关闭nameserver和所有的broker: 进入到bin下: sh mqshutdown namesr...
2020-12-11 11:04:30
708
转载 RabbitMQ如何保证幂等性
幂等性是分布式系统设计中的一个重要概念,是在做系统或者接口设计时要着重考虑的问题,尤其像支付宝、银行、互联网金融等涉及钱的系统,既要高效,数据也要准确,绝对不能出现多扣款,多打款等问题,幂等性的设计就显得更为重要了。本文我们就先来解释一下什么是幂等性?然后再看一下在MQ中怎么保证幂等性?一、什么是幂等?幂等性的实质是:对于一个资源,不管你请求一次还是请求多次,对该资源本身造成的影响应该是相同的,不能因为重复相同的请求而对该资源重复造成影响。注意关注的是请求操作对资源本身造成的影响,而不是请求资源
2020-11-30 22:09:32
2757
转载 基于RocketMQ的分布式事务解决方案
前言在系统变的复杂后,分布式、微服务等架构技术,就要考虑到应用在系统中了。尤其数据量大了后,就需要对数据库进行拆分。如:注册的用户数据,量大了后,就需要考虑分库分表一旦数据库进行了分拆,那就出现很多头疼的问题,其中之一就是事务问题。那我们就来看看问题是怎么出现的?场景先来上个图进行数据拆分后,就类似上面的架构上图中我们就拿用户的数据进行举例,用户量一旦几千万时,就需要进行分库分表;上图就分了3个库,每个库都保证了高可用。这样的架构设计,会遇到事务问题,..
2020-11-30 22:07:26
115
转载 基于Redis实现Springcloud Gateway动态路由
1. 将 actuator 端点暴露出来management: endpoints: web: exposure: include: "*"2. redis 配置https://www.cnblogs.com/idea360/p/12632801.html3. 将原内存路由持久化到 redis@Componentpublic class RedisRouteDefinitionRepository implements RouteDefin
2020-11-20 17:21:58
709
原创 MySQL主从同步,及Canal实时数据库同步
1.简介 Linux下MySQL数据库的主从同步用来实现读写分离。主数据库进行数据的插入,删除与更新;从数据库专门用来查询操作,缓解数据库的压力。让运行海量数据的时候无论是从速度还是效率上都大大提高,Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。2.主从同步原理 Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来...
2020-10-19 22:33:11
2285
2
原创 深入理解--CAS算法原理
1、CAS介绍CAS:Compare and Swap,即比较再交换,而。在java.util.atomic包下,找一个原子操作类AtomicInteger,CAS源码如下:valueOffset (该变量在内存中的偏移地址) expect(预期值) update(新值)/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expec
2020-09-26 23:44:19
327
转载 深入理解Dubbo--Provider线程池
最近在进行下单压测的时候发现,当调用下单服务的并发量比较高的时候,大部分都失败了,只有200个下单可以成功(protocol采用默认配置?在调研测试了一番之后发现了一些问题,首先我们从dubbo的Dispatcher开始分析: dubbo默认使用netty进行通讯,在dubbo中,NettyHandler、NettyServer、MultiMessageHandler、HeartbeatHandler都实现了ChannelHandler接口,来实现接收、发送、连...
2020-09-25 17:22:07
2093
2
转载 深入理解线程池--ThreadPoolExcutor
线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的。ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法:// 七个参数的构造函数public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTi...
2020-09-25 16:07:07
932
原创 深入理解Dubbo--架构
节点角色说明节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的调用次数和调用时间的监控中心 Container 服务运行容器 调用关系说明服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者...
2020-09-14 22:42:07
149
原创 深入理解Dubbo--服务调用过程
分布式服务框架的Dubbo我们通过一张图了解 Dubbo 服务调用过程(1)首先消费者通过代理对象Proxy发起请求 (2)接着通过客户端Client,将请求的数据进行编码(序列化)之后,通过网络socket发送给服务端Server (3)服务端接收到请求之后,将请求的数据进行解码(反序列化)之后,送到分发器Dispather (4)然后分发器将请求派发到置顶的线程池上 (5)最后由线程池调用具体的服务 (6)至于响应和发送此图就不作展示...
2020-09-14 22:32:47
228
原创 深入理解Spring--动态代理(Jdk和Cglib)
一、原理区别:java动态代理:是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。cglib动态代理:是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换ii...
2020-08-05 22:39:19
348
原创 深入理解Spring--AOP设计原理
一.前言 众所周知,Spring重要的组件之一:AOP(面向切面编程),接下来,一起去深入理解AOP的设计原理,不足知足,望指教。
2020-08-05 00:04:33
408
原创 深入理解JVM--虚拟机栈执行过程
虚拟机中Main主线程在执行内,栈的执行过程如下图: 从线程栈的角度来看,JVM基本单位是方法调用;实际上,JVM执行的最基本单位的指令(即原子操作)是汇编语言性质的机器字节码。
2020-08-04 22:50:45
481
原创 深入理解数据库事务隔离级别--Mysql默认选择可重复读
为什么Mysql默认选择可重复读?Mysql主从复制,是基于binlog复制的;而binlog是一个记录数据库更改日志文件.binlog有三种格式,分别是statement:记录的是修改SQL语句 row:记录的是每行实际数据的变更 mixed:statement和row模式的混合Mysql5.0版本以前,binlog只支持STATEMENT这种格式!而这种格式在读已提交(Read Commited)隔离级别下,主从复制是有bug的,因此Mysql将可重复读作为默认的隔离级别。当binlog
2020-08-01 00:34:45
329
原创 深入理解数据库事务--脏读、不可重复读,幻读
一.数据库的ACID原子性:一个事务执行过程中,所有步骤要么全部成功,或者全部回滚失败,不能执行其中一部分。一致性:从一种状态,执行该事务后,转变为另外一种正确状态 。隔离性:为了有效保证并发读取数据的正确性,提出的事务隔离级别。包括:读未提交,读已提交,可重复度,串行化。持久性:事务执行成功之后,数据不能更改。二. 1、脏读 脏读即为事务1第二次读取时,读到了事务2未提交的数据。若事务2回滚,则事务1第二次读取时,读到了脏数据。 2、不可重复读 不可重复...
2020-07-31 23:56:20
685
1
原创 深入理解redis--应对阻塞
(一)耗时长命令造成阻塞 1. keys、sort,save等命令 keys命令用于查找所有符合给定模式 pattern 的 key,时间复杂度为O(N), N 为数据库中 key 的数量。当数据库中的个数达到千万时,这个命令会造成读写线程阻塞数秒;类似的命令有sunion sort等操作;实际需求中一定要使用keys、sort等操作怎么办?解决方案: 在架构设计中,有“分流”一招,可以看我《高并发之应用限流思路》,简单来说:将请求类型进行分类设计,可以理解为设计不同的通道...
2020-06-20 13:44:21
574
转载 深入理解Redis--主从复制
1、Redis单机部署有什么问题?(1)机器故障服务器挂掉了;CPU坏掉了;主板坏了啊;(2)容量瓶颈比如我们服务器有16G内存,但是我们有一个需求需要60G内存,显然不能满足我们的需求,那是不是我们就去买更好的机器呢?比如可以买128G或者更大的机器,但是我们单台机器的内存容量总是有极限的,又不能无限扩容。(3)QPS瓶颈Redis官网号称可以达到10w QPS,但是现在我们系统业务需要QPS达到10...
2020-06-20 11:54:33
203
转载 深入理解Redis--子进程开销与优化
1、CPU(1)开销RDB和AOF文件生成,属于CPU密集型(2)优化(1)不做CPU绑定,也就是不把redis进程绑定在一个CPU上;(2)不和CPU密集型服务部署在一起;2、内存(1)开销fork内存开销,copy-on-write(2)优化(1)linux内核优化,禁止使用:echo never > /sys/kernel/mm/transparent_hugepage/enable,禁止...
2020-06-20 11:52:40
319
转载 深入理解Redis--fork操作
1、fork操作(1)同步操作 虽然fork同步操作是非常快的,但是如果需要同步的数据量过大(比如超过20G),fork就会阻塞redis主进程。(2)与内存量息息相关 内存越大,fork同步数据耗时越长,当然也跟服务器有关,服务器有物理机,也有虚拟机。(3)info:latest_fork_usec 使用此命令可以查看持久化花费的时间,如果持久化时间过长,就会造成卡顿。 例如:如果redis此时QPS上万,此时redis正在持久化...
2020-06-20 11:50:12
6463
3
原创 深入理解Redis持久化--RDB和AOF
Redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。Redis提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。一、持久化流程(1)客户端向服务端发送写操作(数据在客户端的内存中)。(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。(3)服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。(4)操作系统将缓冲区中的数据转移到磁...
2020-06-20 11:38:25
290
原创 深入理解Hbase--简介
一、介绍HBaseApacheHBase™ is theHadoopdatabase, a distributed, scalable, big data store.HBase is a type of "NoSQL" database.Apache HBase 是 Hadoop 数据库,一个分布式、可伸缩的大数据存储。HBase是依赖Hadoop的。为什么HBase能存储海量的数据?因为HBase是在HDFS的基础之上构建的,HDFS是分布式文件系统。二、为什么要用HBas...
2020-06-19 01:01:13
318
torque-4.2.0-snap.201302040907.tar.gz
2020-06-11
maui3.3.1.0.tar.gz
2020-06-11
Centos7 python2.7和yum资源包
2020-04-22
基于安卓开发医疗诊断系统(含设计文档和源码)
2020-01-03
友盟消息推送 Java服务端Push SDK
2018-08-31
Ztree官方API及实例教程
2018-03-19
(免费)spring boot 2.0.0 M4 官网文档下载
2017-09-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人