开发 All
文章平均质量分 90
复杂技术简单说!
yue_xin_tech
一个对技术虔诚的程序员
展开
-
golang 面试总结
前段时间找工作搜索golang 面试题时,发现都是比较零散或是基础的题目,覆盖面较小。而自己也在边面试时边总结了一些知识点,为了方便后续回顾,特此整理了一下。原创 2022-02-08 23:17:57 · 689 阅读 · 0 评论 -
操作系统之进程管理、内存管理总结
计算机是由很多资源组成的,像我们常见的 CPU、内存、硬盘等。如果我们想要使用这些资源去完成某个计算任务,那么就需要有一个管理者来协调这些资源,操作系统就是这个管理者。原创 2022-01-01 12:19:24 · 2074 阅读 · 0 评论 -
mysql 系列:搞定索引
摘要索引是数据库里重要的组成部分,也是提高查询效率必备的知识点。本文将会介绍索引作用、索引类型、索引优化以及索引底层结构,也算是对索引知识的一次归纳。一、索引介绍什么是索引?数据库是用来存储与读取数据的,如何在这庞大的数据中查询我们想要的那一行呢?最简单的办法便是扫描整个数据表,一一对比。然而这样效率太低了。如果我们有类似字典的功能,在查询某行数据前,先到字典里定位到行位置,再根据行位置找到具体数据,是否能更快呢?是的,索引就是这么设计的。一般的,我们往表里插入某一行数据时,总会有额外的信息来定原创 2021-08-15 10:44:44 · 106 阅读 · 0 评论 -
mysql 系列:总体架构概述
前言使用 mysql 很多年了,但也没怎么深入研究过,准备最近了解下 mysql 的相关知识点。看看这款程序界里的神器是怎么运转的。mysql 的架构模式mysql 采用的是 C/S 架构,也就是我们平常所说的客户端-服务器模型。像我们平常所用的 workbench、nacivat 就是客户端,当然,还有命令行工具。它们会根据指定的 ip、prot 连到服务器,通过一定的协议来进行 SQL 的执行。这些协议包括最广泛使用的 TCP 协议,也包括了适用于本地通信的套接字、共享内存、命名管道等协议。m原创 2021-08-08 20:46:25 · 209 阅读 · 0 评论 -
mysql 系列:锁和它的运用
前言数据库是一个允许多用户、多会话、多线程访问的系统。为了在并发访问中能保证数据的一致性和完整性,一般会使用事务来做控制,外加锁来作为辅助手段。所以今天整理了一下锁的相关知识,顺便看看它在事务里是怎么配合使用的。锁的分类我们先来看下锁的分类及其作用有哪一些,以便能更好的分析运用场景。乐观/悲观锁乐观锁:在读取数据时会假设各个事务互不影响,它们会各自处理好属于自己的那部分数据。如果在更新数据时,发现真的有其他事务修改了属于自己的那部分,则会回滚之前的一切操作。悲观锁:采取了先获取锁再访问的保守策略原创 2021-08-16 23:49:00 · 139 阅读 · 0 评论 -
mysql 系列:存储引擎
介绍在上一篇文章 mysql 总体概述 里我们大概了解了 mysql 的架构设计,其中提到了存储引擎。它在 mysql 里是一个非常重要的角色,负责了数据的创建、读取和更新,也就是数据的 I/O 操作。最重要的是,它是可插拔的模块,这意味着我们在切换存储引擎时,对于上层应用来讲,是不需要做任何适配的。存储引擎有很多种,而且都有属于自己的特性,像我们常见的 InnoDB 有事务支持、MyISAM 速度较快等。存储引擎的用法作为插件化的模块,我们可以很自然的添加、卸载存储引擎,并且在创建表时指定存储引原创 2021-08-08 20:47:16 · 92 阅读 · 0 评论 -
来,上一上 IT 历史课!
雏形初现给你一台 1804 的织布机,你能想象它是计算机的灵感来源吗?没错,那一年法国发明家雅卡尔发明了高效率的织布机,他通过对穿孔的有无来控制了编织的图案。这种打孔模式其实就是变相的在存储图案路线,再用机械还原图案,这和现代的计算设备理念是一致的。后来,著名的英国数学家查尔斯·巴贝奇利用这打孔模型,在 1822 年提出了根据穿孔卡上的指令存储数据,以进行任何数学运算的可能性,并着力打造其设想机器:差分机。只可惜的是,由于各种原因,直到巴贝奇去世,也没有将其完整的实现出来。不过,打孔技术可没有被遗忘原创 2021-08-13 00:16:30 · 78 阅读 · 0 评论 -
redis 系列:高可用
前言Redis 作为最常用的 key-value 服务,一直为我们带来了高性能的保障。但程序嘛,总不可能一直运行下去,而我们所要做的就是将这些风险降到最低。那么,高可用也就是 Redis 必然要考虑的了,而随着 Redis 的广泛使用,市面上也出现了有很多种高可用方案。今天,就来好好认识下这些高可用方案,或许也可以为我们自己程序带来灵感。高可用机制Redis 的高可用从总体上来讲是通过 冗余 + 故障转移 来实现的,而对于冗余和故障转移又可以细化为:部分冗余 or 全部冗余;手动转移 or 自动转移。原创 2021-08-27 21:49:50 · 152 阅读 · 0 评论 -
这五年的6个编程感悟!
前言没接触编程之前,总觉得它很神秘,很牛逼。每当有新的系统,新的软件出来时,总想冲在前头,然后 down 下来好好体验。后来加入了程序员大军,才发现编程并非想象中的那么美好,经常要面对完成不了的需求,和背不完的锅,真的是一部辛酸编码史。尽管如此,我们的工作也算是在为机器注入灵魂,还是挺高大上的。只是很多时候不得不面对一些残酷现实,下面就来聊一聊这几年的编程感悟吧!1、 bug 是修不完的不知各位猿友有没有这样的体会:每当周五临近下班时,测试总会向你扔来一大堆的 bug 工单。而就在你以为所有的原创 2021-08-05 23:38:14 · 291 阅读 · 0 评论 -
redis 系列:持久化机制
持久化机制尽管 Redis 是基于内存的 key-value 服务,但也可以进行数据的持久化,以便服务重启,数据能重新加载进来。为了尽可能的保证数据不丢失,Redis 为我们提供了好几种持久化机制:RDB:即 Redis Database,在指定的时间间隔里将 Redis 内存数据镜像下来,保存到文件里。AOF:将服务器对数据的写操作追加到文件里,相当于将所有的逻辑操作都记录了下来。无持久性:不进行持久化,性能最好。RDB + AOF:将 RDB 和 AOF 结合起来,组合它们各自的优点。原创 2021-08-25 21:13:04 · 246 阅读 · 0 评论 -
事务解释
事务是我们保证数据正确性的重要手段,只要和数据库打交道,就得理解它的 ACID 特性,这也是一个专业程序员应该掌握的基本技能。原创 2021-05-05 23:04:06 · 175 阅读 · 0 评论 -
gomod 使用
很全的 gomod 使用手册原创 2021-05-09 23:49:52 · 482 阅读 · 0 评论 -
golang 重要知识:golang 调度
作为 go 运行时的得力助手:Scheduler,它在我们的程序底层默默的支撑着。所以懂 Go 的人,就得先懂它。本文将会细聊调度概念,调度策略,以及 go 的调度机制。当然,少不了最神秘的 GMP 模型。这一切的一切,都会为你一一揭开。原创 2021-06-14 15:48:01 · 823 阅读 · 3 评论 -
关于分布式系统共识的思考
在前面的文章里,我们分析了分布式系统在业务上的一致性技术,即分布式事务,它的结果导向是面向用户的。然而在我们的系统内部,有时也需要面对来自软件架构等更高层次上的一致性要求,比如 Redis 的哨兵模式,Zookeeper 的选举过程等。它们所考虑的一致性更多的是服务节点之间一个共识的达成,当共识达成之后,就可以以此为指导原则,展开更多的协同操作。原创 2021-12-26 16:31:55 · 673 阅读 · 0 评论 -
关于分布式事务的一致性思考
在关于微服务的设计上,已经有很多成熟的指导方案。比如基于领域模型的,基于事件驱动的。然而,当各个服务各自为战后,在数据的一致性上,却未能有完善的解决方案。或是受性能效率限制,或是实现流程复杂。总之,我们需要采取很多额外的手段去解决分布式服务的数据一致性问题原创 2021-12-13 22:50:17 · 817 阅读 · 0 评论 -
计算机网络 TCP 协议总结
TCP 相关知识TCP/IP 协议占据了互联网通信的一大半江山,特别像 TCP 这种保障端到端的可靠传输机制更是相当重要,关于它的实现也很复杂,涉及的知识也很庞大。所以,今天介绍下关于 TCP 的相关重要知识。我们先来认识下 TCP 的头格式:其中,我们看到有一个源端口、目的端口,这 2 个元素再加上 IP 层的源地址和目的地址,那么这四元组就可以用来表示 TCP 的某个连接了,相当于数据库里的唯一标识。所以当我们发起一个 TCP 连接时,会发现如果存在相同的端口在运行时,操作系统是不允许的,只有这原创 2021-10-26 22:57:00 · 824 阅读 · 0 评论 -
docker 系列:实践工具
前言本文将介绍下在使用 Docker 时的相关经验,比如使用 Docker-compose 进行容器的编排部署,使用 Portainer 对容器进行可视化的管理,以及 DockerFile 的构建建议。相当于是一套组合拳。让我们能更轻松、更方便去管理 Docker 的容器。Docker Compose使用 Docker Compose 有一个好处就是可以通过配置化的方式去编排容器。比如我们当前有3个服务,其中 A 依赖于 B,B 依赖于 C,那么我们就可以在 YML 中使用 depends_on 配置原创 2021-10-20 23:45:26 · 109 阅读 · 0 评论 -
docker 系列:底层实现
总体架构Docker 采用的是 C/S 架构,使用 REST API、UNIX 套接字或网络接口进行通信。一般客户端会和 Docker 服务运行在同一台机子上,像我们平常使用的 docker build、pull、run 等命令就是发送到客户端上的。客户端也可以独立部署,比如 Docker Compose。在 Docker 服务端上,一般表现为守护进程,负责监听客户端的请求,然后进行容器的构建、运行和分发。Docker 守护进程(dockerd):侦听 Docker API 请求并管理 Docke原创 2021-10-20 07:45:00 · 299 阅读 · 0 评论 -
docker 系列:基础入门
Docker 与 容器Docker 是基于容器技术实现的,由于 Docker 的火热流行,可能很多人会认为容器是 Docker 独有的技术。实际上,容器技术最开始是基于 Linux Container(简称 LXC)技术实现的,通过内核提供的 Namespace 和 Cgroup 机制,实现了对应用程序的隔离以及对物理资源的分配。后来随着 Docker 的发展壮大,容器技术越来越被更多的公司接受,更是联合众多公司成立了 OCI 组织来制定了容器标准。容器技术和虚拟机(虚拟化)技术有点像,它们两者都提供了原创 2021-09-17 21:20:06 · 122 阅读 · 0 评论 -
架构系列:关键要素
前言架构设计是一个技术活,它不仅考验着我们对整体的抽象整合能力,也检验了我们对业务的变化应对能力。一个好的架构,能让系统的依赖关系清晰明了,也能让后续的维护成本降到最低。那到底什么才是好的架构呢?个人觉得,站在使用者的角度,好的架构应该是易于理解的、高度自治的、可衡量的;站在实施效果的角度,应该是高可用、高并发、可扩展的。易于理解我们知道,之所以要进行架构设计,其主要目的在于降低系统的复杂度。在软件行业里,改需求加功能是家常便饭的事,几乎每隔半个月就有一次小的迭代。随着变动越来越多,系统将会越来越庞原创 2021-09-12 22:59:10 · 222 阅读 · 0 评论 -
架构理解总结
一、怎么理解架构?假如给你一个项目开发,你会怎么开始它?对于这个问题,我想很多猿友们都应该经历过吧。很多时候,我们会直接开干,让自己快速的进入 coding 状态。然而一旦遇上稍微有点规模,比如涉及到多个业务功能的开发,那大概率会在开发过程中经常的怀疑自己,甚至产生推倒重来的想法;又或者眼看就要交付了,只能将错就错,修修补补。最后,一个让人揪心的系统又诞生了。说到底,还是太草率了,如果我们能提前对项目进行梳理,将涉及到的产品形态、业务功能、技术方案不断的进行提炼总结,那还会这样吗?这也是为什么我们需原创 2021-09-05 23:57:18 · 376 阅读 · 0 评论 -
redis 系列:总结
Redis 总体介绍Redis 是 key-value 型的 memory 缓存中间件,相信大部分程序员都在项目中使用过它。其实,我们也可以在程序里实现属于自己的 memory 缓存,只是使用 redis 的话,可以将缓存功能统一到这一组件,就像专人干专事一样,使得我们的程序和缓存功能解耦开,方便后续拓展。在底层上, redis 使用了 IO 多路复用技术,像 select、epoll 等。能较好的保障吞吐量。而且 redis 采用了单线程处理请求,避免了线程切换和锁竞争锁带来的额外消耗。加上 re原创 2021-08-22 21:03:50 · 511 阅读 · 0 评论 -
mysql 系列:MVCC
MVCC 介绍MVCC 全称是 Multiversion concurrency control,即多版本并发控制。从它的名字就可以看出是关于在并发时对读写控制的一种方法,基本市面上流行的 Database 都有其具体的实现。MVCC 使得各个事务在读写数据时能最大程度的降低锁的依赖,在保证事务隔离性的同时,也能让读类型的事务和写操作的事务并发进行。当我们在进行修改操作时,MVCC 会通过 undo log 保留了之前的数据记录,就像每条记录都有自己的历史版本一样。通过这些历史版本的追溯,MVCC原创 2021-08-21 21:32:26 · 214 阅读 · 0 评论 -
mysql 系列:日志
摘要日志的存在,为数据库的很多功能提供了保障。像用于回滚事务的 undo log,用于恢复事务的 redo log 以及用于主从备份的 binlog。本文将会大致介绍下数据库里的日志类别,以及重点分析下事务日志的相关知识点。日志分类在 mysql 里的日志种类有很多,从总体上来讲可以分为 Server 层 和 存储引擎层的(关于 mysql 的总体架构可以看这篇:mysql 系列:总体架构概述)。在 Server 层里的日志分类如下:错误日志错误日志是 mysql 在启动、运行或停止时出现异常的日原创 2021-08-19 23:17:52 · 362 阅读 · 0 评论 -
golang 重要知识:context 详解
在很多的 Go 开源框架里,我们经常能看到 context 的身影,它的使用场景有很多,像超时通知,取消通知都能用到 context。今天我们就来好好的认识一下它,看看 context 的相关知识和底层原理原创 2021-07-15 07:35:33 · 855 阅读 · 0 评论 -
golang 重要知识:atomic 原子操作
原子操作:Add、CompareAndSwap、Load、Store、Swap原创 2021-07-14 23:17:32 · 5131 阅读 · 0 评论 -
golang 重要知识:sync.Cond 机制
golang 同步机制 sync.Cond:可同步等待,单播唤起,广播唤起原创 2021-07-13 23:43:08 · 437 阅读 · 0 评论 -
golang 重要知识:sync.Once 讲解
sync.Once 介绍及源码分析原创 2021-07-13 20:41:06 · 201 阅读 · 0 评论 -
golang 重要知识:waitgroup 解析
Golang 提供了简洁的 go 关键字来让开发者更容易的进行并发编程,同时也提供了 WaitGroup 对象来辅助并发控制。今天我们就来分析下 WaitGroup 的使用方法,顺便瞧一瞧它的底层源码原创 2021-07-10 13:21:47 · 1789 阅读 · 1 评论 -
golang 重要知识:定时器 timer
在 Go 里有很多种定时器的使用方法,像常规的 Timer、Ticker 对象,以及经常会看到的 time.After(d Duration) 和 time.Sleep(d Duration) 方法,今天将会介绍它们的使用方法以及会对它们的底层源码进行分析,以便于在更好的场景中使用定时器。原创 2021-07-08 23:32:39 · 1410 阅读 · 0 评论 -
golang 重要知识:RWMutex 读写锁分析
在上一篇文章 [golang 重要知识:mutex](https://blog.csdn.net/h_l_f/article/details/118462433) 里我们介绍了互斥锁 mutex 的相关原理实现。而且在 Go 里除了互斥锁外,还有读写锁 RWMutex,它主要用来实现读共享,写独占的功能。今天我们也顺便分析下读写锁,加深对 Go 锁的理解。原创 2021-07-06 20:29:50 · 577 阅读 · 0 评论 -
golang 重要知识:mutex
Go 号称是为了高并发而生的,在高并发场景下,势必会涉及到对公共资源的竞争。当对应场景发生时,我们经常会使用 mutex 的 Lock() 方法和 Unlock() 方法来占有或释放资源。虽然调用简单,但 mutex 的内部却涉及挺多的。今天,就让我们好好研究一下。原创 2021-07-05 00:02:46 · 652 阅读 · 0 评论 -
golang 重要知识:深入认识 map
map 通过 hasTable 实现了我们最常见的 key-value 存储,能快速的进行数据集的增删查改。同时 Go 里的 map 也有很多特殊的地方,比如它的无序性、并发不安全等。今天,就让我们对 map 深入研究,看看它是怎么设计的。原创 2021-07-03 21:31:49 · 173 阅读 · 0 评论 -
golang 重要知识:channel 用法和底层原理
channel 是 goroutine 与 goroutine 之间通信的重要桥梁,借助 channel,我们能很轻易的写出一个**多协程**通信程序。今天,我们就来看看这个 channel 的常用用法以及底层原理。原创 2021-06-28 00:08:57 · 6301 阅读 · 0 评论 -
golang 重要知识:垃圾回收
golang 的三色标记法虽然没有 java 的内存回收机制成熟,但它细分了回收过程,通过写屏障技术,能和用户程序并发进行,这也大大提高了内存回收速度。原创 2021-06-26 13:26:08 · 741 阅读 · 0 评论 -
golang 重要知识:内存管理
为了能更好的分配内存以及管理对象生命周期,golang 在 runtime 运行时上实现了自己的内存管理机制。 它借鉴了 Google 的 TCMalloc ,TCMalloc 是高性能的用于 c++ 的内存分配器。其核心思想是**内存池 + 多级对象管理** ,加快了分配速度,也降低了资源竞争。 有分配就有回收,有些对象在使用完后就不再被引用到,这些被称之为“**垃圾对象**”。Go 通过**三色标记法**来回收这些垃圾对象。并且会在分配对象时,将一些微小对象标记为不需要 GC 扫描,从而减少了扫原创 2021-06-20 20:37:45 · 294 阅读 · 0 评论 -
秒懂消息队列
作为技术方案最常提到的组件:消息队列,在我们的程序中起到了重要的作用。异步、解耦、削峰(缓冲)等特性正是我们选择它的原因。本文将会按自己的理解聊一聊消息队列的本质、使用场景、注意事项、以及介绍下主流的消息队列。原创 2021-04-24 23:11:32 · 120 阅读 · 0 评论