mozhu

Netty 原理解析与开发实战(二)

八、ChannelHandler 8.1 ChannelHandler介绍 我们对数据的处理都是在ChannelHandler中完成的,Netty提供了众多ChannelHandler的实现类来帮助我们实现一些网络编程中通用功能,比如最常用的心跳检测、数据编解码等。 Netty中的ChannelHa

Netty 原理解析与开发实战(一)

一、Netty 概述 1.1 Java网络编程进化史 1.1.1 Java OIO 早期java提供了 java.net包用于开发网络应用,这类API被称为阻塞Java OIO(阻塞IO)。 服务端主要实例代码: ServerSocket serverSocket = new ServerSocke

Redis原理篇

动态字符串SDS(Simple Dynamic String) SDS的结构体如下图所示: 内存预分配 如果新字符串长度小于1M,则新分配大小为2倍的新字符串大小+1 如果新字符串长度大于等于1M,则新分配大小为新字符串长度+1M+1 SDS的优点: 支持动态扩容 获取长度的时间复杂度为O(1) 二

Redis实战(八)集群

是什么? 引入的原因是:由于数据量过大,单个master复制集难以承担,因此需要对多个复制集构建集群,形成水平扩展,每个复制集只负责存储整个数据集的一部分,这就是Redis集群,起作用是提供在多个Redis节点间共享数据的程序集。 Redis集群是一个提供在多个Redis节点间共享数据的程序集。Re

Redis实战(七)哨兵机制(Sentinel)

High availability for non-clustered Redis. 哨兵机制和主从复制配合来实现高可用架构,而集群是对两者的集成,兼具主从复制和master节点高可用。 是什么? 哨兵巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个slave转换为新mast

Redis实战(六)主从复制(Replica)

是什么? 其实就是主从复制,Master是主节点,Slave是从节点,Master以写为主,Slave以读为主。当Master数据变化时,自动将数据以异步的方式写入Slave节点。 能干嘛? Redis复制最终的结果是多台主机拥有相同的数据,这样做的好处如下: 读写分离,主节点主要提供写服务,从节点

Redis实战(五)管道

