自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 三分钟带你入门分布式ID方案

在目前互联网主流架构中,分布式ID生成是一项很重要的基础功能,本文教你多种生成分布式ID的几种方案

2023-03-20 20:45:43 671 1

原创 一文教你彻底打败Redis Bigkey和Hotkey问题

Redis Bigkey和Hotkey是Redis生产中两个比较常见的问题,本文从它们的概念、危害、发现、解决的角度,来分析一下这两个问题。

2023-03-19 15:39:28 1029

原创 一文教你Redis Cluster批量操作的所有姿势(附代码实操)

Redis Cluster 批量操作Key 技巧,用多种方式提供了批量操作的思路,各位可以根据自己的业务量级来选择合适的方法。

2023-03-18 15:44:36 1752

原创 二十张图带你一次性学懂Raft算法

一文带你领略Raft算法的魅力

2022-06-10 12:14:37 1302 1

原创 Maven进阶概念入门详解

Maven进阶概念入门详解在一次需求迭代中,同事要求我把写好的RPC接口打好包上传到公司私服上,我人直接当场懵逼住了。突然发现自己对于Maven仅仅是处于最基础的使用阶段,不仅不知道背后的一些原理,甚至连一些常见的概念都不是很清晰,仅仅会使用Maven构建项目,引入依赖,打包等最基础的操作,所以连忙补补课,成功完成了需求,并且在此处总结一下Maven中稍微进阶一点的知识。依赖依赖是我们在使用Maven构建项目时最常使用的功能,通过依赖标签,我们可以直接从Maven仓库中引入对应的Jar包,无需手动

2022-05-17 14:37:26 227

原创 JUC锁核心类AQS解析

JUC锁核心类AQS解析简介AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore等,它使用一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,它是我们实现大部分同步需求的基础。AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,AQS的涉及是基于模板方法模式的,它内部定义好了所有跟锁相关的底层操作细节与算法骨架,只保留了几个方法让子类重写,子类

2022-04-13 11:58:21 1010 2

原创 Java多线程编程技术实践

Java多线程编程技术实践最近笔者面试的时候被面试官问到了有关Java线程池源码方面的问题,没有回答上来,所以准备好好研究一下Java线程池底层源码。当我打开JDK源码的时候,我整个人就愣住了,像极了刘姥姥进大观园,Java线程池源码中的一些涉及到多线程相关的API,我竟然已经完全忘记了这些方法的作用,于是便准备总结一篇Java多线程编程技术相关的内容,用以对自己所学知识的总结。本文会总结常见的Java多线程基础练习和面试题,包括《Java多线程编程核心技术》、《Java并发编程的艺术》上的Code,以

2022-04-08 22:17:49 1404 5

原创 Redis对象详解

文章目录五种基本数据类型Redis对象的组成字符串对象SDS不同编码的区别int编码embstr 和 rawRedis如何选择编码列表对象linkedlist编码ziplist编码压缩列表内存连续压缩列表的构成压缩列表节点的构成哈希对象ziplist编码hashtable编码字典Rehash集合对象有序集合对象ziplist实现skiplist实现为什么还要使用字典?skiplist小结五种基本数据类型Redis支持五种基本数据类型:String,Hash,List,Set,Zset / Sorted

2022-03-19 20:40:48 2427 3

原创 Docker启动Elasticsearch(挂载数据、配置文件、插件)

Docker启动Elasticsearch拉取镜像docker pull elasticsearch:7.4.2修改配置文件mkdir -p /mydata/elasticsearch/configmkdir -p /mydata/elasticsearch/data/mkdir -p /mydata/elasticsearch/pluginsecho "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearc

2021-10-15 22:08:20 7957 6

原创 Java字符串对象和常量池的总结

Java字符串对象和常量池的总结字符串对象当执行String str1= new String("123");时,虚拟机会创建几个对象呢,答案是两个。当一个字符串对象被new出来的时候,有两种情况,当字符串常量池中有常量池在JDK7以前,字符串常量池在方法区的实现永久代里面的。在JDK7以后,字符串常量池是在堆空间里面的。常量池里面保存intern方法JDK7以前JDK7以后...

2021-10-11 17:31:17 578

原创 Redis基本数据类型String——数据结构解析

