Tag: aop
Java AOP及在SpringBoot项目中实践
AOP概念 面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,旨在通过将横切关注点(如日志记录、事务管理、安全性等)从业
Tag: cache
PHP基于APC的单机缓存
APC cache APC (Alternative PHP Cache),PHP缓存,手册里翻译:它的目标是为缓存和优化PHP中间代码提供一个免费,开放,健壮的框架。 了解PHP架构知道,Z
Redis基础知识
数据结构和应用场景 String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等。 使用自定义字符串结构体,方便O(1)知道长度、拼接字符串不会造成缓冲区溢出、不仅
Redis的线程模型与网络模型
为什么总听说Redis是单线程,还性能这么强? 答案通常是Redis基于内存,且采用Reactor事件驱动模型,且数据结构的精心设计。 在Redis4.0,作者增加
Tag: elasticsearch
Elasticsearch介绍
前段时间负责的一个群组相关的项目上线了,功能包含群组名称模糊检索和基于地理位置做同城、附近群检索的需求。这正是Elasticsearch大显身手的机会,接到项目
Elasticsearch分布式存储的写流程
ES作为一个分布式存储组件,它的写流程是什么样子的?为什么说它是近实时搜索?什么会影响它的写性能?我们有必要了解。 ES文档的写流程 写的动作包含新建文档、更新文档
Elasticsearch分布式检索的两阶段流程
在说明ES分布式检索流程前,我们先看下内部组件的概念架构: Elasticsearch概念架构 ES分布式检索的两阶段 如果是对单个文档进行CURD操作,通常从路由计
ELK 搭建
ELK 介绍 ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash、Kibana。 Elasticsearch 是一个搜索和分析引擎。 Logstash 是服务器端数据处理管
LBS位置服务 距离计算的几种方式
背景 互联网兴起,出现了很多基于地理位置服务的产品,如地图、外卖、陌陌等等,都会提供查找附近的人、餐厅等功能。 『附近的』这个就是基于位置服务,比如查找用户附近的门
Tag: go
Go channel底层实现
channel是Go定义的一个数据类型,用于goroutine之间的通信且是并发安全,正是Go所提倡的利用通信来共享内存。 Go在语言层面支持这种数据通信,提供非
Go GPM 模型
线程与goroutine goroutine属于用户态线程;传统线程是属于内核态线程,由操作系统调度。 下面主要从内存占用,上下文切换两个角度描述: 线程 线程是操作系
Go sync.Map 源码实现
以下源码是Go 1.11版本,源码v1.11 github 简单实现 Map本身不是并发安全,如果设计一个简单的并发安全map,我们可以定一个结构体,map+读写锁 type syncMap struct{ lock sync.RWMutex m map[interface{}]interface{}
Go 利用 buffer channel 做一个资源池
Go可以利用buffer channel做一个资源池,channel中元素是资源类型,比如实现io.Closer的资源。 资源池要有哪几个功能? 创建一个池 从池中取一
Go 实现群聊天室- goroutine 和 channel 应用
经典的多线程程序群聊聊天室,利用goroutine和channel来实现。 实现这段程序,对理解go的goroutine和channel也非常有帮助。 服务端代码:
Go 并发设计思路--非阻塞缓存
Go开发中经常遇到并发设计的场景,伴随着一个绕不过的问题就是并发安全。 并发安全设计几种方式 提前加载好 利用锁 把对共享变量的读写收敛到一个goroutine里,利用
Go 理解并发的一个经典例子
通过这个案例,我们一步步理解并发的一些知识点: channel作为多个goroutine的通信媒介 select的用法 组等待,waitgroup的用法 限制并发度 广播
笔记- Go context
context包在Go并发编程代码中经常可见,而在我学习Go的两本书中《Go圣经》《Go实战》都没有看到这个包的介绍,才知道是Go1.7版本中才将其放入到标准库
笔记-Go bytes.Buffer
bytes.Buffer 一个我们经常使用的变长的byte buffer,它提供了对byte的读写操作。 类型组成 type Buffer struct { buf []byte // contents are the bytes buf[off : len(buf)] off int // read at &buf[off], write at &buf[len(buf)] lastRead readOp // last read operation, so that Unread* can work correctly. } buf
笔记-Go defer 调试复杂函数
随着函数变得复杂,需要处理的错误也变多,维护清理逻辑变得越来越困难。而Go语言独有的 defer 机制可以让事情变得简单。 defer的用法 当defer语句被执行时,跟在de
笔记-Go unsafe 包
只要阅读Go的源码,就不会错过代码里众多的unsafe.Pointer等,这个不安全的指针是个啥? unsafe.Pointer unsafe.Pointer 可以指向任意类型的指针,这有点类似于C里的void*。它能
笔记-Go Web 服务器 http.Handler 接口
Go做web服务器,只需要寥寥几行代码即可实现。前边已经写过web服务器几个基本步骤,可以参考webserver工作原理。 socket()->bind()->listen()->accept() 在http包种,go提供了一个函数 //
笔记-Go 作用域和生命周期
作用域和生命周期,往往被混为一谈,当然是两个概念。 概念 作用域 作用域是声明在程序文本中出现的区域,是一个编译时属性。 变量的生命周期 变量的生命周期是程序执行期间被程
笔记-Go 常用的时间日期转化
日常开发中时间转化经常用到。Go中设计的时间类型是Time,参考src/time/time.go 当前时间 获取当前时间,返回Time类型 a := time.Now() fmt.Println(a, a.Unix(), a.UnixNano()) 当前Unix 时
笔记-Go 限制并发、限速
Go的并发使用起来非常容易,随意就起个goroutine。但是日常开发中,考虑到机器CPU、内存、文件描述符、网络以及下游中间件性能等等的影响,通常不会无脑使用
笔记-grpc 介绍和 Go 示例
grpc介绍 rpc:远程过程调用。对比本地的函数调用,远程是节点A调用节点B上的服务,比如http等协议的调用。现在流行很多种rpc框架,百度的brpc,谷歌的
简易实现固定窗口限流
限流器有多种算法,比如固定窗口、滑动窗口、漏桶、令牌桶等。比如Guava的限流器采用的令牌桶。 我们这里实现一个简易的固定窗口的限流器,来初体验下限流器的作用和实
算法-LRU
LRU介绍 LRU(Least Recently Used)最近最少使用算法,通常在缓存策略中使用。操作系统在内存管理中,对页的置换有应用这一算法。 通常缓存空间有限,因此当空间满的
Tag: io模型
I/O 多路复用之 epoll
背景 前文总结了IO复用中select的相关知识 ,其有着性能上的缺点。Linux内核在2.6中支持的epoll在大量fd场景下有着更优秀的性能。 例如Redis在使
I/O 多路复用之 select
I/O多路复用的概念,我们已经再耳熟能详不过了,比如接触很多的nginx、Redis,均利用了I/O多路复用。那么I/O多路复用到底是什么?内核提供了多种方法,
Java NIO
理解好Java NIO前提要熟悉IO模型,IO复用(以epoll为例)、非阻塞IO的基础知识。java.nio抽象出来一些类或接口,底层实际是对epoll等系统调
Kafka server的线程模型与网络模型
Kafka 的标签高吞吐、高并发、高可扩展等等,为什么它有这么好的性能,我们看看它的server 线程模型和网络模型。 Kafka 性能为什么这么好 Kafka 有着高吞吐、高并发的特性,是什么支
nginx的线程模型与网络模型
众所周知了,nginx一般用来当作HTTP服务器、反向代理、负载均衡器,其有着强悍的性能。 PHP服务早期还是LAMP架构,后来apache被nginx替代,变成
Reactor模式
服务器基础 三种fd 认识三个fd listenfd connfd clientfd 服务器监听连接请求 accept 返回connfd,后续和客户端的通信fd 客户端进行connect连接请求的 clientfd 基本服务器模型 单线程阻塞 int listenfd;
Redis的线程模型与网络模型
为什么总听说Redis是单线程,还性能这么强? 答案通常是Redis基于内存,且采用Reactor事件驱动模型,且数据结构的精心设计。 在Redis4.0,作者增加
Unix 五种 I/O 模型
I/O模型是网络编程中必须要掌握的,也是计算机系统的重要内容之一,涉及通信的系统软件都会围绕文件描述符、I/O模型等知识展开。理解I/O模型是我们程序员的基本功
Tag: java
Arthas工具
Arthas 简介 为什么要用它,能做什么 开发测试中经常遇到需要调试的时候,比如代码走到某个调用方法时这里的参数是什么值,方法出参是什么值?代码是否走了某个方法?优化接口耗时
Java AOP及在SpringBoot项目中实践
AOP概念 面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,旨在通过将横切关注点(如日志记录、事务管理、安全性等)从业
Java GC垃圾收集
概述 GC的三个问题: 哪些内存需要回收 什么时候回收 如何回收 Java 是自动垃圾回收的语言,所回收的内存区域指堆和方法区,主要面向占用大部分内存的堆区。类如线程栈这种,执行
Java NIO
理解好Java NIO前提要熟悉IO模型,IO复用(以epoll为例)、非阻塞IO的基础知识。java.nio抽象出来一些类或接口,底层实际是对epoll等系统调
Java synchronized实现原理
synchronized是Java中的关键字,提供了一种对共享资源互斥访问的并发控制,也可以作为线程同步的一个工具。这里我们看下synchronized背后的实
Java ThreadLocal原理
为什么要有ThreadLocal 多线程利用锁来解决共享变量的问题,那如果每个线程都有自己的一份变量,就不涉及到线程安全的事情了。 当然这个变量不是方法里线程栈上的
Java YoungGC的一次排查优化
问题发现 线上报警发生频繁young gc 初步排查 频繁ygc很快就结束了,持续几十秒。没有dump日志或者统计信息可看。 初步排查,是最近刚上线一个功能,10点整有外部
Java 包装线程池或者task,统一异步线程流水
日志串流水,统一一次请求的流水号。同一个线程里比较简单,线程上下文ThreadLocal直接用。 当遇到起异步线程或者线程池的,我们怎么把业务线程的流水传递过去呢
Java8 笔记
Java8 给出了很多新特性,让Java编程更丝滑。如引入Stream流处理、Lambda表达式、默认方法、Optional处理等等。这里做个应用总结。 stream 构建stream
Java基础知识
1. 内存区域划分 程序计数器PC 和操作系统的PC类似,Java虚拟机也需要,都是指执行下一条的命令。每个线程私有的。 虚拟机栈 也可以称作线程栈,每个线程私有的。在每个
Java条件变量之阻塞队列实现
条件变量概念 条件变量,不需要代码层面盲目轮询一个条件,线程可以等待直到有其他线程唤醒。 条件变量使用 条件变量的使用,通常是基于一个互斥锁,并在while循环条件中
Java线程池
线程池的实现原理用一句话理解:维持多个线程和一个阻塞队列。队列里的放的是待执行任务,线程从队列里循环获取任务并执行。
JUC 常用并发组件
这里列举几个常用的并发组件:
- Semaphore
- CountDownLatch
- CyclicBarrier
- SynchronousQueue
JUC 并发组件CompletableFuture
优势 不会阻塞当前线程,如主线程后续逻辑; 异常处理 多个异步任务的编排 函数式编程、链式处理等 基本原理 CompletableFuture 同样实现了之前的 Future ,此外新增加了接口 CompletionSta
Reactor模式
服务器基础 三种fd 认识三个fd listenfd connfd clientfd 服务器监听连接请求 accept 返回connfd,后续和客户端的通信fd 客户端进行connect连接请求的 clientfd 基本服务器模型 单线程阻塞 int listenfd;
Spring 原理入门
IOC-对象池 IOC 控制反转,Bean 对象由 Spring 来托管(生命周期),这些对象所在的位置暂且称为 Bean 的对象池(Map)。Bean 对象的创建除了实例化,还经历了哪些步骤最终
SpringBoot bean的常用扩展点
了解Spring这些扩展点,有助于我们编写更优雅的代码。扩展点的具体应用实践,我们可以多看优秀的源码借鉴思路。 扩展点顺序 【1】BeanFactoryPostPr
SpringBoot 如何开发一个starter组件
引言 在SpringBoot生态系统中,starter组件是一种非常重要的机制,它简化了依赖管理和自动配置的过程。这里介绍如何开发自己的SpringBoot-st
基于SPEL实现ABTest服务
ABTest服务 一个实验组,分多个实验,业务需要验证哪个实验更优。 为调用方提供选择哪个实验的服务。 方案 通常基于用户属性信息做分流。我们将用户各种属性信息加工成标
性能优化之-对象池技术
在高并发、高吞吐的系统架构中,对象的频繁创建与销毁是性能瓶颈的常见来源——比如数据库连接、线程、网络连接等重量级对象,每次创建都伴随着系统资源的开销,频繁GC更
性能优化之-批处理提升吞吐量
在高并发业务场景中,单条数据处理的方式往往会因频繁的IO操作、资源调度导致性能瓶颈,批处理是提升系统吞吐量的核心手段。比如kafka生产者有这种应用场景。 当然批
笔记-Java日期处理
引言 在各种语言编程中,日期和时间的处理都是一个常见的需求。Java中还特殊一点,在Java8 前后提供了不同的日期和时间 API,它们在设计和使用上有很大的差异。本
笔记-Java集合容器
说到Java容器集合,忍不住要对比下Go。 Java要掌握的语法和API更多,相比来说Go要更简洁。但另一个角度看,Java提供了非常丰富的类和API,这点Go就
简易实现固定窗口限流
限流器有多种算法,比如固定窗口、滑动窗口、漏桶、令牌桶等。比如Guava的限流器采用的令牌桶。 我们这里实现一个简易的固定窗口的限流器,来初体验下限流器的作用和实
算法-LRU
LRU介绍 LRU(Least Recently Used)最近最少使用算法,通常在缓存策略中使用。操作系统在内存管理中,对页的置换有应用这一算法。 通常缓存空间有限,因此当空间满的
设计模式:单例模式与线程安全
模式说明 单例模式,顾名思义,JVM全局下某Class只有一个实例对象。 使用场景 一个全局使用的类避免频繁地创建与销毁,节省系统资源。 理解重点 构造函数私有 统一访问入
设计模式:策略+工厂+模板方法 混合使用
模式说明 策略工厂: 策略模式+工厂模式 工厂模式用来生成策略 模板方法 模板方法里组装策略方法 使用场景 策略模式 自然要求是 完成一件事情,其间有不同的业务场景区分。 工厂模式
设计模式:装饰器模式应用
模式说明 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为
设计模式:责任链、观察者模式在Spring下的应用
模式说明 责任链模式: 本本上的定义,责任链模式避免了请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到
Tag: kafka
Canal+Flink+Kafka 同步业务表数据
背景 在分布式业务场景中,数据的实时同步、清洗与多下游分发是常见需求。 典型的流式架构 Canal+Flink+Kafka,结合业务表同步案例,拆解各组件特点、基本用
Kafka server的线程模型与网络模型
Kafka 的标签高吞吐、高并发、高可扩展等等,为什么它有这么好的性能,我们看看它的server 线程模型和网络模型。 Kafka 性能为什么这么好 Kafka 有着高吞吐、高并发的特性,是什么支
Kafka 深入理解
问题一:消费者自动提交的机制,是有单独的自动提交线程么? 实际不是的,自动提交还是隐藏在每一次的poll方法里,还是一个线程。 auto.commit.interv
Kafka入门介绍
Kafka是什么 Kafka最初是LinkedIn公司开发的一个内部基础设施系统,后开源到Apache软件,至今也已经活跃多年,被广泛的用于消息流式处理的场景。K
Kafka基础知识笔记
Kafka基础知识 1.Apache Kafka是什么? 这是一道很常见的题目,看似很无聊,其实考核的知识点很多。 首先,它考验的是,你对Kafka的定位认知是否准确。Apache K
Kafka安装和常用命令使用介绍
kafka 安装 安装快速入门 -> 官方文档 安装步骤 下载kafka 这里使用了二进制包版本 v3.1.0 - kafka_2.13-3.1.0.tgz。下载后直接解压可用: $ tar -xzvf kafka_2.13-3.1.0.tgz $ cd kafka_2.13-3.1.0 启动zo
Kafka生产消费参数调优
在性能要求较高的场景下,合理设置 Kafka 参数是提升吞吐量、降低延迟和保证稳定性的关键。Kafka 参数众多。下面总结了消费者、生产者值得关注的那些参数和优化建议。 消费者
Kafka集群管理&生产消费流程
Kafka 集群如何进行管理?管理包含元数据存储,topic创建、broker、生产者、消费者的变更等: 元数据的存储和流转 broker加入、宕机,Kafka 怎么知道,并且
Tag: lbs
LBS位置服务 距离计算的几种方式
背景 互联网兴起,出现了很多基于地理位置服务的产品,如地图、外卖、陌陌等等,都会提供查找附近的人、餐厅等功能。 『附近的』这个就是基于位置服务,比如查找用户附近的门
Tag: mq
Kafka server的线程模型与网络模型
Kafka 的标签高吞吐、高并发、高可扩展等等,为什么它有这么好的性能,我们看看它的server 线程模型和网络模型。 Kafka 性能为什么这么好 Kafka 有着高吞吐、高并发的特性,是什么支
Kafka 深入理解
问题一:消费者自动提交的机制,是有单独的自动提交线程么? 实际不是的,自动提交还是隐藏在每一次的poll方法里,还是一个线程。 auto.commit.interv
Kafka入门介绍
Kafka是什么 Kafka最初是LinkedIn公司开发的一个内部基础设施系统,后开源到Apache软件,至今也已经活跃多年,被广泛的用于消息流式处理的场景。K
Kafka基础知识笔记
Kafka基础知识 1.Apache Kafka是什么? 这是一道很常见的题目,看似很无聊,其实考核的知识点很多。 首先,它考验的是,你对Kafka的定位认知是否准确。Apache K
Kafka安装和常用命令使用介绍
kafka 安装 安装快速入门 -> 官方文档 安装步骤 下载kafka 这里使用了二进制包版本 v3.1.0 - kafka_2.13-3.1.0.tgz。下载后直接解压可用: $ tar -xzvf kafka_2.13-3.1.0.tgz $ cd kafka_2.13-3.1.0 启动zo
Kafka生产消费参数调优
在性能要求较高的场景下,合理设置 Kafka 参数是提升吞吐量、降低延迟和保证稳定性的关键。Kafka 参数众多。下面总结了消费者、生产者值得关注的那些参数和优化建议。 消费者
Kafka集群管理&生产消费流程
Kafka 集群如何进行管理?管理包含元数据存储,topic创建、broker、生产者、消费者的变更等: 元数据的存储和流转 broker加入、宕机,Kafka 怎么知道,并且
MQ延时消息的设计思路
我们在日常网购,下单未支付的时候通常都会有15-30分钟左右的有效期,如果超时不支付,系统会自动取消这笔订单。 那么问题来了:这个到期自动取消的动作是怎样触发的呢
Tag: mysql
MySQL InnoDB 加锁规则与案例分析
InnoDB中处理并发写问题是采用对索引进行加锁,可重复读隔离级别默认是Next-Key Lock(Record Lock + Gap Lock,左开右闭) 关于加锁的理解和应用,《
MySQL InnoDB 幻读问题
幻读是什么?InnoDB 怎么解决的幻读?next-key locking 有哪些注意的地方? 一个例子 T1 时刻,child 表里有2条数据,一个id=90,一个id=102 Time Session A Session B
MySQL MVCC机制与Undo Log
MySQL的多版本并发控制(MVCC)是如何实现多版本的,真是冗余了一个完整的快照么?这个值得学习了解。 如果了解了的话,简单说,MVCC是利用了ReadView
MySQL order by 执行流程和索引优化
日常开发中,经常遇到排序的场景,比如列表页按创建时间分页排序等。那 order by 在MySQL中的执行流程是什么样的呢? 准备 CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL,
MySQL 主从同步和binlog应用
MySQL 主从/主备 架构的数据同步机制是什么样的?binlog 记录的内容是什么?Redis等组件怎么使得数据和MySQL保证最终一致性? 二进制日志(binary log)
MySQL 常用sql注意坑点
1. LEFT JOIN ON 中左表条件"不生效"? 条件写到On里还是Where里,这是一个常见且容易误解的点。实际上左表条件不是不生效,而是生效的逻辑位置与预期
MySQL 死锁日志详细解读
1. 死锁日志配置 1.1 开启死锁日志记录 -- 查看当前死锁日志配置 SHOW VARIABLES LIKE 'innodb_print_all_deadlocks'; -- 开启死锁日志(临时) SET GLOBAL innodb_print_all_deadlocks = ON; -- 在my.cnf中永久配置 [mysqld] innodb_print_all_deadlocks = ON log_error = /var/log/mysql/error.log 1.2 查看死锁日志的几种方式 --
mysqldump 备份数据库
这里使用mysqldump备份成sql文件,非binlog形式,日常开发可能会应用到。 备份数据库 $ mysqldump -h192.168.1.100 -uuser -p123 --databases name > /tmp/databasedump.sql 备份数据库下的一个表–>sq
MySQL基础知识笔记
1.一条SQL查询语句是如何执行的 MySQL的逻辑架构图 大体来说,MySQL可以分为Server层和存储引擎层两部分。 连接器 连接器负责跟客户端建立连接、获取权限
分布式事务
背景 如单体应用中,商品订单和物流订单在一个数据库里,创建一个商品订单和物流订单在一个数据库事务里,数据库自己就能保证原子性一致性。 在分布式服务中,商品服务和物流
Tag: netty
算法-时间轮实现
时间轮(Timing Wheel) 时间轮是一种高效的定时任务调度数据结构,核心目标是解决大规模定时任务场景下的性能瓶颈问题。最早应用于操作系统内核的定时器管理,后
Tag: nginx
LNMP 架构源码包搭建
LNMP源码包搭建,交代下各版本 Linux CentOS-6.5-x86_64-bin-DVD1 NGINX 版本1.8.0 下载地址:http://nginx.org/en/download.html MySQL 版本5.0.56 PHP 版本5.6.
nginx+Hugo 搭建博客
Hugo 安装 Hugo 是一款 Go 语言开发的静态网站的框架,非常适合搭建博客。 Hugo 的安装非常简单,官网有一个简洁的 quick start。 安装教程 可以安装 Go 环境,然后下载源码编译安装;也可以
nginx处理惊群问题源码分析
所谓惊群问题(thundering herd problem)是说多个进程共享一个fd的监听事件,当IO就绪后多个进程都被唤醒,但只有一个进程处理,其他进程白白被唤醒而浪
nginx的线程模型与网络模型
众所周知了,nginx一般用来当作HTTP服务器、反向代理、负载均衡器,其有着强悍的性能。 PHP服务早期还是LAMP架构,后来apache被nginx替代,变成
Tag: php
LNMP 架构源码包搭建
LNMP源码包搭建,交代下各版本 Linux CentOS-6.5-x86_64-bin-DVD1 NGINX 版本1.8.0 下载地址:http://nginx.org/en/download.html MySQL 版本5.0.56 PHP 版本5.6.
PHP 多维数组排序 array_multisort应用
array_multisort排序效果类似于sql中的order by,尤其后边有多个列名的时候(先以第一个列排序,顺序相同再按第二列顺序)。这个函数尤其在多维数
PHP 多进程处理任务
PHP多进程一般应用在PHP_CLI命令行中执行php脚本,不要在web访问时使用。 模块安装 php查看是否安装了多进程模块 # pcntl是process contr
PHP 添加扩展模块
PHP安装后,再想增加模块(如操作mysql、memcache等php扩展)怎么操作?操作类似,以添加mysqli模块为例。 环境前提: Linux 假设PHP安装目录 /us
php-fpm进程模型与进程池隔离优化
本文主要想记录优化线上502问题,包括采用进程池隔离的手段。借这个事,我们把php-fpm的线程模型梳理下,PHP开发的同学,这是必须要掌握的。 php-fpm 进程模型 php
PHP基于APC的单机缓存
APC cache APC (Alternative PHP Cache),PHP缓存,手册里翻译:它的目标是为缓存和优化PHP中间代码提供一个免费,开放,健壮的框架。 了解PHP架构知道,Z
PHP是如何实现弱类型的
C的结构体和联合体 C语言的结构(struct):包含多个成员,可能有多种数据类型,并且需要分配几种类型占用空间之和的空间。 联合(union):支持多种类型,供使
Tag: python
Python的多进程与多线程
最近有个Python项目要搞,之前学习的都忘差不多了,利用点空余时间把Python再捡一捡。 一、python多进程 因为Python的多线程有全局锁,导致单进程下
Tag: redis
LBS位置服务 距离计算的几种方式
背景 互联网兴起,出现了很多基于地理位置服务的产品,如地图、外卖、陌陌等等,都会提供查找附近的人、餐厅等功能。 『附近的』这个就是基于位置服务,比如查找用户附近的门
Redis基础知识
数据结构和应用场景 String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等。 使用自定义字符串结构体,方便O(1)知道长度、拼接字符串不会造成缓冲区溢出、不仅
Redis的线程模型与网络模型
为什么总听说Redis是单线程,还性能这么强? 答案通常是Redis基于内存,且采用Reactor事件驱动模型,且数据结构的精心设计。 在Redis4.0,作者增加
Tag: rpc
微服务治理框架Dubbo入门
Dubbo 概念 Dubbo 是一款微服务开发框架,它帮助解决微服务开发中的通信问题,同时为构建企业级微服务提供服务治理能力。 从一句话定义中,我们知道 Dubbo 的角色就是微服务治理框架,解决
笔记-grpc 介绍和 Go 示例
grpc介绍 rpc:远程过程调用。对比本地的函数调用,远程是节点A调用节点B上的服务,比如http等协议的调用。现在流行很多种rpc框架,百度的brpc,谷歌的
Tag: shell
awk sed处理文件操作
awk、sed对处理文件和写shell脚本时非常有益,日常工作中也会经常用到,很有必要掌握。 awk awk '条件{命令}' filename 假设一个待处理的文件test 或
Linux常用运维命令
进程、线程 查找某个进程 $ ps aux --forest | grep 进程关键字 $ ps aux | grep pid $ lsof -p pid 查看进程下的线程 $ top -H -p pid 文件 查看该文件被哪些进程使用 比如查看某个日志文件被哪些进程使用,业务应
sed修改替换多文件内容
sed操作单文件已经写过了,但多个文件的修改替换在工作中经常使用,这里独立写个。 修改当前目录下所有文件(包括子目录下的文件),将文本中出现的 aaa替换为 bbb $ find .
shell编程
在Linux环境运行的系统,日常开发中我们要经常使用shell,除了常用的命令还要掌握shell编程。 构建基本脚本 创建shell脚本文件 shell文件的第一行指
处理文件的交差并集合
日常工作中,经常会有文件处理。要玩的转命令,记得熟,速度快。 如题,指定列去重就是一个频繁遇到的问题。脑子里一直深深烙着 sort | uniq 这种用法,直到前两天处理一个2700
文件共享传输的几种方式
开发时经常遇到以下场景: 本地机器上的文件上传到服务器上 服务器上的文件下载到本地机器上 服务器A的文件拷贝到服务器B上 以下几种方式是在工作中经常用到的: python
Tag: spring
Java AOP及在SpringBoot项目中实践
AOP概念 面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,旨在通过将横切关注点(如日志记录、事务管理、安全性等)从业
MyBatis接口注入的实现原理
在SpringBoot与MyBatis的日常开发中,Mapper接口没有任何实现类,却能被Spring通过@Autowired直接注入并正常调用。原因就在于Sp
SpringBoot 如何开发一个starter组件
引言 在SpringBoot生态系统中,starter组件是一种非常重要的机制,它简化了依赖管理和自动配置的过程。这里介绍如何开发自己的SpringBoot-st
基于SPEL实现ABTest服务
ABTest服务 一个实验组,分多个实验,业务需要验证哪个实验更优。 为调用方提供选择哪个实验的服务。 方案 通常基于用户属性信息做分流。我们将用户各种属性信息加工成标
Tag: 云原生
Docker
Docker 发展背景 伴随着容器化技术的发展以及微服务的流行,Docker横空出世,其本身除了对容器技术(LXC)做了应用封装外,更为重要的是,它引入了容器镜像等一整套管理
Tag: 分布式
分布式事务
背景 如单体应用中,商品订单和物流订单在一个数据库里,创建一个商品订单和物流订单在一个数据库事务里,数据库自己就能保证原子性一致性。 在分布式服务中,商品服务和物流
分布式共识之Raft算法
Raft算法属于Multi-Paxos算法,但是做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容
分布式协调服务之 Zookeeper介绍
Zookeeper是apache 开源项目,官方站点 Zookeeper介绍 ZooKeeper is a high-performance coordination service for distributed applications. It exposes common services - such as naming, configuration management, synchronization, and group services。 如果有过分布式程序开发经验
分布式服务之限流算法
服务限流,顾名思义是对请求过来的流量做限制,当流量超过服务负载能力的一种保护服务的措施。 常见的限流算法,固定窗口、滑动窗口、漏桶和令牌桶算法,以下分别做简要介绍
分布式服务组件之快速入门
经验分享 要快速入门一个组件或者技术怎么比较高效,凭自己这些年的经验,有以下一些心得或者建议:(以一个分布式组件为例) 先清楚它生来是要解决什么问题的 出现的背景是什
分布式缓存的一致性Hash
网站的伸缩性架构 – 分布式缓存的一致性Hash 一致性哈希 分布式缓存系统,k=>v缓存数据时经过一层路由算法,一般对key进行哈希运算,这个值和当前分布式缓存
微服务治理框架Dubbo入门
Dubbo 概念 Dubbo 是一款微服务开发框架,它帮助解决微服务开发中的通信问题,同时为构建企业级微服务提供服务治理能力。 从一句话定义中,我们知道 Dubbo 的角色就是微服务治理框架,解决
性能优化之-负载均衡
伸缩性架构 – 负载均衡 高伸缩性是大型网站技术架构的一个重要因素。 伸缩性是什么?简单说就是当流量增大时,向集群中添加机器(横向扩容)就可以分散开流量,各个机器提供着
Tag: 基础
Reactor模式
服务器基础 三种fd 认识三个fd listenfd connfd clientfd 服务器监听连接请求 accept 返回connfd,后续和客户端的通信fd 客户端进行connect连接请求的 clientfd 基本服务器模型 单线程阻塞 int listenfd;
正则表达式-零宽向前、向后匹配
正则中向前匹配和向后匹配非常强大好用。 这里的向前意思是文本的右边,向后是文本的左边(正则引擎匹配按照左->右)。 向前和向后匹配是非获取匹配,即匹配结果不包
计算机基础-UTF8、Unicode 字符编码原理
Unicode 计算机生于美帝,彼时字符也只有一个ASCII字符集:美国标码。使用7bit来表示128个字符:包含英文字母的大小写、 数字、各种标点符号和设备控制符。对于早期的
计算机基础-加法器原理
了解加法器原理之前,先介绍下继电器和门电路。 继电器 继电器我们并不陌生,在高中物理我们都学习过它。原理就是电和磁,利用电磁铁控制开关。 继电器的一个很大用处在于可以
计算机基础-大端序小端序
大端序 小端序 不同机器厂商实现不同,导致字节序列在内存中呈现的形式也不同。内存中是以字节为单位存储,地址空间为 0 - 2^n-1。那么问题来了,对于一个多字节序列的变
计算机基础-有符号数和浮点数
有符号数就是我们说的带有正负号的数;浮点数即是小数,区别于定点数。 虽然我们日常编程中经常和他们打交道,但很难说我们对它理解的有多好,计算机内部是怎么表示的负数、
计算机基础-磁盘
I/O操作、文件系统当然是计算机中非常重要的概念,想更深刻的理解这些概念,我认为很有必要了解支撑其实现的硬件,就来说一说磁盘。 磁盘现在已经是当前计算机组成不可或
计算机基础-零拷贝
Kafka、Netty、NGINX这些流行的大量涉及IO操作的开源组件都有应用零拷贝的技术,来提升性能。一定好奇零拷贝是什么意思? read API的流程 假设这样一个场景
Tag: 大数据
Canal+Flink+Kafka 同步业务表数据
背景 在分布式业务场景中,数据的实时同步、清洗与多下游分发是常见需求。 典型的流式架构 Canal+Flink+Kafka,结合业务表同步案例,拆解各组件特点、基本用
Tag: 工具
Linux常用运维命令
进程、线程 查找某个进程 $ ps aux --forest | grep 进程关键字 $ ps aux | grep pid $ lsof -p pid 查看进程下的线程 $ top -H -p pid 文件 查看该文件被哪些进程使用 比如查看某个日志文件被哪些进程使用,业务应
PlantUML 程序画图: 时序图、活动图
PlantUML是一个多功能组件,可以利用编码快速、直接地创建图表,而不必拖拽图来画 各有优劣。 Sequence 序列图 官方教程 demo案例 代码 ' 教程:https://plant
vi 操作手册
光标移动 上下左右 hjkl 行里快速左移,移到左边单词首字母:b (begin) 行里快速右移,移到右边单词尾字母:e (end) 翻到下一页 ctrl+f (front) 翻到上一页 ctrl+b (bac
传输层TCP三次握手四次挥手-tcpdump抓包ftp应用
通过tcpdump抓包ftp应用(port 21),我们来了解下传输层TCP的三次握手和四次挥手,数据包是什么样的。 准备工作 机器上未安装tcpdump的,先安装下
文件共享传输的几种方式
开发时经常遇到以下场景: 本地机器上的文件上传到服务器上 服务器上的文件下载到本地机器上 服务器A的文件拷贝到服务器B上 以下几种方式是在工作中经常用到的: python
新机开发配置汇总
新机配置持续更新
笔记-Git 操作手册
clone git clone 代码库地址 分支查看 切换 # 1. 查看远程分支 $ git branch -r # 2. 查看本地分支 $ git branch # 3. 查看远程和本地分支。带*的表示正在所处分支 $ git branch -a # 4. 建立一个分支(是在当前分支H
网络层IP数据包解析-tcpdump抓包ping应用
准备工作 client_ip : 111.198.231.243 server_ip : 115.159.105.52 ping命令 一个常见的工具Ping。 ping是利用ICMP,ICMP 依靠IP来完成它的任务,是IP的附属协议。 ICMP协议 ICMP封装在IP
Tag: 性能优化
Java线程池
线程池的实现原理用一句话理解:维持多个线程和一个阻塞队列。队列里的放的是待执行任务,线程从队列里循环获取任务并执行。
JUC 并发组件CompletableFuture
优势 不会阻塞当前线程,如主线程后续逻辑; 异常处理 多个异步任务的编排 函数式编程、链式处理等 基本原理 CompletableFuture 同样实现了之前的 Future ,此外新增加了接口 CompletionSta
PHP基于APC的单机缓存
APC cache APC (Alternative PHP Cache),PHP缓存,手册里翻译:它的目标是为缓存和优化PHP中间代码提供一个免费,开放,健壮的框架。 了解PHP架构知道,Z
性能优化之-对象池技术
在高并发、高吞吐的系统架构中,对象的频繁创建与销毁是性能瓶颈的常见来源——比如数据库连接、线程、网络连接等重量级对象,每次创建都伴随着系统资源的开销,频繁GC更
性能优化之-批处理提升吞吐量
在高并发业务场景中,单条数据处理的方式往往会因频繁的IO操作、资源调度导致性能瓶颈,批处理是提升系统吞吐量的核心手段。比如kafka生产者有这种应用场景。 当然批
性能优化之-负载均衡
伸缩性架构 – 负载均衡 高伸缩性是大型网站技术架构的一个重要因素。 伸缩性是什么?简单说就是当流量增大时,向集群中添加机器(横向扩容)就可以分散开流量,各个机器提供着
Tag: 操作系统
I/O 多路复用之 epoll
背景 前文总结了IO复用中select的相关知识 ,其有着性能上的缺点。Linux内核在2.6中支持的epoll在大量fd场景下有着更优秀的性能。 例如Redis在使
I/O 多路复用之 select
I/O多路复用的概念,我们已经再耳熟能详不过了,比如接触很多的nginx、Redis,均利用了I/O多路复用。那么I/O多路复用到底是什么?内核提供了多种方法,
inode使用率过高
突然收到报警,有台机器提示inode使用率过高。一开始只注意到监控项名字有disk字眼,以为还是磁盘空间预警,跑机器上执行下 df -h,发现还很充足。原来报警监控项
Linux内核之进程管理
导读 进程,是操作系统中一个非常基础,非常关键的抽象概念,它位于现代操作系统的核心位置,它是把运行的程序和所需的资源抽象出来的一个概念。 线程,内核又是如何管理的?
Linux虚拟内存机制-进程地址空间
最近钻研CSAPP,看到虚拟内存章节,反复的看了很多相关的书和材料,感慨内容很多、细节很多。写下自己的心得笔记。 物理寻址 内存,可以把它看做一个连续n字节的大数组
Unix 五种 I/O 模型
I/O模型是网络编程中必须要掌握的,也是计算机系统的重要内容之一,涉及通信的系统软件都会围绕文件描述符、I/O模型等知识展开。理解I/O模型是我们程序员的基本功
Unix 进程间通信 IPC
Unix进程间通信IPC Unix进程间通信,通常有以下几种方式: 1)管道 pipe 2)命名管道 named pipe 3)消息队列 4)信号量 5)共享内存 6)Unix域套接字 7)网络sock
Web Server 工作原理
Web开发一个永远绕不开的问题,Web Server工作原理。 从比较原始的TCP/IP服务器,到Apache、NGINX等等的出现,这些Web服务器的核心工作原理
计算机基础-文件描述符
我们经常说到IO,什么是IO? IO即是输入输出,它是在主存和外部设备(磁盘、终端、网络)之间复制数据的过程。输入Input,是对内存来说,即是从外部设备到主存;
计算机基础-线程同步与锁
线程为什么要同步? 一个简单的例子 i++; 虽然高级语言中是一个简单的自增表达式,但是对于计算机底层而言,还是多条指令运行的。 指令运行一般如下: 从内存中拿到 i 变量值,放到
Tag: 数据库
Elasticsearch介绍
前段时间负责的一个群组相关的项目上线了,功能包含群组名称模糊检索和基于地理位置做同城、附近群检索的需求。这正是Elasticsearch大显身手的机会,接到项目
Elasticsearch分布式存储的写流程
ES作为一个分布式存储组件,它的写流程是什么样子的?为什么说它是近实时搜索?什么会影响它的写性能?我们有必要了解。 ES文档的写流程 写的动作包含新建文档、更新文档
Elasticsearch分布式检索的两阶段流程
在说明ES分布式检索流程前,我们先看下内部组件的概念架构: Elasticsearch概念架构 ES分布式检索的两阶段 如果是对单个文档进行CURD操作,通常从路由计
LBS位置服务 距离计算的几种方式
背景 互联网兴起,出现了很多基于地理位置服务的产品,如地图、外卖、陌陌等等,都会提供查找附近的人、餐厅等功能。 『附近的』这个就是基于位置服务,比如查找用户附近的门
MySQL InnoDB 加锁规则与案例分析
InnoDB中处理并发写问题是采用对索引进行加锁,可重复读隔离级别默认是Next-Key Lock(Record Lock + Gap Lock,左开右闭) 关于加锁的理解和应用,《
MySQL InnoDB 幻读问题
幻读是什么?InnoDB 怎么解决的幻读?next-key locking 有哪些注意的地方? 一个例子 T1 时刻,child 表里有2条数据,一个id=90,一个id=102 Time Session A Session B
MySQL MVCC机制与Undo Log
MySQL的多版本并发控制(MVCC)是如何实现多版本的,真是冗余了一个完整的快照么?这个值得学习了解。 如果了解了的话,简单说,MVCC是利用了ReadView
MySQL order by 执行流程和索引优化
日常开发中,经常遇到排序的场景,比如列表页按创建时间分页排序等。那 order by 在MySQL中的执行流程是什么样的呢? 准备 CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL,
MySQL 主从同步和binlog应用
MySQL 主从/主备 架构的数据同步机制是什么样的?binlog 记录的内容是什么?Redis等组件怎么使得数据和MySQL保证最终一致性? 二进制日志(binary log)
MySQL 常用sql注意坑点
1. LEFT JOIN ON 中左表条件"不生效"? 条件写到On里还是Where里,这是一个常见且容易误解的点。实际上左表条件不是不生效,而是生效的逻辑位置与预期
MySQL 死锁日志详细解读
1. 死锁日志配置 1.1 开启死锁日志记录 -- 查看当前死锁日志配置 SHOW VARIABLES LIKE 'innodb_print_all_deadlocks'; -- 开启死锁日志(临时) SET GLOBAL innodb_print_all_deadlocks = ON; -- 在my.cnf中永久配置 [mysqld] innodb_print_all_deadlocks = ON log_error = /var/log/mysql/error.log 1.2 查看死锁日志的几种方式 --
mysqldump 备份数据库
这里使用mysqldump备份成sql文件,非binlog形式,日常开发可能会应用到。 备份数据库 $ mysqldump -h192.168.1.100 -uuser -p123 --databases name > /tmp/databasedump.sql 备份数据库下的一个表–>sq
MySQL基础知识笔记
1.一条SQL查询语句是如何执行的 MySQL的逻辑架构图 大体来说,MySQL可以分为Server层和存储引擎层两部分。 连接器 连接器负责跟客户端建立连接、获取权限
Tag: 算法
算法-KMP
算法介绍 KMP字符串匹配算法。 移动位数 = 已匹配的字符数 – 对应的部分匹配值 《部分匹配表》怎么得出 两个概念:”前缀”和”后缀”: “前缀”指除了最后一个字符以外,一个
算法-LRU
LRU介绍 LRU(Least Recently Used)最近最少使用算法,通常在缓存策略中使用。操作系统在内存管理中,对页的置换有应用这一算法。 通常缓存空间有限,因此当空间满的
算法-回溯算法排列组合
回溯算法特点 回溯算法是一种暴力穷举算法 穷举的过程是遍历一颗多叉树的过程 回溯算法的框架和多叉树遍历相似 回溯算法框架 List<Value> result; void backtrace(路径, 选择列表) { if (
算法-图的最短路径 Dijkstra
图如果不带权重,计算最短路径用BFS,队列的数据结构就够了,如果带权重(负权不能使用dijkstra)的话可以使用优先队列的数据结构。放邻接点的时候,哪个权重小
算法-图的遍历 广度优先 BFS 和深度优先 DFS
图的两种遍历方式 如题,图的广度优先和深度优先遍历。和二叉树的广度优先遍历类似都利用队列先进先出的特点,不同点在于,二叉树的BFS不需要记录节点是否遍历过,但图会
算法-时间轮实现
时间轮(Timing Wheel) 时间轮是一种高效的定时任务调度数据结构,核心目标是解决大规模定时任务场景下的性能瓶颈问题。最早应用于操作系统内核的定时器管理,后
算法-最优解问题 0-1背包
问题 问题描述 一个可放总重量为 W 的背包和 N 个物品。每个物品,有重量 w 和价值 v 两个属性,那么第 i 个物品的重量为 w[i],价值为 v[i]。现在用这个背包装物品,问最多
算法-最优解问题 找零钱
问题 问题描述 给定 n 种不同面值的硬币,有一个总金额 k,计算出最少需要几枚硬币凑出这个金额k ?每种硬币的个数不限。如果没有任何一种硬币组合能组成总金额时,返回 -1。
算法-练习题目
链表 链表典型问题参考 逆序遍历链表 简单一个递归,先递归再取值 public static void reverseTraverse(Node node) { if (node == null) { return ; } reverseTraverse(node.next); System.out.println(node.value); } 删除倒数第N个节点 和逆序遍历链表一个思路。递归处理,就是反转了,i+
Tag: 线程模型
Kafka server的线程模型与网络模型
Kafka 的标签高吞吐、高并发、高可扩展等等,为什么它有这么好的性能,我们看看它的server 线程模型和网络模型。 Kafka 性能为什么这么好 Kafka 有着高吞吐、高并发的特性,是什么支
nginx的线程模型与网络模型
众所周知了,nginx一般用来当作HTTP服务器、反向代理、负载均衡器,其有着强悍的性能。 PHP服务早期还是LAMP架构,后来apache被nginx替代,变成
php-fpm进程模型与进程池隔离优化
本文主要想记录优化线上502问题,包括采用进程池隔离的手段。借这个事,我们把php-fpm的线程模型梳理下,PHP开发的同学,这是必须要掌握的。 php-fpm 进程模型 php
Redis的线程模型与网络模型
为什么总听说Redis是单线程,还性能这么强? 答案通常是Redis基于内存,且采用Reactor事件驱动模型,且数据结构的精心设计。 在Redis4.0,作者增加
Tag: 网络
tcpdump抓包http应用
tcpdump常用参数列表 sudo tcpdump -i eth1 -s0 -v -n -l -A host 124.64.123.235 and port 80 -i 表示哪个网卡的包 -s xxx 截取报文字节数 xxx=0表示全部 -v 详细输出,还有 -vv -vvv -n 不解析域名,直接显示IP,意味
传输层TCP三次握手四次挥手-tcpdump抓包ftp应用
通过tcpdump抓包ftp应用(port 21),我们来了解下传输层TCP的三次握手和四次挥手,数据包是什么样的。 准备工作 机器上未安装tcpdump的,先安装下
网络层IP数据包解析-tcpdump抓包ping应用
准备工作 client_ip : 111.198.231.243 server_ip : 115.159.105.52 ping命令 一个常见的工具Ping。 ping是利用ICMP,ICMP 依靠IP来完成它的任务,是IP的附属协议。 ICMP协议 ICMP封装在IP
Tag: 设计模式
设计模式:单例模式与线程安全
模式说明 单例模式,顾名思义,JVM全局下某Class只有一个实例对象。 使用场景 一个全局使用的类避免频繁地创建与销毁,节省系统资源。 理解重点 构造函数私有 统一访问入
设计模式:策略+工厂+模板方法 混合使用
模式说明 策略工厂: 策略模式+工厂模式 工厂模式用来生成策略 模板方法 模板方法里组装策略方法 使用场景 策略模式 自然要求是 完成一件事情,其间有不同的业务场景区分。 工厂模式
设计模式:装饰器模式应用
模式说明 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为
设计模式:责任链、观察者模式在Spring下的应用
模式说明 责任链模式: 本本上的定义,责任链模式避免了请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到
Tag: 软素质
分布式服务组件之快速入门
经验分享 要快速入门一个组件或者技术怎么比较高效,凭自己这些年的经验,有以下一些心得或者建议:(以一个分布式组件为例) 先清楚它生来是要解决什么问题的 出现的背景是什
晋升原则
三条晋升的核心原则: 主动原则 第一条原则是主动原则,主动做事的人,比等着别人安排的人更容易晋升。所以你应该定期或者不定期地主动找主管沟通,交流关于工作任务的想法和
良好的工作习惯
良好的工作习惯都有哪些?工作很多年都并没有总结的很好,最近浏览到知乎上有个博主的总结,很有感触,摘下来自勉。 做事 【1】一定要清楚自己工作的核心内容 逻辑清晰 体现价
Tag: 金融
信贷行业必备概念速通
进入一个新领域,快速融入进来就是吃透该领域100个基础概念。 信贷行业必备基础概念 一、 宏观金融与货币相关 M0:流通中的现金,指银行体系以外各个单位的库存现金和居民