自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (1)
  • 收藏
  • 关注

原创 MySQL存储过程综述及如何使用Navicat创建存储过程

一、什么是MySQL存储过程?  在大型项目中,有时候需要重复执行能够完成特定功能的SQL语句集,而MySQL为我们提供了存储过程的概念,存储过程是数据库中的一个重要对象,它是存储在数据库中的一组完成特定功能的SQL语句集。它第一次编译后,只要没有修改,处处都可以直接调用且不用重新编译,用户通过指定存储过程的名字和参数(若该存储过程存在参数)来执行它。二、存储过程的特点1:能够完成复杂的判断和运算;2:可编程性强,且使用灵活;3:可重复使用SQL编程代码;4:执行速度相对较快;5:能够减少网络

2020-05-10 23:13:55 6207 1

原创 redis持久化机制、删除策略、淘汰策略、数据一致性问题及布隆过滤器详解

为了提高系统的访问效率和降低服务器压力,我们通常会采用缓存的策略,而使用缓存可以有效地支持高性能和高并发,而我们常用redis作为缓存。高性能:用户第一次访问数据库中的某些数据时,是从硬盘中读取的,该过程缓慢。而操作缓存是直接操作内存,速度快。所以,当第一次访问后,将数据存储在缓存,若数据库中的数据有变动,则同步改变缓存中相应的数据。高并发:直接操作缓存能够承受的请求是远远大于直接访问数据...

2020-04-30 01:50:23 1544

原创 java序列化和反序列化,面试必备

一、序列化、反序列化、使用场景、意义。序列化:将对象写入IO流中;反序列化:从IO流中恢复对象;意义:序列化机制允许将实现序列化的Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地对象可以脱离程序的运行而独立存在。使用场景:所有在网络上传输的对象都必须是可序列化的。如:RMI (远程方法调用),传入的参数或返回的对象都是可序列化...

2020-04-26 17:04:19 7520 4

原创 通过 Tomcat 获取 Websocket 的远程客户端 IP

  因为 websocket 的连接只有 session,所以需要借助 tomcat 来获取远程的客户端 IP。程序如下所示:package com.maxvision.maxects.util;import javax.websocket.RemoteEndpoint;import javax.websocket.Session;import java.lang.reflect.Field;import java.net.InetSocketAddress;public class Web

2021-06-18 11:02:27 1192

原创 【LeetCode】11-Container With Most Water 盛最多的水(双指针法、缩减搜索空间思想)

【11】盛最多的水 - 双指针法、缩减搜索空间思想  给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。  说明:你不能倾斜容器。  示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水

2021-04-18 11:59:36 355 2

原创 【领你入门 Netty】服务端未收到客户端回复时的消息重发机制

一、应用场景  由于最近在做硬件通讯交互方面的项目,使用的是 Netty 作为中间件,存在以下两个应用场景:  1)业务平台通过 Netty 下发一条指令到终端设备,且终端设备需要上行指令确认,说明该终端设备收到该条指令。但是,存在网络抖动或终端设备突然失联等情况,此时,客户端并未收到该条指令。因此,期望服务端能够在指定时间间隔和重试次数的情况下重发未收到上行确认的指令。  2)周期性下发通讯指令,获得终端设备的近实时数据,如定位信息、终端状态等。二、解决方案  提出以下两种解决方案,若读者们有更

2021-04-09 16:40:59 2068

原创 【领你入门Netty】- Netty线程模型与入门程序详解

一、Netty 简介  Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 I/O 程序。它是一个基于 NIO 的网络编程框架,相比于 Java 原生的 NIO,它具有如下的优势:支持三种 I/O 模型同时支持三种 Reactor 模型。支持很多应用层的协议,提供了很多编解码器。能够很好地解决 TCP 长连接所带来的缺陷(粘包、半包等)。提供了应用层的 Keep Alive 机制。有更好的性能

2021-04-05 21:53:10 152

原创 java计算CRC8循环校验码,亲测可用!