如何优化命令频繁往返造成的性能瓶颈? 问题由来 Redis是一种基于客户端-服务端模型已经请求/响应协议的TCP服务。一个请求会遵循一下步骤: 客户端向服务器发送命令分四步(发送命令-命令排队-命令执行-返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应 服务端处理命令,并将结果返回给

Redis实战(三)持久化

RDB 持久化工作流程 当触发rdb持久化时,Redis主进程会fork一个子进程,该子进程的内存空间中有和主进程相同的数据,Redis子进程将数据保存为rdb文件。当Redis重启时,可以从rdb文件中加载备份的数据。 配置方式 6.0以前配置 6.0以前只能单行进行配置,这些条件之间是或的关系,

Redis实战(四)事务

是什么? 可以一次执行多个命令,本质是一组命令的集合。一个事务中所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞 Redis事务没有提供绝对的一致性,也就是没有ACID特性,也不支持事务回滚 能干嘛? 将指令放在一个队列中,用来一次性、顺序性、排他性的执行一系列命令。 Redis

Redis实战(二)十大数据类型及其操作命令

基本介绍 最新版本的Redis支持10种数据类型,分别是:string、set、hash、zset、list、bitmap、geospatial、bitfield、hyperLoglog。 string:用来储存字符串,同时支持元素级的累加 set:无序集合,支持集合相关的操作(并、交、差) has

Redis实战(一)简介与Redis基本配置

Redis是什么? Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value数据库,提供了丰富的数据结构,例如String、list、Set、SortedSet、Hash等等。数据是存在内存中的,同时Redi

MySQL进阶篇

存储引擎(Engine) Mysql体系结构 Mysql默认的存储引擎为InnoDB。 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证及相关的安全方案。服务器也会为安全接入的每个用户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口,

MySQL基础篇

数据库三范式 第一范式 确保每列的原子性 第二范式 确保表中的每列都与主键相关。也可理解为其他列直接依赖主键。 第三范式 确保表中的每列都与主键直接相关,而不是间接相关。也可理解为不能有传递性依赖。 SQL常用语句 SQL类型 DDL语句 数据库操作 查询

Java中的代理原理

JDK提供的代理 通过jdk提供的代理来实现代理功能时,需要代理对象实现接口。jdk代理的原理:通过Proxy.newProxyIntance()方法来创建一个代理对象,需要传入InvocationHandler的实现类,该接口提供三个参数,其中一个是Method对象,这里通过Method对象来反射

Kafka高级篇

Kafka集群中的Controller、Rebalance、HW Controller 集群中谁来当Controller?Broker在启动时,会向ZK特定节点下注册临时序号节点,获得最小序号的Broker充当Controller的角色。 Controller主要负责下面几件事: 当某个分区的Lea

Kafka 基础篇

基本操作命令 启动Kafka # 需要指定配置文件 kafka-server-start.sh -daemon config/server.properties 创建Topic kafka-topics.sh --create --zookeeper 21.6.162.167:2181 --rep

Docker进阶

Docker进阶 Dockerfile 参考资料地址:Dockerfile reference | Docker Docs Dockerfile是用来构建镜像的文本文件,在没有Dockerfile文件以前,构建镜像需要通过不断commit容器来完成,有了Dockerfile后,我们只需要编写Dock

Docker基础

Docker基础 容器和虚拟机的区别。 虚拟机:包含了完整的操作系统,对完整的硬件结构进行了模拟。 容器:容器内包含了运行程序所需的最小资源,并且容器是直接运行在宿主机上的。 配置篇 配置镜像加速 将Docker仓库地址配置为阿里云的Docker仓库地址来加速镜像下载。 流程如下: 登录阿里云 选择

RabbitMQ 高级篇

基础篇只介绍了RabbitMQ的简单使用,但在一些稍微复杂的情况下,基础篇的内容无法保证数据的一致性。 生产者可靠性 生产者重连 有时候由于网络波动,可能会出现客户端连接MQ失败的情况。通过配置我们可以开启连接失败后的重连机制: # 连接超时时间 spring.rabbitmq.connecti

RabbitMQ 基础篇

消息队列用来将同步处理流程异步化,实现低时延服务。 同步调用与异步调用 同步调用 同步调用存在的问题 扩展性差 性能下降 级联失败问题 同步调用的优势 实效性强,等待到结果后才返回 异步调用 异步调用通常使用消息队列来实现。主要包含了下面三种角色: 消息发送者:负责生产消息,并将消息发送给消息代理

Java设计模式

Java设计模式 GoF(最先开始着手进行设计模式分类整理工作)对设计模式的定义是: 设计模式是在特定的环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用。 为什么要遵循设计模式 为了让程序,具有更好的: 代码重用性(相同功能的代码可重复使用) 可读性(编程

Maven 笔记

Maven 之前使用过很多次maven,但是一直没有系统的学习过,一些小项目还可以应付过去,但是一旦项目模块过多,需要配置构建过程时,真抓瞎了,发现自己对maven了解太少。 参考文档:代码重工 (gitee.io) mvn命令 常用命令 archetype 可以通过maven来构建一个项目,不过一

常用算法技巧

常用算法技巧 数组 二分法 二分法都不陌生,但是有时候我们需要找最接近且小于目标值或大于目标值的元素,这里不理清,容易造成混乱。 找最接近且小于目标值的元素 public int searchFirstLessThen(int[] nums, int target) { int

Nginx实战(高级篇)

一、扩展 1.1 垂直扩展 对服务进行垂直扩展的一般方法是增加服务器的硬件配置,如升级网卡、增加内存条、选择更高主频的CPU等。该方式虽然提高了单机的吞吐量,但是提升幅度有限。 1.2 水平扩展 对服务进行水平扩展的一般方法是将服务部署在多台主机上,它们提供相同的服务,这些提供相同服务的主机也被称为

Nginx实战(基础篇)

一、Nginx 简介 1.1 Nginx的几种发行版 Nginx常用的有如下四种版本: Nginx开源版,该版本比较纯净,但不适合做二开 Nginx pro商业版 Tengine 淘宝内部使用的Nginx,一般项目可以使用该版本的Nginx OpenResty(Nginx+Lua),如果需要对Ngi

线程安全与锁优化

线程安全与锁优化 线程安全 定义: 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么就称为这个对象是线程安全的。 Java语言中的线程安全 按照线程安全的“安全程

Java 内存模型与线程

Java 内存模型与线程 概述 在许多场景下,需要让计算机同时处理几项任务,充分发挥计算机性能。除了充分发挥计算机处理器的能力外,一个服务器要同时为多个客户端提供服务,则是另一个更具体的并发应用场景。衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS)

JVM调优小工具

JVM调优小工具 在进行JVM调优时,一般情况下,我们都会使用JDK的bin目录下提供的虚拟机性能监控、故障处理工具。 这些工具一般分为三类: 商业授权工具 正式支持工具 实验性工具 我们一般能使用的是正式支持工具和实验性工具。 jps:虚拟机进程状况工具 功能:可以列出正在运行的虚拟机进程,并显示