自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

xzh_blog

哦~ 慢慢清晰

  • 博客(210)
  • 资源 (1)
  • 收藏
  • 关注

原创 阿里云OSS上传文件 工具类拿来直接用

准备:找运维创建存储空间Bucket,并获取账号信息endpoint、accessKeyId、secretAccessKey注意:上传文件的大小不超过5GB然后引入阿里OSS SDK坐标 <!--oss--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss&l

2021-05-13 15:04:44 25 2

原创 数据库跨库join方案

最好不要出现跨库join,应该在设计的时候就避免。将需要join的表放在同一数据库,即便是分库分表看能不能按相同维度分到一起。或者看能不能设冗余字段,避免关联查询。那如果无法避免跨库join,也应该走微服务API查询,或者使用中间件实现。一定要跨库join,MySQL也是可以支持的:1.开启FEDERATED引擎,修改my.ini(或my.cnf)文件新添加一行,内容为federated,然后重启MySQL。2.在数据库中建立远程表,通过参数CONNECTION='mysql..

2021-05-13 10:41:50 33 2

原创 ZooKeeper是强一致性的吗

ZooKeeper是弱一致性,能保证最终一致性。但是也可以支持强一致性,需要通过sync()方法与Leader节点同步后可保证当前节点数据与Leader一致。

2021-05-12 16:21:59 44 1

原创 微信小程序获取手机号