public static int getCrc(byte[] data){ int CRC = 0; int genPoly = 0x8C; for(int i = 0; i < data.length; i++){ CRC ^= data[i]; // 保证 CRC 余码输出为 1 字节 CRC &= 0xff; for(int j = 0; j < 8; j++){ if((CRC & 0x01) != 0){ CRC = (CRC

2021-03-25 20:06:38 829

原创 在maven的pom文件中,设置打包时跳过测试模块

  若使用 maven 作为项目管理工具,可在 pom.xml 文件中设置打包项目的时候,跳过测试模块的执行,直接将项目进行打包。<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plug

2021-03-14 19:31:50 1380

原创 通过 js 获取当月的第一天和最后一天

var firstDate = new Date();firstDate.setDate(1); var endDate = new Date(firstDate);endDate.setMonth(firstDate.getMonth()+1);endDate.setDate(0);alert("第一天 --> " + new Date(firstDate));alert("最后一天 --> " + new Date(endDate));

2021-03-07 11:07:28 2286

原创 接口开发的幂等性方案

一、接口幂等性1.1 接口幂等性定义  在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即仅第一次请求会对资源产生副作用,后续的多个请求对于同一个资源不会产生副作用。  这里的副作用是不会对结果产生破坏或者产生不可预料的结果。也就是说,其任意多次执行对资源本身所产生的影响均与第一次执行的影响相同。1.2 实现接口幂等性的优劣  以下情况若不保证接口幂等性,将会对系统产生不可预知的问题。前端重复提交表单:用户提交表单

2021-03-03 15:00:16 245

原创 CGLIB 常用的 API 详解

一、概述  本文主要讲解的是 CGLIB 的常用 API 及其使用方式。使用的 CGLIB 依赖如下所示:<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version></dependency>  首先创建接口 CglibSampleInterface 和类 CglibSam

2021-02-05 14:24:10 667

原创 Spring Boot 结合 Redis 实现接口访问限流

一、概述  本文主要通过 Redis 和 Lua 脚本的方式实现接口的访问限流,限流的方式可基于客户端的访问 IP 进行限流,也可以对访问接口的频率进行限流。主要的实现思路是通过在 Redis 中设置 key 的过期时间以及该接口对应的访问次数,若大于访问次数,则不允许再访问接口,可对页面进行重定向或给出提示信息,本文则简单地实现核心的逻辑。  项目结构如下图所示:二、实现过程2.1 项目依赖 <properties> <java.version>1

2021-02-04 14:34:21 389

原创 CGLIB 动态代理及其原理分析

一、简介  CGLIB,即 Code Generation Library,是一个强大的、高性能的代码生成库。它可以在运行期扩展 Java 类与实现 Java 接口(JDK 动态代理只能用于接口),它被许多 AOP 框架广泛地使用,如为 Spring AOP 提供方法的 interception(拦截),被 Hibernate 用来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。本文使用的 CGLIB 依赖如下:<dependency> <groupId>

2021-02-01 15:29:52 5656 3

原创 java-深入理解锁升级、锁粗化、锁消除

一、简介  Java SE 1.6 为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。因此,在 Java SE 1.6 一共有 4 种锁的状态,级别由低到高依次是:无锁、偏向锁、轻量级锁、重量级锁,并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,也就是说只能进行锁升级(从低级别到高级别),意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。二、预备知识2.1 对象头  以 Hotspot 虚拟机为例,

2021-01-28 11:16:06 885 1

原创 面试常问:linux top 命令详解

一、top 命令的作用   top 命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top 显示系统的是当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。比较准确的说,top 命令提供了实时的对系统处理器的状态监视。它将显示系统中 CPU 最 “敏感” 的任务列表。该命令可以按 CPU 使用、内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以

2021-01-25 11:49:47 1785 1

原创 深入理解静态代理与 JDK 动态代理

一、概述  静态代理和动态代理都是代理模式的实现方式之一,代理模式是一种常用的设计模式,在 Spring AOP 和 PRC 等诸多框架中均使用到了代理的思想,其目的是为其他对象提供一个代理来控制对某个对象的访问。代理类负责为委托类 (真实角色) 预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。基本的结构如下所示,主要包括三种角色:抽象角色:声明待实现的方法。抽象角色可以是接口或抽象类。委托类角色或真实角色:业务逻辑的具体执行者,实现抽象角色中所声明的方法。代理类角色:内部含

2021-01-18 17:03:55 213

原创 java-自动装箱和自动拆箱

一、简述  自动装箱和自动拆箱是两个相反的过程,自动装箱即将基本数据类型转换为对应的封装类,自动拆箱即将封装类转换为对应的基本数据类型。此外,装箱的过程会增加内存的消耗,影响性能,因为这个过程会创建对应的对象。  可进行自动装箱和自动拆箱的类型如下图所示:二、自动装箱和自动拆箱  采用如下示例说明自动装箱和自动拆箱的原理。public class Main { public static void main(String[] args) { Integer integer

2021-01-13 09:49:03 1361 1

原创 java-向上转型和向下转型

一、简述  Java 转型主要是用在继承和接口实现的场景,Java 转型可分为向上转型和向下转型,区别如下:向上转型:通过子类对象实例化父类对象,这属于自动转换。向下转型:通过父类对象实例化子类对象,这属于强制转换。  只要记住一句话即可,父类引用指向子类对象,即 <父类型> <引用变量名> = new <子类型>()。二、向上转型  子类引用的对象转换为父类类型称为向上转型。向上转型后的父类引用只能调用父类的属性,若子类重写了父类的方法,则通过父类引用调

2021-01-11 12:32:54 321

原创 面试必问:static 和 final 关键字

一、static 关键字  1) 静态变量与实例变量  静态变量:即类变量,该变量是属于类的,类的所有实例都共享该静态变量,可以通过类名.静态变量名来访问。此外,静态变量在内存中只存在一份。  实例变量:每创建一个实例就会产生一个实例变量,该实例变量的生命周期与实例相同。  2) 静态方法  静态方法在类加载前就已经存在,它不依赖于任何实例,且必须有方法体,即 static 和 abstract 不能同时使用。此外,静态方法只能访问所属类的静态变量和静态方法,静态方法中也不能存在 this 和 s

2021-01-10 11:00:36 125

原创 java常见注解

  @Retention:用于描述注解的生命周期,表示需要在什么级别保存该注解,即保留的时间长短。@Retention(RetentionPolicy.SOURCE):注解仅存在于源码中,在class字节码文件中不包含。@Retention(RetentionPolicy.CLASS):默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。@Retention(RetentionPolicy.RUNTIME):注解会在class字节码文件中存在,在运行时可以通过反射获取到。  @

2021-01-06 15:30:03 208

原创 线程池 Executor 和 ThreadPoolExecutor

一、线程池简述  线程池即线程的集合,线程池在系统启动时就创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务,使用线程池可以很好地提高性能。1.1 线程池的工作机制  在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在其内部寻找是否有空闲的线程,若有,则将任务交给某个空闲的线程。  此外,一个线程同时只能执行一个任务,但可以同时向一个线程

2021-01-02 11:27:20 344

原创 SpringBoot 整合 Redis 的配置类 RedisConfig

一、引入依赖<!--fastjson 依赖--><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.70</version></dependency><!--Spring boot Redis 依赖--><dependency>

2020-12-25 15:38:47 4419 1

原创 Spring Security 认证过程详解

一、认证流程图  假设系统当前没有任何用户登录且没有任何的用户缓存。认证流程如下图所示:二、过程详解  1) 用户发起表单验证后,首先会被UsernamePasswordAuthenticationFilter捕获。  UsernamePasswordAuthenticationFilter中根据用户表单信息中的用户名和密码构建UsernamePasswordAuthenticationToken,并将其交给AuthenticationManager实现认证过程。  但在大部分情况下,我们会在自

2020-12-23 08:54:10 1474 1

原创 Redis 常用数据类型工具类 RedisUtils

  Redis 中常见的四种数据类型 String、Map、List、Set、Zset 和对 key 的进行操作的工具类。  GitHub 地址:https://github.com/wadreamer/blogdata/blob/main/RedisUtils.javapackage club.wadreamer.utils;import com.google.common.collect.Lists;import com.google.common.collect.Sets;import o

2020-12-16 16:47:06 429

原创 Docker 常见单机环境搭建过程

一、MySQL# 创建目录mkdir -p /mydata/mysql/conf /mydata/mysql/data /mydata/mysql/logs# 创建数据库配置文件 my.cnfvim /mydata/mysql/conf/my.cnf# my.cnf 配置[client]default-character-set=utf8[mysql]default-character-set=utf8[mysqld]init_connect='SET collation_co

2020-12-11 14:49:31 191

原创 OpenResty 结合 Redis 实现二级缓存架构

一、OpenResty二、Redis三、

2020-12-08 11:32:45 491 2

原创 MySQL 数据库单主单从和双主双从集群方案

一、单主单从的 MySQL 读写分离架构  本文采用 Docker 的方式实现。

2020-11-02 15:24:18 481 1

原创 Ubuntu 16.04 安装 Docker

1. 卸载之前的旧版本sudo apt-get remove docker docker-engine docker-ce docker.io2. 卸载之前的旧版本sudo apt-get update3. 安装以下包以使 apt 可以通过HTTPS使用存储库(repository)sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-c4. 添加Docker官方的GPG密钥

2020-10-28 16:42:26 83

原创 Ubuntu 16.04 启用 root 用户并开启远程连接

一、开启 root 用户  1.1 使用 sudo passwd root 设置 root 用户密码  1.2 使用 su root 切换到 root 用户,若切换成功,则说明成功设置 root 用户密码  1.3 使用 cd /usr/share/lightdm/lightdm.conf.d/ 进入目录,并使用 gedit 50-unity-greeter.conf & 打开文件  1.4 在文件中添加如下内容user-session=ubuntugreeter-show-man

2020-10-28 16:28:49 674

原创 RSA 秘钥工具类详解

  本文使用PKCS8EncodedKeySpec生成私钥,使用X509EncodedKeySpec生成公钥。此外,使用Base64进行解码和编码.  完整的文件:Rsa工具类一、使用 PKCS8EncodedKeySpec 生成私钥的加解密  1.1 加密public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception { // 解码私钥字符串,得到私钥的 A

2020-10-19 09:24:48 1089 1

原创 Xshell连接 Ubuntu 虚拟机,connection failed 和 ssh 服务器拒绝了密码 解决方案

一、Connection failed 解决方案  Ubuntu 默认没有安装 ssh 服务,若通过 ssh 远程连接 Ubuntu,则会报如下错误:    此时,需要自己手动安装 openssh-server,且 ssh 分为:客户端openssh-client 、服务端openssh-server。  通过命令ssh localhost可以查看虚拟机中是否安装了 ssh 服务。  结果如下所示:    很明显,虚拟机中没有 ssh 服务。接下来通过 apt-get 源安装 ssh。若提示找

2020-06-14 16:03:17 2210

原创 Ubuntu apt-get 镜像源更换

一、国内的几个镜像源  1)阿里云镜像开源社区镜像站  2)网易开源镜像站  3)清华大学开源镜像站二、首先进入开源镜像站获取相应的连接,此处以阿里云为例三、备份自己的系统镜像源。sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak四、将 sources.list 的内容删掉,替换为获取到的镜像源地址。替换后的内容如下图所示。sudo gedit /etc/apt/sources.list# 此处使用 gedit 编辑器,比

