自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 自定义比较器Comparator的底层实现原理

参考文献java comparator 升序、降序、倒序从源码角度理解前言正常在使用Collections.sort()中使用Comparator自定义比较器时会使用如下代码所示的写法List<String> list = new ArrayList<>();list.add("2");list.add("4");list.add("3");list.add("1");Collections.sort(list, new Comparator<String&g

2021-02-23 13:50:25 2448 2

原创 Kafka 基本指令大全

注意:下载的kafka会自带zookeeper,所以不需要在自己重新下载。使用kafka前要先启动zookeeper,在启动kafka启动zookeeperbin/zookeeper-server-start.sh config/zookeeper.properties启动kafkabin/kafka-server-start.sh config/server.properties创建topicbin/kafka-topics.sh --create --zookeeper loca

2020-10-31 12:11:47 522

原创 MySQL 基于like的模糊查询 并根据查询的匹配度排序

项目里有一个新的需求,在检索处原先只有根据各个字段的模糊查询,按照我项目中的例子是 中文名,英文名以及负责人。那么有时候在匹配的字段很多的情况下,如果只输入’ms’(数据库中刚好有这样的英文名) 这个正好匹配的字段原则上要显示在第一列,或者说匹配程度约好的要显示在越前面,而不仅仅是一连串的返回匹配到的结果而已。查询结果又10多页,那个提需求的老哥 我能感受到它的痛苦。case 表达式那么言归正传,主要就是对order by部分进行匹配度的计算,这里需要用到 case when 表达式 因为我需要匹配好几

2020-10-28 16:55:37 1492

原创 Java String占用的真实内存空间(附测试代码,求大佬解答遇到的问题)

前言因为String 并不是我们熟知的基本数据类型(int、double、char…),所以在Java中都会用对象来存储,那么String类型占用的内存到底有多少呢,本文将深度探索,并且附有测试代码!Java的对象首先了解一下Java的对象结构(在HotSpot虚拟机中)markword:占4个字节,主要包括hashCode信息,锁对象信息以及GC年龄信息等。class pointer :占4个字节,指向class对象文件length:占4个字节,如果这是数组对象,在对象头中还会包括数组长度

2020-10-23 17:40:30 902 1

原创 Http 状态码详解之304、403、503

一、304状态码1.定义自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,进而节省带宽和开销。2.详解304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应。整个请求响应过程客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,

2020-10-21 14:08:39 6971

转载 JVM 线程dump 导出和分析

JVM 线程dump 导出和分析码农随想录关注前言线程dump是非常有用的诊断java应用问题的工具,每一个java虚拟机都有及时生成显示所有线程在某一点状态的线程dump的能力。虽然各个java虚拟机线程dump打印输出格式上略微有一些不同,但是线程dump出来的信息包含线程基本信息;线程的运行状态、标识和调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。JVM中的许多问题都可以使用线程dump文件来进行诊断,其中比较典型的包括线程阻塞,CPU使用率过高,JVM C

2020-10-14 22:48:50 1764 1

转载 消息队列 Kafka的架构原理 (小白必看)

最终大家会掌握 Kafka 中最重要的概念,分别是 Broker、Producer、Consumer、Consumer Group、Topic、Partition、Replica、Leader、Follower,这是学会和理解 Kafka 的基础和必备内容。1. 定义Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用与大数据实时处理领域。消息队列Kafka 本质上是一个 MQ(Message Queue),使用消息队列的好处?(面试会问)解耦: 允许

2020-10-05 09:35:16 1391

转载 消息队列 常见问题分析(小白必看)

一、简介很久以前也写过一篇关于消息队列的文章,这里的文章,这篇文章是对消息队列使用场景,以及一些模型做过一点介绍。这篇文章将分析消息队列常见问题。消息队列:利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统集成。从定义看:它是一种数据交流平台,也是数据通信平台。然而,数据通信我们可以用http,RPC来进行通信,这些与消息队列有什么区别呢?最大的区别就是同步和异步。http和RPC一般都是同步,而消息队列是异步。二、为什么要用消息队列1.解耦双方不在基于

2020-10-04 20:24:19 1522

转载 消息队列 基础入门(小白必看)

前言消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段。它具有 低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。当前使用较多的 消息队列 有 RabbitMQ、 RocketMQ、 ActiveMQ、 Kafka、 ZeroMQ、 MetaMQ 等,而部分 数据库 如 Redis、 MySQL 以及 phxsql 也可实现消息队列的功能。1.消息队列概述消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成。通过提供

2020-10-03 23:39:04 5604 1

转载 ZooKeeper 基础入门 (小白必看)

2020-10-03 14:24:23 218

转载 MySQL 面试必问之---分库分表

转载https://mp.weixin.qq.com/s/NDwUlMt7BLEabk3rgQpKawhttps://mp.weixin.qq.com/s/wDPbpy-gA36W__ThKVBBqQ前言当数据库的数据量过大,大到一定的程度,我们就可以进行分库分表。那么基于什么原则,什么方法进行拆分,这就是本篇所要讲的。1.数据库瓶颈不管是 IO 瓶颈还是 CPU 瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载的活跃连接数的阈值。在业务 Service 来看, 就是.

2020-10-03 13:06:36 426

转载 MySQL 必须掌握的三大日志-binglog、redo log以及undo log

转载自https://mp.weixin.qq.com/s/A0Du0ipee7nzXN-fKG6K5g前言MySQL服务器的体系结构一条更新语句执行的顺序update T set c=c+1 where ID=2;a. 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。b. 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,.

2020-10-02 21:42:23 6392 1

原创 Redis 通过巧妙地使用数据结构节省内存空间(附 实验代码)

有了方面的知识,我们可以根据不同的场景来预估Redis会使用的内存容量。前言Redis数据结构容量评估的相关知识 ------ 想学的小伙伴可以移步Redis相关数据结构的容量评估那么这边博客就介绍一下,如果数据量达到千万甚至上亿级别时,该如何优化数据结构,节省内存空间。Redis 数据结构和编码方式继续回顾一下这张图,为什么Redis要对这些数据结构,分别设置多种编码方式(底层数据结构实现)呢?肯定是有原因的,因为随着数据量的上涨,或者存储的键值本身的大小变化,都会影响到对应编码方式的选择,

2020-09-30 17:07:17 1510 1

转载 Redis 相关数据结构的容量评估

作者:LeiLv链接:https://www.jianshu.com/p/5c5dc0d7d776来源:简书1.jemalloc 内存分配模型jemalloc基于申请内存的大小把内存分配分为三个等级:small,large,huge:Small Object 的size以8字节,16字节,32字节等分隔开,小于页大小;Large Object 的size以分页为单位,等差间隔排列,小于chunk的大小;Huge Object 的大小是chunk大小的整数倍。对于64位系统,一般chunk.

2020-09-28 19:45:16 2030

原创 Redis 底层结构和对象介绍 超级详细!!

本文主体参考Redis设计与实现第二版 对于有时间的同学可以直接阅读原书,我这里做一个详细的总结,并结合自己的一些思考。1.SDSRedis没有直接使用C语言传统的字符串,而是自己构建一个简单动态字符串(SDS),并将SDS作未Redis的默认字符串表示。reids>SET msg "hello world"会在Redis创建一个新的键值对:key是一个字符串对象,对象的底层是一个保存"msg"的SDSvalue也是一个字符串对象,底层同样是保存 "hello world"的SDS.

2020-09-24 19:12:28 382

原创 Django model 中get和filter的区别 超级详细!!

对于简单的SQL语句,我们还是可以直接使用Django自带的ORM框架,来简化代码的。那么对于查询语句,get()和filter()的区别让我在项目里吃了不少苦头,经常遇到bug,不知不觉就指向了这两个问题,所以今天我准备好好的总结一下相关区别。我就结合Django官方文档中给出的定义和我自己的一些理解进行介绍:get()不使用缓存These methods do not use a cache (see Caching and QuerySets). Rather, they query t

2020-09-22 12:57:21 762

原创 MySQL 表存储方式之索引组织表和堆表

索引组织表(Index-Organized Tables)索引组织的表具有B树的变体的存储组织。以主键排序的方式将索引组织表的数据存储在B树索引结构中。索引结构中的每个叶块都存储关键字列和非关键列。对应的主键索引也叫聚集索引,其他列的索引叫secondary index,也叫做二级索引。二级索引的每条记录都包含该行的主键值,InnoDB使用这个主键值来搜索聚集索引中的行。因此,较短的主键值是有利的,可以缩小二级索引的空间。聚集索引 clustered index每个表都有一个聚集索引,其实上面所说的主

2020-09-21 20:34:54 734

原创 MySQL 为什么InnoDB要使用B+ Tree索引

前言一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级**,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。**换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。一.内存读取简单点说说内存读取,内存是由一系列的存储单元组成的,每个存储单元存储固定大小的数据,且有一个唯一地址。当需要读内存时,将地址信号放到地

2020-09-21 19:48:10 411

原创 MySQL 插入时间时不是用的默认缺省值而是NULL,且后续更新不会改变时间。

项目中有一个bug,明明MySQL中update_time的缺省值为CURRENT_TIMESTAMP,但是第一次插入的时候总是为NULL,后续也不会更新。问题一:初始插入时 时间字段为null但是初始的时候为什么为NULL呢?因为项目中后端用到了Django 的ORM框架,其中的model模型定义如下在DateTimeField中参数设置blank为True,null为True关于这两个字段详细的介绍可以参考django数据模型中null和blank的区别说明我这里总结一下:null默认

2020-09-17 14:26:02 1863

原创 MySQL 什么时候使用INNER JOIN 或 LEFT JOIN

在本科时期,其实这个问题困扰了我很久,最早都是用如下语句,也就是笛卡尔积的形式。select **from A,Bwhere A.name=B.name再熟悉了各种联表以后其实这就是cross join,是最慢的一种联表方式,会返回A表字段的数据*B表字段的数据(如果A表有10条数据,B表有20条数据,那么最后返回结果就是200条)。其实可以根据真实的需求用更好的联表操作,如left join 或inner join。红烧排骨饭博客中给出的例子很容易理解商品表CREATE TABLE pr

2020-09-07 18:11:25 2918 2

原创 Mysql 从A表查询相关信息批量插入到B表中

还是太菜了,在接到相关需求的时候,我连insert命令都没记全。回顾一下insert命令insert into 表名 (表内字段1,字段2) values(数据1,数据2),(数据1’ ,数据2’)那么按照标题中的需求,具体例子:将A表中有,而B表中没有的用户插入到B表中。所以就是先用一个获取A表中有而B表中没有的用户(这里用到子查询not in),在将这些用户插入到B表中。insert into B(name)select usernamefrom Awhere username not

2020-08-26 16:06:04 1030

原创 MySQL多表连接时想要用group by去重

自己在实习的时候编写接口时遇到了这个问题,写完如下sql查询语句后,执行select d.score, c.`desc`, c.idFROM baseline_project.baseline_project_new_check AS c LEFT JOIN baseline_project.baseline_project_new_exp AS e ON c.code_new_en_name = e.code_new_en_name AND c.version_identify

2020-08-20 16:18:53 2632

转载 Java中数组、List、Set互相转换

数组转ListString[] staffs = new String[]{"Tom", "Bob", "Jane"};List staffsList = Arrays.asList(staffs);需要注意的是, Arrays.asList() 返回一个受指定数组决定的固定大小的列表。所以不能做 add 、 remove 等操作,否则会报错。List staffsList = Arrays.asList(staffs);staffsList.add("Mary"); // Unsuppor

2020-07-25 20:35:46 127

转载 Java 内存分配之堆、栈和常量池

Java内存分配主要包括以下几个区域:寄存器:我们在程序中无法控制栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中堆:存放用new产生的数据静态域:存放在对象中用static定义的静态成员常量池:存放常量非RAM(随机存取存储器)存储:硬盘等永久存储空间Java内存分配中的栈在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用

2020-07-12 19:12:40 131

原创 Java static、final以及内部类详解

一、staticstatic能与属性、方法和内部类一起使用,表示静态的。类中的静态变量和静态方法都和类名一起使用,不需要创建类的对象来访问,所以static修饰的变量被称为“类变量”。类中一个static变量只有一个内存空间,类可能会有多个实例,但共享这个static 变量。static变量在类装载的时候就被初始化使用static的基本原则:一个类的静态方法只能访问静态属性一个类的静态方法不能直接调用非静态方法静态方法中不存在当前对象,所以不能使用this,super静态方法不能被非静态方

2020-07-12 17:34:20 291

转载 Redis持久化---RDB和AOF机制

一、Redis持久化概述Redis是内存数据库,为了避免进程退出导致的数据丢失,Redis会定期的以某种形式将数据从内存保存到硬盘;在下次Redis重启时,利用持久化文件实现数据恢复。Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则将每次执行的写命令保存到硬盘(类似于MySQL的binlog);由于AOF持久化的实时性更好,当进程意外退出时,丢失的数据更好,所以AOF是目前主流的持久化方式。二、RDB持久化将当前进程中的数据生成快照保存到硬盘,保存的文件名后缀是rdb

2020-07-05 20:28:52 207

原创 $(document).ready(function()和 window.onload()执行顺序

https://blog.csdn.net/qq_34802511/article/details/82589487一、DOM加载过程网页文档加载都是按顺序执行的。一般浏览器渲染操作顺序大致是一下几个步骤:1.解析HTML结构2.加载外部脚本和样式表文件3.解析并执行脚本代码4.构造HTML DOM模型5.加载图片等外部文件6.页面加载完毕一、$(document).ready(function()$ (function() {}) 是$(document).ready(functi.

2020-06-01 10:24:15 959

原创 Java 对象序列化和反序列化详解

本文主要是整合了一下两篇博客的内容,第一篇引用其概念,第二篇引用了关于序列化ID的介绍,并结合自己的例子进行解释。https://www.cnblogs.com/xdp-gacl/p/3777987.htmlhttps://www.cnblogs.com/lukelook/p/11192677.html一、序列化和反序列化的概念把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。  对象的序列化主要有两种用途:  1) 把对象的字节序列永久地保存到硬盘.

2020-05-29 13:58:01 138

转载 并发和并行、同步和异步及多线程概念详解

并发:讲并发之前,要先看一张图:Concurrency,是并发的意思。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。微观角度:所有的并发处理都有排队等候,唤醒,执行等这样的步骤,在微观上他们都是序列被处理的,如果是同一时刻到达的请求(或线程)也会根据优先级的不同,而先后进入队列排队等候执行。宏观角度:多个几乎同时到达的请求(或线程)在宏观上看就像是同时在被处理。通俗点讲,并发就是只有一个CPU资源,程

2020-05-25 15:19:04 984

原创 Mysql 行锁、间隙锁和next-key锁详解

Mysql的锁机制Mysql 四种事务隔离级别Mysql MVCC实现机制Mysql中的几种行锁(间隙锁、next-key锁)

2020-05-24 23:55:37 9883 7

原创 Mysql 事务基本概念及MVCC

一、事务基本概念在Mysql中只有InnoDB支持事务,支持原子性InnoDB引擎默认自动提交事务,也可以设置取消自动提交,如:设置AUTOCOMMIT为0;通过start transaction或begin开启一个事务,然后使用rollback或者commit 结束这个事务。因为InnoDB默认会自动产生事务并提交,所以每次执行一个语句都会commit,严重影响了性能。所以可以用begin开启事务。1.事务id的分配时机这里要注意在默认情况下,只有执行修改操作(如INSERT、DELETE、

2020-05-24 19:44:10 205

转载 Mysql Explain使用详解

再用到Mysql优化时,经常会使用explain 分析查询,这里分享一篇非常详细的文章作者:陆炫志出处:xuanzhi的博客http://www.cnblogs.com/xuanzhi201111在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于

2020-05-23 11:02:32 84

转载 Mysql 回表查询和覆盖索引概念

最近在补Mysql基础时,发现很多判断查询语句是否优化时都通过回表查询等术语作为指标,看的很懵逼,就开始查找相关的文献,这时发现了一篇很通俗易懂的文章zhangdeTalk的博客 《MySQL 的覆盖索引与回表》一、回表查询因为InnoDB具有聚簇索引(主键索引)和二级索引(普通索引),且两种索引叶子节点存放的内容不一样,前者存储了所有的行数据,而后者仅仅存储主键的数据。MyISAM的索引叶子节点存储得是行记录的指针那么从普通索引是无法直接定位到行记录的,先扫描一遍普通索引获得主键值后在扫描聚簇索引

2020-05-23 10:58:46 618

原创 Mysql exits和in的区别

使用exits和in查询的结果都相同,但是其中运行的机制并不一样。举例:返回参加考试的人1.exitsSELECT * FROM people WHERE EXISTS(SELECT 1 FROM test WHERE people.id=test.user_id);这里exits子查询中 select 1 其实这个1可以是任何数字,因为在exits中返回的结果并不重要,重要的是此处用的是索引查询,判断是否有符合要求的结果,

2020-05-22 23:29:06 898

转载 Mysql 的索引总结

本文内容来自知乎专栏,对其中的知识点进行摘录,方便日后查阅。https://zhuanlan.zhihu.com/p/29118331一、索引概念和原理概念: 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。概念来源:http://feiyan.info/16.html原理: 提高查询效率,相当于一本书的目录,帮助查询内容。二、索引的优缺点优点:索引大大减小了服务器需要扫描的数据量索引可以帮助服务器避免排序和临时表.

2020-05-22 19:12:55 138

原创 Mysql 多表连接中on 和where的区别详解!

数据库在通过连接多表返回记录时,会先生成一张临时表,然后在将这张临时表返回。对于Left Joinon和where条件的区别on条件是生成临时表时的条件,无论on的条件是否为真,左表的数据都会返回,只是右表数据这是都会变成null,这是Left Join的特性(Right Join同)where是在临时表创建完后根据条件进行筛选对于Inner Join两者并没有区别,因为Inner Join不像Left Join或Right Join一定要返回左表/右表的所有数据,而是根据指定关系进行表连接

2020-05-21 01:01:21 1760

原创 Mysql left join、right join 和inner join的区别

长时间没接触Mysql,连最基础的多表查询都忘了,汗…先给出所有到的两个数据表customers表mysql> select * from customers;+----+------------+-----------+------------------+| id | first_name | last_name | email |+----+------------+-----------+------------------+| 1 | Boy

2020-05-20 11:27:19 141

翻译 Java 到底是传值还是传引用

本文是节选自stackoverflow中的答案做一个总结,方便自己日后查看。结论:Java没有传引用,只有传值Dog myDog;myDog实际上是一个指向Dog的指针,不是真实的Dog。Dog myDog = new Dog("Rover");fuc(myDog);假定新创建的Dog对象存在内存地址42的位置使用fuc()函数传入的是 Dog对象 myDog的地址(也就是42)public void fuc(Dog someDog) { someDog.setName("Max

2020-05-18 16:37:35 110

原创 Mysql 数据类型详解

1.DecimalDECIMAL(N,D)N:总共的位数D:小数点后的位数create table items(price DECIMAL(5,2));INSERT INTO items(price) VALUES(8);INSERT INTO items(price) VALUES(8342342);INSERT INTO items(price) VALUES(8.2);INSERT INTO items(price) VALUES(8.12412);INSERT INTO items

2020-05-17 20:45:16 142

原创 Mysql 聚合函数

1.COUNT统计个数,如果数据相同也会重复计数。mysql> SELECT COUNT(author_fname) FROM books;+---------------------+| COUNT(author_fname) |+---------------------+| 19 |+---------------------+mysql> SELECT COUNT(DISTINCT(author_fname)) FROM books;

2020-05-16 15:24:59 109

空空如也

空空如也

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

TA关注的人

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