分类归档

Docker教程

FWQ
Docker教程
计算机组成与设计-计算机概要与技术
一、硬件和软件是如何影线性能的? 算法:决定了源码级语句的数量和I/O的操作数量 编程语言、编译器和体系结构:决定了每条源码对应的计算机指令数量 处理器和存储系统:决定了每条指令的执行速度 I/O系统:决定了I/O操作的执行速度    二、计算机系统结构中的8个伟大思想 面向摩尔定律设计 使用抽象简化设计 加速大概率事件 通过并行提高性能 通过流水线提高性能 通过预测提高性能 存储器层次 通过冗余设计提供稳定性 三、计算机硬件与软件层次图 应用程序(用户程序) -> 系统软件 -> 硬件; 系统软件包括:操作系统、编译程序、加载程序、链接程序等; 操作系统的定义:为了使程序能够更好的在计算机上运行,从而管理计算机资源的监控程序; 编译程序的定义:将高级语言翻译成计算机能够识别的语言的程序 指令的定义:计算机硬件所能理解并服从的命令;能够被计算机识别并执行的一串由0和1组成的数字串 四、计算机的五个组成部分 输入设备、输出设备、存储器、运算器、控制器;运算器和控制器又合称处理器;计算机的任何部件都可以归于这5种之一; 五、概念…
2024-11-17 阅读全文 →
FWQ
Docker教程
优秀程序设计的Kiss原则
良好的编程原则与良好的设计工程原则密切相关。本文总结的这些设计原则,帮助开发者更有效率的编写代码,并帮助成为一名优秀的程序员。 1.避免重复原则(DRY – Don’t repeat yourself) 编程的最基本原则是避免重复。在程序代码中总会有很多结构体,如循环、函数、类等等。一旦你重复某个语句或概念,就会很容易形成一个抽象体。 2.抽象原则(Abstraction Principle ) 与DRY原则相关。要记住,程序代码中每一个重要的功能,只能出现在源代码的一个位置。   3.简单原则(Keep It Simple and Stupid ) 简单是软件设计的目标,简单的代码占用时间少,漏洞少,并且易于修改。 4.避免创建你不要的代码 Avoid Creating a YAGNI (You aren’t going to need it)…
2024-11-17 阅读全文 →
FWQ
Docker教程
理解二叉树的四种遍历-前序、中序、后序、层序
一、易懂的形象理解 其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多类似的了,那咱们换个思路~ 先用我想的一种简单易懂的形象思维理解一下前序、中序、后序 +层序! 1、先序遍历 先序遍历可以想象成,小人从树根开始绕着整棵树的外围转一圈,经过结点的顺序就是先序遍历的顺序 先序遍历结果:ABDHIEJCFKG 让我们来看下动画,和小人儿一起跑两遍就记住啦,记住是绕着外围跑哦 2、中序遍历 中序遍历可以想象成,按树画好的左右位置投影下来就可以了 中序遍历结果:HDIBEJAFKCG 下面看下投影的过程动画,其实就是按左右顺序写下来就行了 3、后序遍历 后序遍历就像是剪葡萄,我们要把一串葡萄剪成一颗一颗的。 还记得我们先序遍历绕圈的路线么? 就是围着树的外围绕一圈,如果发现一剪刀就能剪下的葡萄(必须是一颗葡萄),就把它剪下来,组成的就是后序遍历了。 后序遍历结果:HIDJEBKFGCA 让我们来看下动画 4、层序遍历 层序遍历太简单了,就是按照一层一层的顺序,从左到右写下来就行了。 后序遍历结果:ABCDEFGHIJK 不知道通过这种方式,有没有觉得闭着眼睛都能写出前序、中序、后序 、层序了呀,不过这只是为了大家好理解,我想出的一种形象思维,为了用代码实现,我们还需要具体了解一下前序、中序、后序遍历。 二、真正理解三种遍历 来,让我们先把所有空结点都补上。 还记得我们先序和后序遍历时候跑的顺序么?按照这个顺序再跑一次,就是围着树的外围跑一整圈。 让我们来理解一下绕着外围跑一整圈的真正含义是:遍历所有结点时,都先往左孩子走,再往右孩子走。 观察一下,你有什么发现?…
2024-11-17 阅读全文 →
FWQ
Docker教程
递归算法满足的三个条件
递归算法是常见的一种算法,那究竟什么样的问题可以用递归来解决呢?我总结了三个条件,只要同时满足以下三个条件,就可以用递归来解决。 1. 一个问题的解可以分解为几个子问题的解,何为子问题? 子问题就是数据规模更小的问题。比如,前面讲的电影院的例子,你要知道,“自己在哪一排”的问题,可以分解为“前一排的人在哪一排”这样一个子问题。   2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 比如电影院那个例子,你求解“自己在哪一排”的思路,和前面一排人求解“自己在哪一排”的思路,是一模一样的。 3. 存在递归终止条件 把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。 如何编写递归代码? 刚刚铺垫了这么多,现在我们来看,如何来写递归代码?我个人觉得,写递归代码最关键的是写出递推公式,找到终止条件,剩下将递推公式转化为代码就很简单了。 你先记住这个理论。我举一个例子,带你一步一步实现一个递归代码,帮你理解。 假如这里有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这 n 个台阶有多少种走法?如果有 7 个台阶,你可以 2,2,2,1 这样子上去,也可以 1,2,1,1,2…
2024-11-17 阅读全文 →
FWQ
Docker教程
链表操作练习题
加强巩固对链表的理解,以及一些操作思路,从网络搜集了一些链表的操作习题,使用Go进行了一些实现。   先初始化一个单向链表: package linked import "fmt" // 定义节点 type Element struct { Value interface{} Next *Element } // 创建一个单向链表 func New(values ...interface{}) (head *Element) { var prev…
2024-11-17 阅读全文 →
FWQ
Docker教程
数据结构与算法-数组 & 链表
数组是一种常见的线性表结构,它用一组连续的内存空间,来存储一组具有相同类型的数据;定义中标识出来的,是数组的3个基本特性;线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向,除了数组外,链表,队列,栈也都是线性表结构;与它对应的是非线性表结构,如二叉树、堆、图等; 链表也是一种常见的线性表结构,它用一组非连续的内存空间,来存储一组具有相同类型的数据;注意和数组的区别,与数组最大的区别在于,链表是使用一组非连续的内存空间,链表分为单向链表、循环链表、双向链表、双向循环列表;   下面将通过代码实例,来分析这2种数据结构,在查找、插入、删除等常用操作上的区别 一、结构 1、数组的结构 var arr = [5]int64{1,2,8,7,6} fmt.Printf("%p\n", &arr) for i,_ := range arr { fmt.Printf("第%d元素的内存地址:%p\n", i, &arr[i]) } 输出结果: 0xc000194000 第0元素的内存地址:0xc000194000 第1元素的内存地址:0xc000194008 第2元素的内存地址:0xc000194010 第3元素的内存地址:0xc000194018…
2024-11-17 阅读全文 →
FWQ
Docker教程
锁机制及CAS实现原理
一、锁机制 常用的锁机制有两种:悲观锁、乐观锁,下面我们分别介绍下。 1、悲观锁 假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。 悲观锁的实现,往往依靠底层提供的锁机制。 悲观锁会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。   2、乐观锁 假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操作时检查是否违反数据完整性。 如果因为冲突失败就重试,直到成功为止。 乐观锁大多是基于数据版本记录机制实现。 为数据增加一个版本标识,比如在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。 此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。 乐观锁的缺点是不能解决脏读的问题。 在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁解决并发问题。 如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法。 3、锁机制存在的问题 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 一个线程持有锁会导致其它所有需要此锁的线程挂起。 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。 volatile是不错的机制,但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。 4、两种锁总结 独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。 所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。 二、CAS(Compare &…
2024-11-17 阅读全文 →
FWQ
Docker教程
ETL与大数据是什么关系?
一、ETL发展的历史背景 随着企业的发展,各业务线、产品线、部门都会承建各种信息化系统方便开展自己的业务。随着信息化建设的不断深入,由于业务系统之间各自为政、相互独立造成的数据孤岛”现象尤为普遍,业务不集成、流程不互通、数据不共享。这给企业进行数据的分析利用、报表开发、分析挖掘等带来了巨大困难。 在此情况下,为了实现企业全局数据的系统化运作管理(信息孤岛、数据统计、数据分析、数据挖掘) ,为DSS(决策支持系统)、BI(商务智能)、经营分析系统等深度开发应用奠定基础,挖掘数据价值 ,企业会开始着手建立数据仓库,数据中台。将相互分离的业务系统的数据源整合在一起,建立一个统一的数据采集、处理、存储、分发、共享中心,从而使公司的成员能够从不同业务部门查看综合数据,而这个过程中使用的数据处理方法之一就是ETL。   ETL是数据中心建设、BI分析项目中不可或缺的环节。各个业务系统中分布的、异构的数据源,经过ETL过程的数据抽取、转换,最终存储到目标数据库或者数据仓库,为上层BI数据分析,或其他业务功能做数据支撑。 二、什么是ETL ETL,Extract-Transform-Load的缩写,是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程。ETL是数据集成的第一步,也是构建数据仓库最重要的步骤,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。 举个例子,某电商公司分析人员根据订单数据进行用户特征分析。这时需要基于订单数据,计算一些相应的分析指标,如每个用户的消费频次,销售额最大的单品,用户复购时间间隔等,这些指标都要通过计算转换得到。 三、ETL的流程 ETL如同它代表的三个英文单词,涉及三个独立的过程:抽取、转换和加载。工作流程往往作为一个正在进行的过程来实现,各模块可灵活进行组合,形成ETL处理流程。 1.数据抽取 数据抽取指的是从不同的网络、不同的操作平台、不同的数据库和数据格式、不同的应用中抽取数据的过程。目标源可能包括ERP、CRM和其他企业系统,以及来自第三方源的数据。 不同的系统倾向于使用不同的数据格式,在这个过程中,首先需要结合业务需求确定抽取的字段,形成一张公共需求表头,并且数据库字段也应与这些需求字段形成一一映射关系。这样通过数据抽取所得到的数据都具有统一、规整的字段内容,为后续的数据转换和加载提供基础,具体步骤如下: ①确定数据源,需要确定从哪些源系统进行数据抽取 ②定义数据接口,对每个源文件及系统的每个字段进行详细说明 ③确定数据抽取的方法:是主动抽取还是由源系统推送?是增量抽取还是全量抽取?是按照每日抽取还是按照每月抽取? 2.数据转换 数据转换实际上还包含了数据清洗的工作,需要根据业务规则对异常数据进行清洗,主要将不完整数据、错误数据、重复数据进行处理,保证后续分析结果的准确性。 数据转换就是处理抽取上来的数据中存在的不一致的过程。数据转换一般包括两类:第一类:数据名称及格式的统一,即数据粒度转换、商务规则计算以及统一的命名、数据格式、计量单位等;第二类:数据仓库中存在源数据库中可能不存在的数据,因此需要进行字段的组合、分割或计算。主要涉及以下几个方面: ①空值处理:可捕获字段空值,进行加载或替换为其他含义数据,或数据分流问题库 ②数据标准:统一元数据、统一标准字段、统一字段类型定义 ③数据拆分:依据业务需求做数据拆分,如身份证号,拆分区划、出生日期、性别等 ④数据验证:时间规则、业务规则、自定义规则 ⑤数据替换:对于因业务因素,可实现无效数据、缺失数据的替换 ⑥数据关联:关联其他数据或数学,保障数据完整性 3.数据加载…
2024-11-17 阅读全文 →
FWQ
Docker教程
通过Docker与Redis集成提升缓存效率与数据一致性
通过Docker与Redis集成提升缓存效率与数据一致性 在现代应用程序开发中,缓存机制的有效性直接影响到系统的性能和用户体验。Redis作为一种高性能的内存数据库,广泛应用于缓存解决方案。而Docker则为应用程序的部署和管理提供了灵活性和可移植性。将Docker与Redis结合使用,可以显著提升缓存效率与数据一致性。本文将探讨如何通过Docker与Redis的集成来实现这一目标。 什么是Redis? Redis(Remote Dictionary Server)是一种开源的内存数据结构存储系统,支持多种数据结构,如字符串、哈希、列表、集合等。由于其高效的读写性能,Redis常被用作缓存、消息代理和实时分析等场景。Redis的特点包括: 高性能:Redis能够处理每秒数十万次的读写操作。 持久化:支持将数据持久化到磁盘,确保数据不丢失。 丰富的数据结构:支持多种数据类型,灵活应对不同的应用需求。 Docker的优势 Docker是一种开源的容器化平台,允许开发者将应用程序及其依赖打包到一个轻量级的容器中。Docker的主要优势包括: 环境一致性:无论在开发、测试还是生产环境中,Docker容器都能提供一致的运行环境。 资源隔离:每个容器都是独立的,避免了不同应用之间的相互影响。 快速部署:容器的启动速度极快,能够迅速响应业务需求。 通过Docker与Redis集成的步骤 将Redis部署在Docker容器中,可以简化管理和扩展。以下是通过Docker与Redis集成的基本步骤: 1. 安装Docker 首先,需要在服务器上安装Docker。可以通过以下命令在Ubuntu上安装: sudo apt-get update sudo apt-get install docker.io 2. 拉取Redis镜像…
2024-11-16 阅读全文 →
FWQ
Docker教程
使用Docker安装Vault-Flocker的教程
使用Docker安装Vault-Flocker的教程 在现代云计算环境中,数据安全和管理变得愈发重要。HashiCorp的Vault是一个用于安全存储和访问敏感信息的工具,而Flocker则是一个用于容器数据管理的开源项目。结合这两者,可以实现对容器化应用的安全数据管理。本文将介绍如何使用Docker安装Vault-Flocker,并提供详细的步骤和示例代码。 前期准备 在开始之前,请确保您的系统上已安装Docker。您可以通过以下命令检查Docker是否已安装: docker --version 如果未安装Docker,请访问Docker官方文档,根据您的操作系统进行安装。 安装Vault 首先,我们需要拉取Vault的Docker镜像。可以使用以下命令: docker pull vault 接下来,您可以使用以下命令启动Vault容器: docker run --cap-add=IPC_LOCK -d --name=vault -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' vault 在这个命令中,我们设置了Vault的根令牌和监听地址。您可以根据需要修改这些参数。 配置Vault 启动Vault后,您需要初始化和解锁Vault。可以使用以下命令进行初始化: docker exec…
2024-11-16 阅读全文 →