理解 Go 语言的面向对象
面向对象
面向过程
1234567891011121314package mainimport "fmt"func compare(a, b int) bool { return a < b}func main() { a, b := 1, 2 fmt.Println(compare(a, b))}// 以上代码运行结果:true
类声明
面向对象
1234567891011121314151617181920212223242526272829303132333435363738394041424344package mainimport "fmt"// 定义一个 Book 结构体 (相当于其他语言中的声明一个类)type Book struct { name string}// 给 Book 结构体声明一个值传递方法,(相当于类声明方法)func (book Book) changName1(name string) string { book.name = ...
docker-compose 搭建多版本 php 开发环境
前言我的本地机器是 mac ,使用 vagrant + virtualbox 安装了一个 centos7 的虚拟机,利用 vagrant 的共享目录来实现 centos 和本地机器的代码同步。然后在虚拟机里使用 docker 来运行多个容器跑项目
由于公司业务复杂,不同的项目需要不同版本的 php 才能运行,故记录一下这次搭建开发环境的过程
这次准备要搭建的环境
nginx
php5.3
php7.0
php7.4
准备工作1. 安装 docker
2. 安装 docker-compose
开始搭建
/var/project 就是本地机器和虚拟机的共享目录
web 是已经存在的项目目录
创建并进入 dev-compose 目录,用来存放容器相关配置
1. 编写 Dockerfile 文件
php7.4 的 dockfile 文件,命名为:Dockfile-php74
123456789101112131415161718192021222324252627282930FROM php:7.4-fpm# 声明作者LABEL maintainer="zhangjia ...
Swoole修炼之路
Swoole 是什么Swoole 是一个为 PHP 用 C 和 C++ 编写的基于事件的高性能异步&协程并行网络通信引擎
同步
12$data = file_get_contents('./data.json');echo $data;
这个是常见的文件读取操作,在 file_get_contents 函数从磁盘上拿回文件数据前,代码不会继续运行,而是等待返回,因为后续的打印数据依赖上一条指令的返回值,这就是常见的同步编程
异步
Jqury 的 ajax
1234567891011121314$.ajax({ url: "foo", data: 1, success: function(e){ $.ajax({ url: "foo", data: 1, success: function(b){ console.log(b); ...
理解DevOps思想
什么是 DevOps
DevOps(Development Oprations)是一种思想或方法论,它涵盖开发、测试、运维的整个过程
DevOps 强调软件开发人员与软件测试、软件运维、质量保障(QA)部门之间有效的沟通与协作。强调通过自动化的方法管理软件变更、软件继承
使软件从构建到测试、发布更加快捷、可靠,最终按时交付软件
公司项目开发的大概流程,看看是如何一步一步操作的:
Product Backlog 源自于 Scrum 方法,是指产品待办事项的集合,其事务有优先级判断,先处理优先级高的事项
DevOps 发展DevOps 兴起于 2009 年,近年来由于云计算、互联网的发展,促进了 DevOps 的基础设施及工具链的发展,涌现了一大批优秀的工具,这些工具包括开发、测试、运维的各个领域,例如:GitHub、Git、Svn、Docker、Jenkins、HudSon、JMeter等
传统上在软件开发的流程上,(无论是瀑布式开发还是敏捷式开发),都由“开发团队”来构建软件
开发团队需要与运维团队进行大规模的“交接”,运维团队负责执行一系列“部署”活动,将软件代 ...
Redis 教程
Redis 教程Nosql 概述为什么要用 Nosql
1、最早的单机 Mysql 的年代
90年代,一个网站的访问量一般不会太大,单个数据库完全足够!
大部分都是使用静态 html 网页,服务器根本没有压力
瓶颈如下:
1、数据量太大,一个机器放不下
2、数据索引(B+Tree),一个机器内存也放不下
3、访问量太大(读写混合),一个服务器承受不了
2、Memcached(缓存)+ MySQL + 垂直拆分(读写分离)
网站 80% 的情况都是在读,每次都去查询数据库就很麻烦,所以使用缓存来保证效率
发展过程:优化数据库结构和索引 → 文件缓存(IO)→ Memcache(当时最热门的技术)
3、分库分表 + 水平拆分 + 集群
早些年 MyISAM:表锁,十分影响效率,高并发下会出现严重的锁问题
转战 InnoDB:行锁
使用分库分表解决写的压力
4、如今的互联网架构模型
MySQL 等关系型数据库已经不够用了,各种各样的数据(音乐、热榜、图片等)都存在 MySQL 的话,数据库表很大,压力爆表,效率自然低下
为什么要用 NoSQL
用户的个人信息、 ...
Docker 详细教程
DockerDocker 概述Docker 是基于 Go 语言开发的开源项目!
官网:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
Docker 能干嘛
之前的虚拟机技术
虚拟机技术缺点:
资源占用十分多
冗余步骤多
启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较 Docker 和 虚拟机技术的不同:
传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
容器内的应用直接运行在宿主机的内核,容器没有自己的内核,也没有虚拟硬件,所以比较轻便
每个容器间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps (开发、运维)
应用更快速的交付和部署
Docker:打包镜像发布测试、一键运行
更便捷的升级扩缩容
项目打包为一个镜像
更简单的系统运维
在容器化之后,开发、测试环境高度一致
更高效的计算资源利用
Docker 是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例,服务器的 ...
数据库分库分表思路
数据切分(Sharding)关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到 1000W 或 100G 以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。
数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分
一. 垂直(纵向)切分
垂直切分常见有垂直分库和垂直分表两种。
垂直分库:就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。 做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与”微服务治理”的做法相似,每个微服务使用单独的一个数据库。如图:
垂直分表:基于数据库中的”列”进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。 在字段很多的情况下(例如一个大表有100多个字段),通过”大表拆小表”,更便于开发与维护,也能避免跨页问题,MySQL 底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。另外数据库以行为单位将数据 ...
mac vagrant nfs 挂载
使用 vagrant + virtualbox 搭建的 php 开发环境,挂载共享目录的问题laravel 6.0 框架要求 php 版本大于 7.2 ,在成功升级 7.3 以后,框架终于搭建成功,但是发现一个裸框架首页加载居然需要 1s 多的时间,不科学,很不科学,太不科学了。所以开始动手……
首先要把虚拟机的网络设置成 :private_network 模式
虚拟机安装 nfs 服务: centos 5:
1yum -y install nfs-utils portmap
centos 6:
1yum -y install nfs-utils rpcbind
由于 MAC OS 系统集成了 nfs,只需要修改 /etc/eprots 文件,没有则新建:
1sudo vi /etc/exports # 保持空文件即可
Vagrantfile 文件修改:
1config.vm.synced_folder "~/www", "/var/www", type: “nfs", mount_options:[ ...
setcookie刷新后才生效问题
最近遇到一个小问题,但挺有趣,记录一下
首先,设置一个 cookie
1234<?php setcookie('name', 'jojo'); echo $_COOKIE['name'];?>
当首次访问此页面时,页面报错
分析原因如下
第一次请求:
第二次请求:
总结
当我们首次访问设置 cookie 的页面时,服务器会把设置的 cookie 值通过响应头发送过来,告诉浏览器将 cookie 存储的本地相应文件夹中(注意:第一次访问时本地还没有存储 cookie,所以此时获取不到值)当第二次访问(或在进行 cookie 设置后,过期前所有的访问)时,请求头信息你中都会把 cookie 值携带。
Go语言入门笔记(四)
字符串常用函数
字符串查找 strings.Contains()
1234567891011import ( "fmt" "strings")func main() { s := "hello world" fmt.Println(strings.Contains(s, "hello"), strings.Contains(s, "?"))}// true false
字符串下标 strings.Index()
1234567891011import ( "fmt" "strings")func main() { s := "hello world" fmt.Println(strings.Index(s, "o"))}// 4
字符串分割 strings.Split()
1234567891011impor ...