MySQL学习笔记
MySQL 的基本架构要想探究 MySQL 的执行原理,首先要了解 MySQL 的基础架构,从中清楚看到 SQL 语句在 MySQL 的各个模块中的执行过程。
Server层涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
连接器第一步,先连接到数据库,这时候接待你的就是连接器。连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的:
1mysql -h$ip -P$port -u$user -p
连接命令中的mysql是客户端工具,用来跟服务端建立连接。在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。
如果用户名或密码不对,你就会收到一个”Access denied for user”的错误,然后客户端程序结束执行。
如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
因此,一个用户成功建立连接后,它的权限会维持在建立连接那一刻读到的 ...
对设计模式的理解
设计模式设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。同时设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案。
策略模式策略模式主要是会定义一系列的算法或策略,其中的算法和策略都是独立封装,互不影响的。通过策略模式,可以在运行时选择不同的策略进行匹配,而不需要修改客户端的代码。
我们可以参考 xxl-job 里的路由策略编写逻辑,其中的路由策略就是一个标准的策略模式例子。现给出 xxl-job 的路由策略结构图。
同时观察 xxl-job 的源码,XxlJobTrigger 中的 processTrigger() 方法中有一段关于路由策略的逻辑
根据传入的 jobInfo 获取到路由策略的参数
如果是分片广播,则for循环调用外部传入的index获取执行器地址并调用执行器。
反之根据参数获取路由策略调用获取对应地址并调用即可。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 ...
java8新特性
Java8 新特性Java8 新增了一些新特性,详情请参考 ORACLE官网—JDK8新增功能
本篇文章仅整理出常用的几个特性,日常开发中可灵活使用。
Lambda 表达式以前,我们可以使用Collections 工具类的 Comparator 比较器对给定的 List 集合进行排序。
123456789List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");Collections.sort(names, new Comparator<String>() { @Override public int compare(String a, String b) { return b.compareTo(a); }});
现在有了 lambda 表达式以后,推荐使用以下方法比较大小:
12Collections.sort(names, ( ...
浅谈RocketMQ负载均衡策略
消息队列存在生产者和消费者,其中RocketMQ的生产者和消费者都有分组。
生产者负载均衡生产者发送消息到RocketMQ时,RocketMQ将根据生产者负载均衡将消息均匀存储在多个队列中。
同步刷盘,只有在消息真正持久化至磁盘后RocketMQ的Broker端才会真正返回给Producer端一个成功的ACK响应。同步刷盘对MQ消息可靠性来说是一种不错的保障,但是性能上会有较大影响,一般适用于金融业务应用该模式比较多。
异步刷盘:能够充分利用OS的PageCache的优势,只要消息写入PageCache即可成功的将ACK返回给Producer端。消息刷盘采用后台异步线程提交的方式进行,降低了读写延迟,提高了MQ的性能和吞吐量。
RoundRobin模式对于非顺序消息(普通消息、定时/延时消息、事务消息),默认且只能使用RoundRobin模式。
生产者发送消息时,以消息为粒度,按照轮询方式将消息发送到指定主题中的所有可写目标队列中,保证消息尽可能均衡分布到所有队列。
故障规避策略当生产者某条消息发送失败时,RocketMQ会决定在接下来一段事件内,跳过本地失败队列所在节点 ...
RocketMQ重试机制
重试机制触发消息发送重试机制的条件如下:
客户端消息发送请求调用失败或请求超时
网络异常造成连接失败或请求超时。
服务端节点处于重启或下线等状态造成连接失败。
服务端运行慢造成请求超时。
服务端返回失败错误码
系统逻辑错误:因运行逻辑不正确造成的错误。
系统流控错误:因容量超限造成的流控错误。
消息重试时间间隔如下:
无序消息:重试时间为阶梯时间
顺序消息:重试时间为固定时间,默认为3s
RocketMQ的重试机制涉及发送端重试和消费端重试,消费端重试关联死信队列
发送端重试RocketMQ 在客户端中内置了请求重试逻辑,支持在初始化时配置消息发送最大重试次数(默认为 2 次),失败时会按照设置的重试次数重新发送。直到消息发送成功,或者达到最大重试次数时结束,并在最后一次失败后返回调用错误的响应。对于同步发送和异步发送,均支持消息发送重试。
同步发送:调用线程会一直阻塞,直到某次重试成功或最终重试失败(返回错误码或抛出异常)。
异步发送:调用线程不会阻塞,但调用结果会通过回调的形式,以异常事件或者成功事件返回。
我们也手动设置重试次数。代码示例如下:
123456p ...
初识RocketMQ
领域模型
消息由生产者初始化并发送到云消息队列 RocketMQ 版服务端。
消息按照到达云消息队列 RocketMQ 版服务端的顺序存储到主题的指定队列中。
消费者按照指定的订阅关系从云消息队列 RocketMQ 版服务端中获取消息并消费
RocketMO架构上主要分为四部分,如上图所示:
Producer:消息发布的角色,支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。
Consumer:消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费同时也支持集群方式和广播方式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求。
NameServer:NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。NameServer 互相独立,彼此没有通信关系,无状态。
主要包括两个功能:
Broker管理,NameServer接受Broker集群的注册信息并且保存下来作 ...
链表
链表203. 移除链表元素
1设置一个虚拟头结点,使得链表中所有元素的删除操作都统一
707. 设计链表
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293class MyLinkedList {public: // 定义链表节点结构体 struct LinkedNode { int val; LinkedNode* next; LinkedNode(int val):val(val), next(nullptr){} }; // 初始化链表 MyLinkedList() { _dummyHead = new LinkedNode(0); // ...
数组
数组二分35.搜索插入位置
1二分查找 + target不在数组中, return r + 1;
34.在排序数组中查找元素的第一个和最后一个位置
123456[3,4,6] target = 2或7,{-1,-1}[3,4,6] target = 4 {1,1}[3,4,6] target = 5 {-1,-1}2个二分查找 寻找左边界和右边界寻找左边界,nums[target] == target的时候更新right寻找右边界,nums[target] == target的时候更新left
69.x 的平方根
123直接二分查找[0,x] target = x / mid 特判 x == 0 || x == 1如果没找到 target, 直接返回 r (舍弃算术平方根的小数部分)
367.有效的完全平方数
12二分查找 [0,num] target = num , 判断 mid * mid == num?注意将变量设为 long long
双指针27. 移除元素
1使用快慢指针,快指针遍历整个数组,慢指 ...