自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

有道无术,术尚可求,有术无道,止于术。

颗粒归仓,不断积累,温故知新

  • 博客(265)
  • 资源 (2)
  • 收藏
  • 关注

原创 【Java 并发编程】 03 万恶的 Bug 起源—并发编程的三大特性

今天让我们一起走进并发编程中万恶的Bug起源—并发编程中三大特性。今天学习目标如下:并发编程的三大特性都要哪些 ?并发编程三大特性的由来?如何解决并发编程三大特性问题?一张导图概览全文基本概念原子性:一组操作要么全部成功,要么全部失败。可见性:一个线程对变量进行了修改,另外一个线程能够立刻读取到此变量的最新值。有序性:代码执行顺序并不一定和你编写的顺序一致。为什么会有并发编程的三大特性呢?话说女娲补天,精卫填海 …一直到上世纪60年代英特尔创始人戈登·摩尔讲的:“集成电路上可容纳的

2020-05-13 11:13:59 290

原创 【MySQL 实战】02. 一条SQL 更新语句是如何具体执行的呢?

我们在 MySQL 实战 01 篇中讲到了一条SQL查询语句是如何执行的? 首先经过连接器进行客户端的连接,权限认证等操作,其次先去缓存中查看,如果缓存中命中则直接返回,如果未命中,则进入分析器,分析器对SQL查询语句进行语法语义分析,优化器执行查询计划,选在最佳执行计划,执行器调用存储引擎的接口,返回要查询的结果集。文章末尾我们讲到了,一条查询语句是这样进行的,那么一条更新语句是如何进行的呢?...

2020-04-13 10:47:35 274

原创 【SQL 必知必会】性能篇 05. 深入浅出索引(二)如何通过索引让SQL 查询效率最大化?

上一篇 深入浅出索引(一),我们讲到了索引的基本概念,通过索引可以提高我们的查询效率,同时学习了索引的常用模型,索引的种类,在数据量少的时候,以及数据量重复度高的情况下不适合使用索引。今天我们学习一下通过索引如何让查询效率最大化,到底什么情况下使用索引。 数据表字段具有哪些特征时,使用索引呢? 索引失效的情况有哪些,如何避免?1. 具体情况下使用索引呢1.1 字段具有唯一性的限制,...

2020-04-06 15:19:08 512

原创 【SQL 必知必会】性能篇 04.深入浅出索引(一)

索引在SQL优化中占很大的比重,好的索引能提高效率,但是有时候加了索引,查询效率反而降低。索引好比书本的目录,通过目录我们很快定位到要查找的内容,不使用反而会大大降低查询效率。如果目录过多2. 问题什么时候使用索引,什么时候不使用?索引的类型都有哪些?3. 索引不是万能的索引好比目录一样,数据量大的时候,如果不加索引,是通过表一个个扫描的。但是加了索引以后,先在索引中直接查找...

2020-04-05 20:54:16 2626 2

原创 【SQL 必知必会】 性能篇 01. 如何考虑数据库调优