1.获取微信用户绑定的手机号,需先调用wx.login接口,获取code。2.因为需要用户主动触发才能发起获取手机号接口,所以该功能不由API来调用,需用button组件的点击来触发,获取encryptedData、iv。<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>Page({ getPhoneNumber (e) { console.log(e

2021-05-12 14:11:44 45 1

原创 两步实现微信小程序登录 获取openid和session_key

1.前端调用wx.login()获取临时登录凭证code,并回传到后台服务。wx.login({ success (res) { if (res.code) { //发起网络请求 wx.request({ url: 'https://example.com/onLogin', data: { code: res.code } }) } else { console..

2021-05-11 14:09:01 86 4

原创 Kafka两种配置文件方式

1.yml配置文件(简单配置)spring: kafka: bootstrap-servers: ip:端口 consumer: group-id: group-test enable-auto-commit: true auto-commit-interval: 1000ms auto-offset-reset: latest key-deserializer: org.apache.kafka.common.seria

2021-05-10 17:27:02 1040 5

原创 负载均衡算法居然有这么多种!!!负载均衡算法总结

负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法,另外还可以自定义负载均衡算法。静态负载均衡算法轮询(Round Robin):服务器按照顺序循环接受请求。 随机(Random):随机选择一台服务器接受请求。 比率(Ratio):给每个服务器分配一个权重值,根据权重分配请求。 Hash(Hash):根据客户端IP的hash值取模访问对应服务器。 一致性Hash(Consistent Hash ):相同IP的客户端请求总是发送到同一服务器。动态负载均衡算法最少连接数(Leas

2021-04-27 16:27:54 647 41

原创 利用MybatisPlus两步实现多租户方案

1.定义一个TenantLineHandler的实现类:import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;import com.google.common.collect.Lists;import net.sf.jsqlparser.expression.Expression;import net.sf.jsqlparser.expression.LongValue;import java.

2021-04-26 15:30:33 764 18

原创 领域模型命名规约:POJO、DTO、VO、BO、PO、DO

POJO(Plain Ordinary Java Object)简单Java对象是对DTO/VO/BO/PO/DO的统称。DTO(Data Transfer Object)数据传输对象不同服务或服务层之间的数据传输,如:RPC接口参数、Controller层的请求参数。VO(Value Object、View Object)值对象、展示对象返回给前端的值对象,如:Controller层的响应参数。BO(Business Object)业务对象可能包含多个表的数据,也..

2021-04-26 10:16:49 162 4

原创 package xxx does not exist cannot find symbol

在Linux上部署服务时抛了大量的包找不到异常[ERROR] /home/jenkins/agent/workspace/pipeline_p-h6sbk-4/src/main/java/com/UserServiceImpl.java:[3,28] package com.alibaba.fastjson does not exist[ERROR] /home/jenkins/agent/workspace/pipeline_p-h6sbk-4/src/main/java/com/User.ja

2021-04-25 09:47:49 1078 5

原创 Java将excel转换成List集合或json,将excel文件导出到本地,excel导入导出,easyexcel工具类

引入maven <!--fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency&gt

2021-04-22 14:42:18 174 10

原创 双写一致性方案

什么是双写同一份数据,需要写数据库、写缓存。双写很难保证强一致性,可以保证最终一致性。要做到强一致性就需要将所有读写请求用队列串行化,但是性能非常差,降低系统的QPS。没有完美的方案,用到缓存就会存在不一致的情况,需要根据具体业务权衡得失,选择合适业务的方案。先更新数据库,再删除缓存(推荐方案)此方案数据不一致的几率比较低,并且实现简单。造成数据不一致的情况:在缓存刚好失效时,有线程查询数据库得到旧值,另外一个线程更新数据库并删除缓存后,前面持有旧值的线程将数据存入缓存,造成数据

2021-04-20 14:19:27 140 4

原创 Redis事务机制

Redis的事务很鸡肋,并不能保证原子性,也不支持回滚。Redis使用MULTI、EXEC、DISCARD、WATCH命令来实现事务功能。Redis事务是一组命令的集合,事务中的所有命令都被序列化加入队列并按顺序执行,事务执行期间不会被中断。使用Redis事务三个步骤:开始事务(MULTI) 命令入队 执行事务(EXEC)/ 撤销事务(DISCARD)WATCH通过CAS实现,用来监视某个key,如果监视的key被其他客户端修改,EXEC将会放弃执行事务队列中的所有命令。WATCH只能在.

2021-04-19 08:53:13 347 5

原创 Spring源码中的设计模式

工程模式:Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象。 单例模式:Spring依赖注入Bean实例默认是单例的。Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。 装饰器模式:Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorato

2021-04-18 11:42:02 134 2

原创 字符串拼接还在用String、StringBuilder?试试StringJoiner吧

StringJoiner是JDK1.8新出的一个类,用于拼接字符串时加入分隔符、前缀、后缀。不需要手动拼接这些与业务无关的符号,也省去处理边界问题的麻烦。使用说明例子:将数组中的元素拼接成以","分割的字符串String[] strings = new String[]{"a", "b", "c"};拼接结果:a,b,c使用StringJoiner之前 public static void main(String[] args) { String[] str

2021-04-16 11:08:40 569 4

原创 Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略

源码简介ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它实现了任务提交、线程管理、监控等等方法。来看看ThreadPoolExecutor类的构造方法源码,其他创建线程池的方法最终都会导向这个构造方法。共有7个参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler,下面将对这7个参数展开讲解。 public ThreadPool

2021-04-11 22:28:48 2710 38

原创 ConcurrentHashMap是如何保证线程安全的

JDK1.7,采用分段锁技术本质上还是采用数组+链表的形式存储键值对的。为了提高并发,把原来的整个 table 划分为 n 个 Segment 。从整体来看,它是一个由 Segment 组成的数组。每个 Segment 里边是由 HashEntry 组成的数组,每个 HashEntry之间又可以形成链表。我们可以把每个 Segment 看成是一个小的 HashMap,其内部结构和 HashMap 是一模一样的。当对某个 Segment 加锁时,不会影响到其他 Segment 的读写,降低锁的竞争。J

2021-04-09 13:42:10 1346 7

原创 HashMap为什么线程不安全

JDK1.7中,HashMap的put方法采用的是头插法,在resize扩容时会形成环形链表,造成死循环。扩容时还可能造成数据丢失。JDK1.8中,HashMap将put方法改成了尾插法,不会形成环链死循环,但是会造成数据覆盖。...

2021-04-09 11:08:48 207 1

原创 MySQL一条update语句的执行过程(图)

2021-04-08 14:00:28 245 6

原创 Redisson分布式锁的原理 锁续期 看门狗 死锁问题

使用Redis锁,会有业务未执行完,锁过期的问题,可以采用Redisson锁解决。Redisson锁有两种模式1.固定有效期的锁:超过有效期leaseTime后,自动释放锁。 public void lock(long leaseTime, TimeUnit unit) { try { this.lockInterruptibly(leaseTime, unit); } catch (InterruptedException var

2021-04-08 13:42:30 315 3

原创 一致性哈希

一致性哈希目的是解决哈希算法动态伸缩的问题,使得在进行扩容时尽量少的进行数据同步。一致性哈希算法将整个哈希值空间映射成一个虚拟的圆环,整个哈希空间的取值范围为0~2^32-1。整个空间按顺时针方向组织。0~2^32-1在零点中方向重合。接下来使用如下算法对服务请求进行映射,将服务请求使用哈希算法算出对应的hash值,然后根据hash值的位置沿圆环顺时针查找,第一台遇到的服务器就是所对应的处理请求服务器。当增加一台新的服务器,受影响的数据仅仅是新添加的服务器到其环空间中前一台的服务器(也就是顺着逆时针方向

2021-04-08 11:06:57 148 1

原创 Spring Security OAuth2使用短信验证码登录

通过继承org.springframework.security.oauth2.provider.token.AbstractTokenGranter定义GRANT_TYPE=sms重写getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest)可以参考org.springframework.security.oauth2.provider.password.ResourceOwnerPasswordTokenG

2021-04-06 11:41:25 188 2

原创 零拷贝技术

DMA(Direct Memory Access)直接内存访问技术:在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情,这样 CPU 就可以去处理别的事务。零拷贝(Zero-copy):通过 DMA 将磁盘上的数据拷贝到内核缓冲区里,然后将缓冲区描述符和数据长度传到 socket 缓冲区,网卡的 SG-DMA 控制器就直接将内核缓存中的数据拷贝到网卡的缓冲区里。零拷贝技术的文件传输方式相比传统文件传输的方式,减少了 2 次

2021-04-06 11:08:03 153 1

原创 互联网黑话大全 最新词汇 黑话生成器

二字动词复盘 赋能 沉淀 倒逼 落地 串联 协同 反晡 兼容 包装 重组 履约 晌应 量化 发力 布局 联动 细分 梳理 输出 加速 共建 支撑 融合 聚合 集成 对齐 对标 对焦 抓手 拆解 拉通 抽象 摸索 提炼 打通 打透 吃透 迁移 分发 分层...

2021-04-02 15:04:48 1185 1

原创 tomcat默认最大线程数、等待队列长度、连接超时时间

tomcat默认支持的最大线程数是200,当线程数达到200后,将新的线程加入等待队列,等待队列默认100,当等待队列达到100后,直接拒绝此次请求返回connectionrefused。连接超时时间默认为20秒。来着tomcat官方文档http://tomcat.apache.org/tomcat-7.0-doc/config/http.htmlAttribute Description acceptCount The maximum queue length for inc.

2021-04-02 10:18:41 250 1

原创 Push failed Unable to access ‘https://github.com/‘: Failed to connect to github.com port 443: Timed

GitHub推送到远程仓库报错: Push failed Unable to access 'https://github.com/': Failed to connect to github.com port 443: Timed out 解决办法:在控制面板的凭证管理器找到GitHub登录凭证,修改账号密码。也可以通过cmd窗口快速打开,输入:rundll32.exe keymgr.dll,KRShowKeyMgr...

2021-04-01 16:37:13 204

原创 Eureka实现原理和自我保护机制简单介绍

Eureka是在Java语言上,基于Restful API开发的服务注册与发现组件,由Netflix开源。Eureka遵循AP原则。目前Eureka仅开源到1.X版本,2.X版本已经宣布闭源。Eureka采用的是Server/Client的模式进行设计:Server扮演了服务注册中心的角色,为Client提供服务注册和发现的功能,维护着注册到自身的Client的相关信息,同时提供接口给Client获取到注册表中其他服务的信息。 Client将有关自己的服务的信息通过一定的方式登记到Server上,

2021-03-31 15:30:28 154

原创 Consul的基本概念和实现原理

Consul是由HashiCorp基于Go语言开发的,用于微服务下的服务治理,采用Raft算法保证服务的一致性,采用主从模式的设计可横向扩展,集群间通过RPC调用(HTTP和DNS)。Consul主要特点:服务发现、健康检查、Key/Value存储、安全服务通信、多数据中心。Consul的应用场景:服务发现、服务隔离、服务配置。...

2021-03-31 11:55:43 1672 13

原创 Redis的对象和数据结构

Redis数据库的键值对(key-value)都是由对象(object)组成。对象总共有5种:字符串对象(string) 列表对象(list):有序链表,value能重复,可通过下标取元素,可在头/尾进行插入或删除。使用场景: 哈希对象(hash):HashMap 集合对象(set):不重复、无序、不能通过下标取元素。 有序集合对象(zset)而对象则是由6种主要数据结构创建:简单动态字符串(SDS):相比C字符串,SDS做了优化:直接获取字符串重读、避免缓冲区溢出、空间预分配。 链

2021-03-29 23:32:01 164

原创 MySQL InnoDB 缓冲池 buffer pool

什么是buffer poolMySQL服务器启动的时候会向操作系统申请了一片连续的内存作为缓冲池(buffer pool),默认128M,可以通innodb_buffer_pool_size过来调整它的大小。用于缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。buffer pool中存有控制块和缓存页一一对应,控制块包含:缓存页所属的表空间编号、页号、缓存页在buffer pool中的地址、链表节点信息、一些锁信息以及LSN信息;缓存页和磁盘上默认的

2021-03-29 15:15:26 199 1

原创 MySQL 日志 redo log、undo log、binlog、relay log、general log、slow query log、errorlog

MySQL中有以下7种类型日志文件:重做日志(redo log) 回滚日志(undo log) 二进制日志(binlog) 中继日志(relay log) 慢查询日志(slow query log) 一般查询日志(general log) 错误日志(errorlog)重做日志(redo log)回滚日志(undo log)二进制日志(binlog)中继日志(relay log)慢查询日志(slow query log)一般查询日志(general log)错误日志(errorl

2021-03-29 11:34:34 182

原创 MySQL 索引的所有叫法 索引有种类哪些 索引概念

在MySQL Innodb存储引擎中,索引就是数据,数据就是索引。索引类型B+树索引:Innodb引擎使用,且内部都是此索引类型。 Hash索引:基于哈希表实现,用于精确匹配索引所指向的数据。 全文索引:仅MyISAM引擎支持,主要用来查找文本中的关键字,而不是直接与索引中的值相比较。 自适应哈希索引:Innodb引擎使用,自动根据访问的频率建立的哈希索引。索引种类聚簇索引,也叫聚集索引、主键索引、一级索引。 非聚簇索引,也叫二级索引。聚簇索引一张表必须存在一个并且只存在一个,叶

2021-03-28 00:13:07 206

原创 MySQL InnoDB 锁概述

锁类型共享锁(S锁):也叫读锁,其他事务可以读,但不能写。 排他锁(X锁):也叫写锁,其他事务不能读取,也不能写。行级锁行锁:Record Locks,记录锁,锁单行记录。 间隙锁:Gap Locks,锁住行之间的间隙,不包括行本身,用于防止幻读。数据页中有两个最大最小值隐藏列,用于锁无限大范围的情况。 行间隙锁:Next-Key Locks,锁住两行记录之间的间隙,不包括行本身,是行锁+间隙锁的结合。 插入意向锁:Insert Intention Locks,插入记录时,如果插入位置被加

2021-03-27 00:01:46 197 6

原创 MySQL主从复制原理

MySQL主从复制步骤:主库记录数据修改的二进制日志(binary log) 从库将主库的二进制日志复制到自己的中继日志(relay log) 从库读取中继日志重放到从库数据中MySQL主从复制方式:异步:在主从复制的过程中,MySQL默认是异步复制的。主库写入binlog就直接返回给客户端了。从库再异步读取binlog重放到数据中。主库不关心从库的数据有没有写入成功。 全同步:主库必须等待全部从库的事务执行完毕才返回给客户端。 半同步:主库等待至少一个从库接收到binlog并写.

2021-03-26 10:57:22 157

原创 MySQL InnoDB MVCC原理

什么是MVCCMVCC(Mutil-Version Concurrency Control)多版本并发控制,指的就是在使用已提交读(READ COMMITTD)、可重复读(​​​​​​​REPEATABLE READ)这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。这两个隔离级别的一个很大不同就是:生成ReadView的时机不同, 已提交读在每一次进行普通SELECT操作前都会生成一个ReadView,而可

2021-03-25 15:36:42 152 2

原创 RocketMQ事务消息

RocketMQ4.3.0开始支持事务消息RocketMQ事务消息的实现原理基于两阶段提交和定时事务状态回查来决定消息最终是提交还是回滚。整个流程:1.生产者开启本地事务,在事务内完成相关业务数据落库,同步发送prepare消息到Broker。...

2021-03-24 22:35:53 131

原创 notifyAll唤醒线程顺序

notifyAll()方法按照后进先出算法唤醒所有wait状态的线程,即LIFO。执行完唤醒方法,并不会立即唤醒等待线程,在hotspot中是退出同步块的时候才会去真正唤醒对应的线程。notifyAll()唤醒过程还使用了monitorexit,当某个线程从wait状态恢复时,要先获取锁,然后再退出同步块,并唤醒最后一个进入wait状态的线程,依次类推。这些策略都可以通过修改JVM参数来改变。...

2021-03-23 23:33:15 169

原创 ZooKeeper的ZAB协议原理

ZAB(Zookeeper Atomic Broadcast)是为ZooKeeper设计的崩溃恢复原子广播协议,也称为zk原子广播协议。它保证ZooKeeper集群数据的一致性和命令的全局有序性。集群角色Leader:一个集群同一时间只会有一个Leader,它会发起并维护与各Follower及Observer间的心跳。所有的写事务必须要通过Leader完成再由Leader将写操作广播给其它服务器。 Follower:一个集群可同时存在多个Follower,它会响应Leader的心跳。Followe

2021-03-23 18:26:08 164 1

原创 ZooKeeper的基本概念

用途ZooKeeper主要服务于分布式系统,提供分布式数据一致性解决方案。可以用ZooKeeper来做:注册中心、分布式锁、命名服务、集群管理、负载均衡、配置管理等。Hadoop、HBase、Dubbo都有用ZooKeeper。数据结构Zookeeper提供的命名空间与标准的文件系统非常类似,一个名称就是一个由“/”分割的路径序列,其层级结构为:...

2021-03-22 14:10:41 189 1

原创 Spring IOC 容器启动过程

1.加锁,防止在refresh的时候出现启动或销毁容器的操作。synchronized (this.startupShutdownMonitor) 2.准备工作,记录下容器的启动时间、标记“已启动”状态、处理配置文件中的占位符。prepareRefresh(); 3.初始化BeanFactory,先创建DefaultListableBeanFactory实例,然后将配置信息解析成beanDefinition,并封装成beanName -> be...

2021-03-22 10:20:23 178 2

SecureCRT9.0下载64位 scrt-sfx-9.0.0.2430

SecureCRT是一款终端仿真程序,支持SSH(SSH1和SSH2)以及Telnet和rlogin协议。

2021-04-07

MySQL5.7下载 64位 mysql-5.7.20-winx64 免安装

MySQL数据库服务是一种完全托管的数据库服务,用于部署云原生应用程序

2021-04-07

JDK11下载 64位 官方正式版 jdk-11.0.10_windows-x64_bin.exe

感谢您下载此版本的Java™平台标准版开发套件(JDK™)。 JDK是用于使用Java编程语言构建应用程序和组件的开发环境。

2021-04-07

SublimeText4下载

Sublime Text – 性感的代码编辑器、程序员之必备神器!Sublime Text 是个功能强大的代码编辑器,也是HTML和散文先进的文本编辑器。

2021-04-07

JDK1.8下载 64位 官方正式版 jdk-8u191-windows-x64.exe

感谢您下载此版本的Java™平台标准版开发套件(JDK™)。 JDK是用于使用Java编程语言构建应用程序和组件的开发环境。

2021-04-07

Git下载 64位 官方正式版 windows Git-2.31.1-64-bit.exe

Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。

2021-04-07

空空如也

空空如也

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

TA关注的人 TA的粉丝

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