2020-06-14 15:18:27 3703

原创 一文带你看透Redis Cluster原理

引言  通常我们会使用单体Redis应用作为缓存服务,但是为了保证高可用的环境,通常还会使用主从复制模式或读写分离的设计。  随着缓存数据量的增加,单体服务器无法承载缓存服务,此时就需要对缓存服务进行扩展。我们将需要缓存的数据切分成不同的分区,将数据分区分布在不同的服务器中,从而形成分布式缓存来承载高并发的缓存访问。恰好Redis Cluster能支持上述方案。  我们从以下几个方面来学习Redis Cluster的核心原理:Redis Cluster数据分区的实现、分布式缓存节点之间的通讯请求、分布

2020-05-19 14:04:12 402

原创 Ubuntu环境下安装Elasticsearch以及插件Kibana

安装Elasticsearch过程、问题。以及插件

2020-05-14 14:59:12 475

原创 超详细...搭建Redis缓存集群方案

以下是搭建Redis缓存集群的方案

2020-05-13 14:49:21 357

原创 吐血整理....为什么Redis默认是16个数据库?可以修改吗?

  在实际的项目中,Redis常被用作缓存、分布式锁、消息队列等的解决方案。但是在搭建好Redis服务后,Redis默认创建了16个数据库(db0~db15),而在Redis集群下只有一个db0数据库。如下图所示。图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图图~~redisdesktopManger的16个数据库的图和集群下的数据库图一、16个数据库的由来  Redis是一个类似于字典结构的存