1. 数据库调优的对象与目标对象:整个DBMS,包括 SQL查询,数据库部署配置,架构等目标:数据库响应时间快,吞吐量更大。2. 调优考虑的维度有哪些用户反馈:是最及时的,是最直接的。日志分析:通过数据库日志以及操作系统日志定位问题。服务器资源使用监控:监控服务器的cpu、内存、I/O等使用情况,实时了解服务器性能使用,与历史情况对比。数据库内部情况监控:活动会话(Acti...

2020-04-04 14:30:11 444

原创 集合-并集,交集,差集

集合 :并集 交集 差集

2022-09-01 15:29:49 232 1

原创 Stream

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果,筛选,求和, 排序,聚合实体类public class Employee { /** 热词ID(主键ID) */ private Long id; /** 姓名 */ private String name; /** 工资 */ private Integer salary; /** 部门

2020-11-24 09:24:29 487 3

原创 Centos 7 搭建 Redis 单节点集群

Redis是C语言开发,安装Redis需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc yum -y install gcc automake autoconf libtool make 解压、编译、安装tar -zxvf redis-5.0.0.tar.gzcd redis-5.0.0make && make install新建文件夹redis_clustermkdir redis_clustercd redis_clusterm

2020-11-18 13:53:00 308 1

原创 BIO、NIO、AIO 是什么,有什么区别?

待续!

2020-09-13 09:51:24 284

原创 【Redis】17. Redis 常用工具类

package com.fjx.prize.commons.utils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.util.CollectionUtils;

2020-08-17 18:26:05 221

原创 MyBatis Generator 生成代码

MyBatis Generator(MBG)是MyBatis MyBatis 和 iBATIS的代码生成器。它将为所有版本的MyBatis以及版本2.2.0之后的iBATIS版本生成代码。它将内省数据库表(或许多表),并将生成可用于访问表的工件。这减少了设置对象和配置文件以与数据库表交互的初始麻烦。MBG寻求对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍然需要为连接查询或存储过程手动编写SQL和对象代码。创建 maven 项目pom文件<?xml versio.

2020-08-17 17:22:17 402

原创 【集合】 HashMap 你知道多少 ?

最近应粉丝要求,讲一讲集合中的 HashMap, 当然 HashMap 也是面试中经常被问到的一点,如图:1. HashMap 的底层结构?底层的最终其实是一个数组+链表的数据结构,根据key我们可以得到一个hash值,然后hash 值与数组长度进行取模运算,定位到数组的某一个位置假设数组长度为16 ,通过hash(张三)=6,根据6和16进行取模运算,结果为6,则将键值对<”张三”:"好帅">存放在该数组下标为6的位置。map.put("张三","好帅");map.put("李四"

2020-08-06 16:51:22 324

原创 Mycat 双主双从实现读写分离

上一篇博客我们已经实现了 mysql 数据库的双主双从的搭建,今天应粉丝的要求,用mycat 实现数据库的读写分离。

2020-07-20 21:48:21 291

原创 【MySQL 实战】04. MySQL 主从复制(双主双从)

角色ip 地址简称Master1192.168.183.134134 主Slave1192.168.183.133133 从Master2192.168.183.128128 主Slave2192.168.183.135135 从修改134主配置文件 vi /etc/my.cnf#主服务器唯一IDserver-id=1#启用二进制日志log-bin=mysql-bin# 设置不要复制的数据库(可设置多个)binlog-ignore-...

2020-07-19 12:02:26 282

原创 【MySQL 实战】03. MySQL 主从复制(一主一从)

1. 原理主动复制原理图:主库负责写,从库负责读,从库需要不断获取主库数据更新到从库。(存在延时)我们知道主库添加数据是要写逻辑日志binlog,从库通过 I/O进程获取主库的binlog文件,然后写入到中转日志文件 Relay log,在从Relay log 中恢复数据。2. 配置134 主服务器配置,首先修改 mysql 配置文件 vi /etc/my.cnf#主服务器唯一IDserver-id=1#启用二进制日志log-bin=mysql-bin# 设置不要复制的数据库(可设置多

2020-07-19 10:40:00 220

原创 Centos7 搭建数据库中间件 - Mycat

个人习惯,一般安装到 /usr/local/software--解压tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz定位到 conf 目录 进行文件配置,分别修改server.xml文件和schema.xml 文件。vi server.xml,修改user标签。vi schema.xml,删除文件,重新编写配置文件<?xml version="1.0"?><!DOCTYPE mycat:

2020-07-19 09:11:40 236

原创 【MySQL 实战】基础篇:Centos7 安装 MySQL

1. 安装# 下载wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm# 下载安装rpm -ivh mysql57-community-release-el7-8.noarch.rpm# 安装 mysqlserversudo yum install mysql-server# 启动 mysqlservice mysqld.service start获取临时密码 sudo grep 'temporary

2020-07-18 10:44:47 132

原创 【JVM】01 内存模型(运行时数据区)

JVM(java virtual machine),一种可以运行 java 字节码的虚拟机。java 语言一次编译,到处运行,间接的说明了,只要编译的文件和 jvm 对加载编译的文件格式一致,任何语言都可以由 JVM 运行。JVM 由三个主要的子系统构成类加载子系统运行时数据区(内存结构)执行引擎今天我们主要学习 JVM 的内存模型 — 运行时数据区。Java 的内存模型(运行时数据区)方法区堆...

2020-06-02 15:21:32 279 2

原创 【Redis】16. HyperLogLog — 亿级别的基数统计

场景老板让你统计一下网站的PV(浏览量,用户访问一次自增一次)和UV((独立访客,每个用户每天只记录一次)。PV 可以很好解决,我们可以使用redis 计数器,当天日期为key,每收到一个请求,INCRBY 就自增加一,最后结果就是浏览量了。UV,一个用户每天访问多次,但只能记录一次,是不是可以用缓存的 SET 集合,SET 可以去重,但是问题来了,随着访问量的增加,如果用 SET 集合,这是相当浪费内存的,不仅如此,如果对set集合聚合统计,实现也很复杂。使用位图,位图是以bit 为存储单位,是i

2020-05-28 10:41:37 571

原创 【Redis】15. 布隆过滤器(Bloom Filter) — 亿级别的过滤器

问题在 缓存穿透 一文中我们讲到了可以使用布隆过滤器可以解决缓存穿透问题。例如查询一个用户ID,它是如何快速查询,它又不是数组,又是怎么提高随机访问特性的查询效率的呢?我们平时刷短视频(抖音,快手等)是如何做到刷到的视频是不重复的呢?如果把用户刷到的信息都存放在数据库中,抖音八亿用户,每次都要进行 exists 判断该视频是否被看过,滑动一下就需要去库中查看,磁盘是远远跟不上性能的。如果用缓存,缓存容量有限,且需要对浏览的记录设置永不过期,这么多用户,用内存存记录,成本的?哪个企业会这么做?什么是布

2020-05-28 09:50:50 668

原创 【Redis】14. 跳跃表(SkipList) — 为什么 Redis 使用跳跃表来实现有序集合(Sorted Set)而不是红黑树或者平衡二叉树呢?

Redis 的有序集合(Sorted Set)就是用跳表来实现的。跳跃表是一种随机化的数据结构。我们可以把他看做 Java 中 SortedSet 和HashMap 的结合体,set 保证了value 值就有唯一性,且可以保证每一个value 有一个自己的权重值 socre ,用socre 达到排序的目的。一个单链表的结构无论是不是有序的,遍历都是从头到尾进行遍历,有的人说了,用二分法,二分法是针对数组进行查找的一种方法,而链表不可以,链表逻辑上是连续的,物理存储上是不连续的。数组不支持随机的插入和删除,

2020-05-27 18:55:17 848

原创 【Redis】13. Redis 为什么选择单线程,而 redis 4.0 之后部分命令开始使用多线程。

Redis 为什么使用单线程?因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是 机器内存的大小 或者 网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。----官方解释。Redis 真正的瓶颈问题并不是CPU ,而是内存,以及网络传输各种延迟。使用单线程带来的好处?使用单线程模型能带来更好的 可维护性,方便开发和调试;(相对于多线而言,程序执行顺序具有却行性,没有任何诡异的bug)使用单线程模型也能 并发

2020-05-27 11:59:39 673

原创 【redis】12. 缓存和数据库双写一致性问题

上一篇我们在 缓存雪崩,穿透,击穿中讲到了为什么使用缓存,以及使用缓存可能会遇到哪些问题?其中就有缓存和数据库双写一致性问题。那什么是缓存和数据库双写一致性问题呢?是什么导致了一致性的问题呢?什么是缓存和数据库双写一致性问题?数据库中的数据和缓存中的数据不一致如果我们只是读操作,肯定不会存在缓存和数据库双写一致性问题。但是如果更新或者删除操作呢?是什么导致了数据库和缓存双写一致性问题?我们知道执行一个更新操作花费的时间远远大于一个读操作花费的时间。更新操作,我们是先更新数据库呢还是先更新缓存呢?

2020-05-27 11:25:27 275

原创 【Redis】8. 你了解缓存雪崩,缓存穿透,缓存击穿么?它们用共性么?

什么是缓存雪崩,缓存击穿,缓存穿透呢?

2020-05-27 09:40:41 251

原创 【Redis】11. pipeline 流水线

上一节我们 redis 执行命令的生命周期大概为:发送命令 (客户端发送)排队 (服务端排队)执行命令 (服务端执行)返回结果 (服务端返回)我们知道服务端每秒可执行上万条命令,执行一条命命令是微妙级别的,客户端发送一条命令,需要在网络中进行传输,网络是不稳定的,这个传输时间是很长的,可见网络传输对redis 的性能是有一定影响的。n 条命令所花费的时间为: n 次网络传输时间 + n次服务器处理时间pipeline(流水线):客户端批量发送命令,此时处理n 条命令所花费的

2020-05-26 19:19:41 265

原创 【Redis】10. 慢查询

redis 运行生命周期发送命令排队 (单线程,所以要排队)执行命令 (不同的命令,执行时间不同。有的执行时间长,影响整体性能)返回结果慢查询慢查询发生在执行命令阶段(第三阶段),当发现某redis命令执行时间过长,就会记录该命令到慢查询日志当中。使用者可以更好地监视和找出在业务中一些慢redis操作,找到更好的优化方法。慢查询设置最大超时时间,慢查询的阈值(单位:微妙)CONFIG SET slowlog-log-slower-than num设置超过多少微秒的查询

2020-05-26 17:00:18 294

原创 【Redis】0. 关系型数据库和非关系型数据库入门篇

什么是关系型数据库关系型数据库是依据关系模型来创建的数据库。所谓关系模型就是“一对一、一对多、多对多”等关系模型,关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。关系模型包括数据结构(数据存储的问题,二维表)、操作指令集合(SQL语句)、完整性约束(表内数据约束、表与表之间的约束)。什么是非关系型数据库NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.

2020-05-26 16:35:09 325

原创 【Redis】7. SpringBoot 整合 lettuce

新建 maven 项目导入依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.

2020-05-23 14:51:04 625 1

原创 【消息队列】06 避免内存溢出和频繁的垃圾回收

内存如果溢出,通过自动内存管理机制实现,垃圾回收是不可控的,但是可以降低回收的频率。自动内存管理机制的实现原理 —避免内存溢出1申请内存过程计算要创建对象所需要占用的内存大小在内存中找一块儿连续并且是空闲的内存空间,标记为已占用;把申请的内存地址绑定到对象的引用上,这时候对象就可以使用了。垃圾回收过程— 标记、清除两阶段标记阶段:从 GC Root 开始,你可以简单地把 GC Root 理解为程序入口的那个对象,标记所有可达的对象,因为程序中所有在用的对象一定都会被这个 GC Root

2020-05-18 11:11:57 449

原创 【消息队列】05 如何处理消息积压问题

为什么会有消息积压?如何处理消息积压?

2020-05-18 10:59:07 380

原创 【消息队列】04 幂等性解决重复消息问题

幂等性如果一个函数 f(x) 满足:f(f(x)) = f(x),则函数 f(x) 满足幂等性。计算机中描述一个操作,方法或者服务,一个幂等操作的特点是,其任意多次执行所产生的影响均与一次执行的影响相同。总结 :一个幂等方法使用相同参数,进行一次或多次调用对系统产生的影响是一样的,重复执行对系统没有任何改变。...

2020-05-18 10:57:03 284

原创 【消息队列】03 消息队列是如何确保消息不丢失的

消息可靠传递,我们要看消息都在出现在哪里?生产阶段通过收到broker 的确认响应,则表示发送成功。同步发送消息可以通过 try catch 捕获异常,进行重发,如果是异步发送消息,则需要写回调方法检查消息是否丢失。存储阶段将消息写入多个副本,或者通过配置刷盘和复制相关参数,不因Broker宕机导致消息丢失。消费阶段处理完所有的消费业务逻辑后,在发ACK。...

2020-05-18 10:52:58 216

原创 【消息队列】02 如何选择消息队列 —技术选型

消息队列这么多,你是怎么做技术选型的呢?技术选型的标准是什么?技术选型的标准必须是开源产品,有Bug可以修改源码。必须是近几年流行,社区活跃度高,遇到Bug方便解决。与周边的生态系统兼容和集成度要高。消息传递可靠;确保消息不丢失,支持集群,有良好的性能且满足大多数场景的性能要求。RabbitMqRocketMqkafka第二梯队消息队列总结若对消息队列的功能和性能没有很高的要求,建议用RabbitMq,开箱即用。RocketMq主要场景是处理在线业务,例如交易系统用消

2020-05-18 10:44:13 243

原创 【消息队列】01 为什么需要消息队列 — 解耦、异步、削峰

为什么需要消息队列?如何做消息队列的选型? 消息队列——解耦,异步,削峰!

2020-05-18 10:23:06 427

原创 【Java 并发编程】 06 从底层解读万能的 synchronized

synchronized上一篇 【Java 并发编程】 05 一个能和面试官扯很久的 volatile 关键字 中讲到了 volatile 可以解决线程并发执行中可见性和有序性问题。 在【Java 并发编程】 07 线程安全 中简单介绍了可以通过 CAS 解决原子性问题。volatile 关键字和 乐观锁只能解决特定的问题,那有没有一种方法可以解决这些统一的问题呢? 万恶的 Bug 起源—并发编程的三大特性 有,有请我们今天的主角闪亮登场 synchronized 关键字synchronized 关键

2020-05-17 16:41:49 212

原创 【Java 并发编程】 07 线程安全

什么是线程安全呢?线程安全并非“线程安全”,大家不要望文生义,所谓的线程安全其实指的是内存的安全,随着操作系统的发展,不再是单核CPU,而是多核多任务,也就意味的进程的并发执行,回想一下是不是可以一边敲着代码,一边听着歌,此时问题来了,为什么这两个进程互不影响呢?操作系统对此做了一系列的保障,是的每一个进程有自己的一块内存空间,进程之间是隔离的,彼此不能互相访问。每个进程有自己的一块特殊公共的区域,称为堆内存,既然是公共区域,那么一个进程里面的多个线程都可访问的到,这也就是 bug 的起源。一个线程访问

2020-05-17 12:00:26 265

原创 【Java 并发编程】 01 多线程的实现

常用的实现多线程的2种方式:继承 Thread 或者实现 Runanable 接口Thread 类 实现了 Runnable 接口public class Thread implements Runnable {}//继承 Thread 类public class MyThread extends Thread { /* static Thread currentThread(),返回正在执行的线程对象的引用 public static void sleep(l

2020-05-16 18:27:28 280 1

原创 【Java 并发编程】 02 线程的生命周期(线程状态之间的转换)

如果对并发编程状态不是很了解的同学,我们可以回想一下操作系统原理关于进程的生命周期的学习,学习操作系统原理的同学都知道,进程也有自己的生命周期,进程可大致分为三种状态,以及三种状态之间的转变, ???? 操作系统—进程。三种状态执行态:CPU正在运行的状态就绪态:一旦获得CPU就可以运行的状态。一句话总结;完事具备,只欠东风(CPU)阻塞态:进程等待资源或某个事件的发生而暂停的状态。状态间转换阻塞态 ???? 就绪态(唤醒过程)执行态 ???? 就绪态(因为是分时操作,当时间片用完,执行

2020-05-16 17:28:32 372

原创 【Java 并发编程】 05 一个能和面试官扯很久的 volatile 关键字

上一篇我们在Java内存模型中(JMM)中 Happens-before 中讲到了volatile原则,对于volatile变量的写操作会早于对其的读操作。 volatile 意思就是可见的,常用来修饰某个共享变量,意思是当共享变量的值被修改后,会及时通知到其它线程上,其它线程就能知道当前共享变量的值已经被修改了。volatile 关键字用来修饰实例变量和类变量。被 volatile 修饰后的变量可以解决并发编程可见性和有序性问题。但是不能保证原子性,且volatile 只能作用于实例或者类变量,不能修饰

2020-05-13 15:58:06 248

原创 【Java 并发编程】 04 JMM内存模型解决有序性和可见性问题

Java内存模型,即 JMM (Java Memory Model),JMM 是一种规范,它规范了 JVM 运行的行为,多线程操作对共享内存读取时,所能读取到的值应该遵守的规则。提供了一些解决可见性和有序性问题的方法例如 volatile、synchronized 和 final 三个关键字。JMM为程序中的所有操作定义了一定的规则,叫做Happens-Before 规则**Happens-Before 规则 解决了有序性和可见性的问题,如果你想保证你代码执行顺序不变(即有序性),你就需要遵守 Hap

2020-05-13 11:56:52 261

中级软件设计师考试总结.zip

分享软考知识点总结,以及自己对各种题型的解析看法,内容总共包括12章节,对每一章节考点,考点分值,题型分析,个人解析都做了详细的描述,带领10多名小伙伴过了中级软件职称考试,希望本文档帮助了很多的人,欢迎下载。

2020-07-11

FastDFS源码封装(SpringBoot集成FastDFS)

FastDFS源码,sSpringBoot集成FastDFS源码,解决了跨域问题,集成了Swagger,方便测试使用。

2019-12-25

空空如也

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

TA关注的人

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