StringRedis没有直接使用C语言的传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型。下面我将解释为什么Redis要自己构建SDS而不是直接用C语言的String,原因其实很简单,一切都是为了提升Redis操作的性能。SDS的定义这里我先给出SDS的定义,下面我会对它特有的属性进行解析,大家在看的时候可以思考以下几点,为什么需要这个属性?这个属性有什么用?没有这个属性会怎么样?在之后的数据结构解析中,希望大家也能带着相似的

2021-09-06 13:57:06 1003

原创 跳跃表的Java实现

对于跳跃表的概念,以及跳跃表增删改查的流程,参考大佬的这篇文章。Skip List–跳表(全网最详细的跳表文章没有之一)本文只给出跳跃表的Java实现以及详细注释,欢迎各位大佬指正代码,如果有同学有部分代码看不懂,可在评论区提问。/** * 跳表的一种实现方法。 * 跳表中存储的是正整数,并且存储的是不重复的。 * * Author:ZHENG */public class SkipList { private static final float SKIPLIST_P = 0.

2021-09-04 11:04:39 429 2

原创 OpenFeign服务接口调用入门

OpenFeign服务接口调用入门OpenFeiGn的作用和FeiGn的区别配置流程Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可(内置Ribbon)OpenFeiGn的作用Feign旨在使编写Java Http客户端变得更容易。前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处

2021-08-11 20:57:10 134

原创 Ribbon负载均衡服务调用入门

Ribbon负载均衡服务调用Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。和Nginx的区别Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。 Ribbon本地负载均衡,在调用微服务接口时

2021-08-11 16:13:18 127

原创 RabbitMQ入门

RabbitMQ入门MQ引言什么是MQ市面上不同MQ的对比RabbitMQ引言内部结构RabbitMQ支持的消息模型使用场景异步处理应用解耦流量削峰Springboot结合RabbitMQ开发搭建初始环境Hello World模型Work模型广播模型(订阅)路由模型动态路由模型MQ引言什么是MQMQ(Message Quene) : 翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,

2021-08-10 23:21:49 176

原创 Eureka服务注册与发现配置

Eureka服务注册与发现基础知识服务端server客户端clint负载均衡服务发现Discovery自我保护基础知识什么是服务治理: 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册什么是服务注册:服务客户端注册到服务注册中心,其他服务客户端可以用服务别名的方式访问其他服务客户端Eureka两组件:EurekaServer和EurekaClient服务端

2021-08-08 16:39:57 400

原创 MySQL联表查询数据重复

原因联表查询逻辑有问题原代码更改后代码可以看到,这两次查询在联表时ON中的条件不一样,后面的多了一个筛选activity_id,如果不加这个条件的话,ON的时候主表与子表的记录不是一一对应的,会与本来我们不需要联表的数据进行联表,所以会产生很多虚假数据。总结我们要保证联表查询时ON中的条件能够是一一对应的,即通过这个条件应该只能对应从表的唯一一条记录,这样就不会产生虚假的联表数据。...

2021-08-04 09:48:04 1395 1

原创 MySQL事务隔离级别实现原理(和锁的关系)

隔离级别并发带来的问题脏读(dirty read)如果一个事务读到了另一个未提交事务修改过的数据,如果另一个事务发生了回滚,那么该数据就是脏数据。不可重复读(non-repeatable read)如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,即一个事务里两次查询一个数据的结果不一样。。幻读(phantom read)如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务

2021-07-10 22:09:42 341 1

原创 取模与位运算的关系(实践出真知)

网上总有人说x对n取模就是x与n-1进行与运算直接上测试代码public class test { public static void main(String[] args) { //测试9和4取模 System.out.println(9&3); //测试1和4取模 System.out.println(1&3); //测试40和6取模 System.out.println(

2021-07-03 21:42:16 855

原创 HashMap容量为什么总是2的幂次方

为什么取余?为什么HashMap底层要用取余来计算每一个元素在数组里的位置呢?我们都知道,key的hash值映射到数组具体位置时可以用取模的操作,这样结果一定在[ 0 , n-1] (容量为n)之间,可是取模运算速度很慢,众所周知,位运算的执行速度很快,那么我们可不可以用位运算的方式来取代取模呢。答案是当然可以。我们只需要一种位运算,能让所有的数跟它运算的结果都在[ 0 , n-1]之间即可,于是我们想到了 与运算,所有的数跟一个数进行&运算的结果都会在0到这个数本身。例如 x &amp

2021-07-03 21:29:13 362 1

原创 MybatisPuls条件构造器allEq方法详解

用途当传入参数很多的时候,可以直接用map接受参数,然后用map构造条件构造器,大大加快了编程的速度。官网可以看见官网上说用allEq就可以传入Map参数进行条件查询,下面对allEq传入的每一个参数进行详细的解释paramsMap<R, V> params代表传入的参数列表,可以是接受的前台传过来的Map参数列表,也可以是后台自己创建的mapboolean null2IsNull这个参数是说当参数中有值为null的参数,会不会对该参数进行查询,如果值为true,就会进行查询,查

2021-06-18 17:07:10 5966 1

原创 MyBatis根据ID数组批量更新值

一开始想到的方法通过每一个id查出每一个实体,然后改变每一个实体里的值,再每一个调用更新方法更新。这样会很慢很慢,一次删除操作可能要访问几百次数据库。public int deleteCourseClassificationByIds(Long[] ids) { //获取删除人userId long userId = SecurityUtils.getUserId(); //用课程分类id查出课程分类实体 for (Long id : i

2021-06-17 21:11:20 2606 2

原创 Git多人合作开发

背景这是博主第一次使用Git进行多人合作开发,其间因为对Git的理解不深导致了很多问题的出现,在这里总结一下大致流程开发流程首先,从项目Git仓库使用git clone 命令克隆下来,这时不止会克隆代码,每一个分支都会克隆下来,这时候你应该在本地切换到dev分支,因为我们项目中的master分支是最后上线的分支,项目负责人会把dev分支上的功能检查以后合并到master上。当你在dev分支上完成了你的功能代码时,此时你就要把你的代码提交到远程仓库的dev分支上,这时候你就会发现push rejecte

2021-06-17 11:37:10 650 1

原创 Nginx负载均衡后登录成功后无法正常跳转解决方法和原因

只需要在配置信息里添加ip_hash即可 upstream apache_server { server 192.168.11.101:80 weight=1; server 192.168.11.102:80 weight=1; ip_hash; }

2021-06-11 17:01:41 2069

原创 Nginx配置反向代理不成功的原因(Docker安装版)

问题背景在linux服务器中使用docker下载了Nginx,然后根据网上的教程来配置反向代理的时候发现80端口无法访问server块的配置server { listen 80; server_name 127.0.0.1 ; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://127.0.0.1:8080; # inde

2021-05-28 15:01:10 7563 1

原创 docker容器挂载文件后无法正常启动

查看docker日志nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)原因百度了一下发现有文章说是CentOS7中的安全模块selinux把权限禁掉了。关于docker -v 挂载后服务无法启动问题。但是我自己又试了试,发现我的宿主机上的目录和docker容器中的目录里的文件不一样,我将容器docker rm删除后重新挂载了文件并启动容器,就启动成功了,所以如果出现了挂载文件后启动

2021-05-28 10:25:07 1243

原创 快速排序随机选取主元的重要性

在刷力扣215题 数组中的第K个最大的元素时,发现了快速排序随机选取主元的重要性,不然就会被极端的数据把时间复杂度卡到n²。两种选取主元的时间差异很大我又试了试调用库函数,发现和我自己写的快速排序时间复杂度差不多...

2021-05-19 12:03:44 636

原创 BeanUtils.copyProperties复制对象结果为空的原因

细心比对,发现原来是导错了包导致的正确的包import org.springframework.beans.BeanUtils;错误的包import org.apache.commons.beanutils.BeanUtils;两个类的区别两者的copyProperties方法参数位置不同org.springframework.beans.BeanUtils:  copyProperties(sourceDemo, targetDemo)org.apache.commons.beanu

2021-05-11 22:39:17 2581 2

转载 Java 中的bind 绑定

概念一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢,这应该是我们在初学Java时遇到的问题。这里我们将确定这种调用何种方法实现或者变量的操作叫做绑定。可以将绑定理解成Java多态特性的底层原理。分类在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。区别静态绑定发生在编译时期,动态绑定发生在运行时

2021-05-09 19:44:59 5205

原创 Mybatisplus报错BindingException

报错信息org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.kuang.mybatis_plus_study.Mapper.UserMapper.selectList解释:就是说,你的Mapper接口,被Spring注入后,却无法正常的使用mapper.xml的sql;这里的Spring注入后的意思是,你的接口已经成功的被扫描到,但是当Spring尝试注入一个代理(MyBatis实现

2021-05-09 19:38:39 1583

原创 快速排序(思想以及详细代码)

思想快速排序是对冒泡排序的一种改进,冒泡排序每次将未排序的数组中最大的一个数通过交换的方式放到正确的位置上,而快速排序是选取一个中轴元素,然后把数组中所有小于中轴元素的元素放在其左边,所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是有序的。也就是说,我们无需再移动中轴元素的位置。动图演示如下:(动图取自微信公众号:帅地玩编程)如何使中轴元素位于正确的位置由于中轴元素左边的值都比它小,右边的值都比它大,所以采用双指针的方法同时维护两个数组,左边维护一个比它小的数组,右边维护一

2021-05-09 17:15:13 142

原创 关于逻辑删除字段的处理

想查询所有数据库的数据包括已经逻辑删除的数据由于Mybatisplus默认的查询会自动带上逻辑字段为true的条件,所以我们不能使用Mybatisplus自带的mapper查询,而应该定制sql进行查询。sql语句为:select * from table where id = #{id}Mybatisplus自带的sql语句为:select * from table where id = xxx AND logic = 1 ...

2021-05-09 11:13:03 878

原创 Springboot项目打包后thymeleaf模板无法解析的问题(附带源码分析问题)

查看docker日志报错:ERROR 1 — dispatcherServlet : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving templat

2021-04-29 20:14:41 1296 2

转载 SpringMVC核心执行原理

SpringMVC什么是MVC什么是SpringMVCDispatcherServletSpringMVC执行原理简要分析执行流程什么是MVCMVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域

2021-04-29 11:41:41 141

转载 注解配置SpringMVC

新建一个Maven工程添加web支持(要求版本4.0)防止Maven资源过滤<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</includ

2021-04-29 11:39:25 84

原创 Mybatis插入删除修改不成功的原因

增、删、改操作需要提交事务!

2021-04-14 09:40:14 571

原创 String.intern()方法的内存占用分析

String.intern()使用原理String.intern()是一个Native方法,底层调用C++的 StringTable::intern方法实现。当通过语句str.intern()调用intern()方法后,JVM 就会在当前类的常量池中查找是否存在与str等值的String,若存在则直接返回常量池中相应Strnig的引用;若不存在,则会在常量池中创建一个等值的String,然后返回这个String在常量池中的引用。因此,只要是等值的String对象,使用intern()方法返回的都是常量池中

2021-04-09 15:52:00 472

原创 Java集合详解(三)——Map

Map的继承体系其下有HashMap,TreeMap,LinkedHashMapMap实现类的结构一、Map的实现类的结构: * |----Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x) * |----HashMap:作为Map的主要实现类;线程不安全的,效率高;可存储null的key和value * |----LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。 *

2021-04-09 15:17:01 162

原创 Java集合详解(二)——Set

Set接口继承体系Set接口继承自Collection接口,其有HashSet,LinkedHashSet,TreeSet三个实现类。Set 无序,不可重复HashSet底层数据结构是哈希表(数组和链表)。(无序,唯一)如何来保证元素唯一性?1.依赖两个方法:hashCode()和equals()LinkedHashSet底层数据结构是链表和哈希表。(FIFO插入有序,唯一)1.由链表保证元素有序2.由哈希表保证元素唯一TreeSet底层数据结构是红黑树。(唯一,有序)

2021-04-09 14:54:41 112

原创 Java集合详解(一)——List集合(核心源码分析)

List接口继承体系List接口继承自Collection接口,其下有三个实现类,ArrayList,Vector,LinkedList。ArrayList优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程不安全,效率高底层:使用Object [ ] elementData数组存储Vector优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程安全,效率低底层:使用Object[] elementData存储LinkedList优点: 底层数据结构是链表,查询慢,增删快。

2021-04-09 14:19:17 192

空空如也

空空如也

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

TA关注的人

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