2020-05-13 09:24:19 3454

原创 Elasticsearch集群“脑裂”现象

一、什么是Elasticsearch集群脑裂  Elasticsearch集群由一个主节点(可以有多个备选主节点)和多个数据节点组成。其中主节点负责创建、删除索引、分配分片、追踪集群中的节点状态等工作,即调度节点,计算压力较轻;数据节点负责数据存储和具体操作,如执行搜索、聚合等任务,计算压力较大。  正常情况下,当主节点无法工作时,会从备选主节点中选举一个出来变成新主节点,原主节点回归后变成备选主节点。但有时因为网络抖动等原因,主节点没能及时响应,集群误以为主节点下线了,选举了一个新主节点,此时一个El

2020-05-11 22:14:00 570

原创 深入剖析HTTPS原理

我们都知道HTTPS比HTTP安全,也听说过与HTTPS相关的SSL、CA证书等。但是,你知道为什么使用了HTTPS就是安全的吗?了解HTTPS的底层实现原理吗?而使用了HTTPS就一定是安全的吗?一、HTTPS实现原理HTTPS协议之所以是安全的,是因为HTTPS协议会对数据进行加密处理,加密的过程使用的是非对称加密。简单介绍下加密算法,加密算法分为:对称加密和非对称加密,其中对称加密算法...

2020-05-02 13:00:13 1109

原创 超详细的java.lang.Object类源码解析,动手收藏起来吧

学习过Java的程序猿们都知道,Object是Java所有类的顶级父类,所有的类都继承自该类,包括数组都实现了该类中的方法。在Object的源码中也是这么写道 (tips:学习源码的过程,也是提升英语阅读能力的过程,本人会做该标注来表示某个词组的意思【外文】(译文)):/** * Class {@code Object} is the root of [the class hierarchy]...

2020-04-29 17:01:21 1211

Folder2Iso.zip

Folder2Iso ver2.0

2021-09-15

空空如也

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

TA关注的人

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