自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 Go-map集合

map集合是一种无序的key-value的数据结构,在Go中的map是引用类型,必须初始化才能使用map是一种无序的键值对集合,可以通过key来快速的检索value,key类似索引,指向数据的值。我们可以像数组和切片一样迭代map,但因为其是无需的,所以我们无法决定它的返回顺序定义格式:map[KeyType]ValueType,KeyType:键类型,ValueType:值类型,map初始值为nil,需要使用make()函数来分配内存,make(map[KeyType]ValueType, [ca.

2021-12-15 16:48:51 474

原创 Go-数组与切片

1. 数组数组是同一类型数据的固定长度的序列数组的定义格式为 var 数组名[长度]类型数组长度是其类型的一部分,一旦定义,不能更改,例如var a[5]int和var a[8]int这两个数组不是同一类型数组使用下表访问,第一个元素从0开始,最后一个为长度-1,若访问越界会Panic数组是值类型,若赋值或当成参数传递会复制整个数组,若改变副本值原始数组不会发生改变支持 “==“或”!=” 操作符,因为内存总是被初始化过的数组指针为*[length]T指针数组为[length]*T可以使

2021-11-25 18:20:43 159

原创 Go-指针

&:取地址*:根据变量地址取值1. 指针地址:每个变量在运行都有一个地址,这个地址代表变量在内存中的地址,Go语言中使用&字符放在变量前面对变量进行“取地址”操作2. 指针类型:Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string等3. 变量取值:在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用*操作,也就是指针取值4. 空指针:当一个指针被定义后.

2021-11-19 17:10:40 395

原创 Go-for循环

在Go中for循环有三种呈现形式for init; condition; post { }for condition { }for { }init:一般是赋值表达式,给控制变量赋初始值;condition:关系表达式或逻辑表达式,循环控制条件;post:一般为赋值表达式,给控制变量增量或减量str := "abc"for i := 0; i < len(str); i++{ fmt.Println(str[i])}strLen := len(str)for strLen &gt

2021-11-19 16:51:57 149

原创 Go-流程控制

1. if在Go中,if语法有以下几个特点需要注意可以省略条件表达式的括号初始化语句可以定义代码块局部变量代码块左括号必须在条件表达式尾部不支持类似PHP中的三目运算符// if条件语句格式如下:if 布尔表达式 { // 代码块}if str := "abc";i > 0 { fmt.Println(str[0])} else if i < 0 { fmt.Println(str[1])} else { fmt.Println(str[2])}2. s

2021-11-19 16:39:46 76

原创 Go- import和package的使用

在Go中使用包package来管理定义模块,可以使用import关键字来导入使用。如果导入的是go自带的包,则会去安装目录$GOROOT/src按包路径加载,如fmt包如果是我们go get安装或自定义的包,则会去$GOPATH/src下加载package的定义package的存放位置是以$GOPATH/src作为根目录,然后灵活的按照目录去组织,而且包名需与最后一级目录名一致。import的定义普通导入就是按照加载机制,将要使用的包导入进来,然后使用 packageName.Meth.

2021-11-17 18:31:47 860

原创 Go-init函数与main函数

1. main函数func main() { // 函数体}Go语言程序的默认入口函数,main函数只能用于main包中,且只能定义一个,类似PHP框架中的index.php2. init函数Go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性,用途类似于PHP中的__construct魔术方法init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等每个包可以拥有多个init函数包的每个源文件也可以拥有多个init函数同一个包中多个

2021-11-17 18:16:50 274

原创 Go-类型声明及作用域

1. 类型的作用域声明在函数内部,是函数的本地值,类似private声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect声明在函数外部且首字母大写是所有包可见的全局值,类似public2. 几种声明方式var 声明变量,格式:var 变量名 变量类型const 声明常量,格式:const identifier [type] = value,iota是Go中一个特殊常量,可以认为是一个可以被编译器修改的常量,iota是Go语言的常量计数器,只能在常量的表达式

2021-11-17 18:03:28 161

原创 Go-类型强转

在Go语言中不存在隐式的类型转换,即自动转换,如PHP一样,但是在Go中所有的类型转换都必须显式的声明格式:valueOfTypeB = typeB(valueOfTypeA)(类型 B 的值 = 类型 B(类型 A 的值))var a int = 100var b int8 = 100c := a + int(b) // 正确写法d := int8(a) + b // 正确写法fmt.Println(c)fmt.Println(d)e := a + b // 错误写法fmt.Prin.

2021-11-17 17:32:49 2441

原创 Go-常见数据类型之字符与字符串

1. 字符Go语言中没有专门的字符类型,若存储单个字符(字母)一般使用byte类型来保存字符只能使用单引号包裹,不能使用双引号,双引号包裹的是字符串var s byte = 's'fmt.Println(s) // 输出115fmt.Printf("%c", s) // 输出s以上案例说明:当我们直接输出byte值时,就是输出了对应字符的ASCII码值,若我们希望输出对应字符,需要使用格式化输出Go语言的字符使用UTF-8编码,英文字母占一个字符,汉字占三个字符Go语言的字符的本质是

2021-11-17 16:04:08 360

原创 Go-常见类型之浮点型

类型描述floa3232位浮点数floa6464位浮点数浮点型在机器中的存放形式大致为:浮点数=符号位+指数位+尾数位,尾数位可能丢失造成精度损失,如下所示var a float32 = 1.97897897356var b float64 = 1.97897897356fmt.Println(a) // 1.978979fmt.Println(b) // 1.97897897356以上案例说明float64的精度比float32的精度要高,所以当我...

2021-11-17 15:28:19 190

原创 Go-常见数据类型之整型

在Go语言中变量分为有符号和无符号两种类型有符号:int int8 int16 int32 int64无符号:unit unit8 uint16 uint32 uint64在保证程序正确运行的情况下,应该尽量选择占用空间小的数据类型,可以使用fmt.Printf("%T", var_name)输出变量类型,unsafe.Sizeof(var_name)查看变量占用字节类型描述范围实际范围uint32位或64位uint8无符号8位整型0~2^8-

2021-11-17 15:02:36 99

原创 Go-初识

1. Go语言的特点自动立即回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发编程反射语言交互性2. Go的安装官方下载地址:https://golang.google.cn/dl/LinuxA. 下载对应的二进制包B. 将下载的二进制包解压至 /usr/local目录C. 将 /usr/local/go/bin 目录添加至PATH环境变量D. 使用go env命令查看是否安装成功tar -C /usr/local -zxvf go1.17.2.l

2021-10-27 17:05:44 91

原创 Rabbitmq-return机制

1. 概念在某些情况下,当我们在发送消息时当前的exchange不存在或者指定的路由key路由不到,这个时候如果我们需要监听这种不可达的消息,就要使用Return Listener。Return Listener用于处理一些不可路由的消息。2. 图解...

2021-06-24 21:49:58 304 2

原创 Rabbitmq-幂等性

1. 概念用户对于同一操作发起的一次请求或者多次请求的结果是一致的,比如在mysql数据当中的乐观锁就可以用来保障幂等性。在业务高峰期最容易产生消息重复消费问题,比如当消费者消费完消息时,在给生产者返回ack时由于网络中断,导致生产者未收到确认信息,该条消息就会重新发送并被消费者消费,但实际上该消费者已成功消费了该条消息,这就造成了重复消费。而幂等性,即消息不会被多次消费,即使我们收到了很多一样的消息。2. 解决方案:唯一ID+指纹码在消费者消费前先去数据库查询这条消息的指纹码标识是否存在,没

2021-06-24 21:42:10 375

原创 Rabbitmq-保证消息百分之百投递成功

1. 生产者的可靠性投递保证消息的成功发出保证mq节点的成功接收生产者收到mq节点确认应答完善的消息补偿机制注:在实际的生产环境中,很难保证前3点的完全可靠,如在极端的环境中,生产者发送消息失败了,生产者在接受确认应答时突然发送网络闪断等情况,所以很难保证可靠性投递,因此才需要完善的消息补偿机制。2. 解决方案消息信息落库,对消息状态进行打标签(常用方案)消息的延迟投递,做二次确认,回调检查(不常用,大厂在用的高并发方案)...

2021-06-24 21:27:30 358

原创 Rabbitmq-ACK机制

1. 概念生产者发送消息到消息队列,消息队列接受到消息后产生回送响应,生产者中有个Confirm Listener异步监听响应应答,所以ACK机制又叫comfirm机制。生产者投递消息过后,如果消息队列接受到了则会给生产者一个应答生产者接受应答,用来确认这条消息是否正常发送到了消息队列,这也是消息可靠性投递的核心保障。...

2021-06-24 20:36:55 633

原创 Rabbitmq-PHP浅试

<?php$config = [ 'host' => '172.17.0.7', 'vhost' => 'my_vhost', // 虚拟机 'port' => '5672', 'login' => 'admin', 'password' => 'admin'];$conn = new AMQPConnection($config);if (!$conn->connect()) { exit('连接失败')

2021-06-24 10:12:03 80

原创 Rabbitmq-docker安装

拉取镜像docker pull rabbitmq构建rabbitmq容器docker run -p 5672:5672 -p 15672:15672 -d --name rabbitmq -v /docker/rabbitmq/:/var/lib/rabbitmq --privileged=true --hostname myRabbitmq -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBIT.

2021-06-23 16:48:05 116 2

原创 Rabbitmq-初识

1. rabbitmq的诞生及概念消息队列的来源:①、分布式系统已成为当前系统架构的主流,而消息队列在分布式系统中作为消息中间件能为分布式系统中的各种应用提供会话平台。②、用多进程异步操作取代单进程同步操作满足了高性能系统架构需求。③、可以防止服务器一下子做很多事情,消息队列采用队列的形式,消费者读取队列里面的消息的时候是一条一条读取的,服务器不会超负载。2.消息队列的概念:消息队列中间件是分布式系统中重要的组件,主要用于应用解耦、异步消息、流量削峰等问题。可实现高性能、高可用、可伸缩和最终

2021-06-22 11:35:42 102

原创 设计模式-观察者模式

1. 概念当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。观察者模式实现了低耦合,非侵入式的通知与更新机制。2. 应用场景当一个事件发生后,要执行一系列的更新操作。在传统的编程方式中,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。EventGenerator.php<?phpabstract class EventGenerator { private $observ

2021-05-26 16:28:03 50

原创 设计模式-适配器模式

1. 概念该设计模式的目的在于将各种截然不同的函数接口封装成统一的API。如在PHP中操作数据有mysql、mysqli、pdo三种,即使使用三种不同的数据库操作,我们可以使用适配器模式将其统一成一样的API,类似场景还有缓存适配器。<?phpinterface IDatabase { public function conn($host, $user, $password, $dbname); public function query($sql); public function cl

2021-05-26 16:10:45 53

原创 设计模式-注册树模式

1. 概念为了解决全局共享和交换对象,把已经创建好的对象挂载到某个全局可以使用的数组上面,在需要使用的时候直接从该数组中获取即可。将对象注册到全局的树上,任何地方直接访问。<?phpclass Register { protected static $objects; /** * 将对象注册到全局的树上 **/ public function set($alias, $object) { self::$objects[$alias] = $object; } /**

2021-05-26 15:57:24 73

原创 设计模式-策略模式

1. 3个角色抽象策略角色具体策略角色环境角色(对抽象策略角色的引用)2. 实现步骤定义抽象角色类(定义好各个实现的共同抽象方法)定义具体策略类(具体实现父类的共同方法)定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)<?php/*** 抽象策略类**/abstract class baseAgent { abstract function printPage();}/*** 用于客户端是IE时调用的类(环境角色)**/class IEA

2021-05-26 15:46:47 67

原创 设计模式-工厂模式

1. 概念工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。它的好处就是当你想要更改所实例化的类名时,只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。/*** 简单工厂模式(静态工厂方法模式)*/interface people{ public function say();}/*** Class man 继承people的男人类*/class man implements p

2021-05-26 15:15:06 60

原创 设计模式-单例模式

1. 3个特点只能有一个实例必须自行创建这个实例必须给其他对象提供这一实例2. 3中类型懒汉式单例饿汉式单例登记式单例3. PHP单例模式class Single { // 声明一个私有的实例变量 private $name; // 声明一个静态变量(保存在类中唯一的一个实例) public static $instance; // 声明私有构造方法为了防止外部代码使用new来创建对象 private function __construct() { } // 声

2021-05-26 15:01:44 81

原创 PHP-centos7安装curl报60证书失效错误处理

# 通过升级Linux内核来解决# 查看当前内核版本uname -r# 导入Keyrpm --importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org# 安装elrepo的yum源rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm# 安装最新的内核yum --enablerepo=elrepo-kernel 4.install kernel-ml -y

2021-05-10 17:25:13 536

原创 swoole-加速laravel框架

1. 简介在swoole中可以为我们提供http服务,http服务既可以用于我们日常的web开发中,同时它也可以对thinkphp、laravel等框架进行加速,但要使用swoole对常规框架加速,该框架必须是IOC类型的才可以,这是因为swoole是常驻内存的。在日常的web开发中,Nginx等服务端程序通过调用php-fpm 处理服务端的业务逻辑,处理完成后销毁内存并返回结果。这时一个 web 请求就要加载一次 php 的全部文件,需要的系统资源开销很大,这是目前 php-fpm 的缺点之一;并且因

2021-05-08 15:45:44 397

原创 PHP-运行模式

1. CGICGI(common gateway interface):通用网关接口,它是一个协议,PHP对它有自己的实现方式即PHP-CGI,但PHP在运行的时候是依赖于php.ini配置文件的,所以,每当 PHP-CGI 开始工作的时候,它是完完全全的一个新进程,它需要重新加载配置文件并初始化,这就造成了很大的资源和时间的浪费。随着技术的发展,人们开始意识到,PHP-CGI 的性能不是那么尽如人意。2. fastCGI为了解决CGI存在的性能问题,人们想出了这样一个方案,那就是预先加载好配置,每一

2021-05-08 14:46:23 63

原创 docker-swoole安装及简单使用

1. 安装cd /home# swoole包下载地址:https://pecl.php.net/package/swoolewget https://pecl.php.net/get/swoole-4.6.6.tgz# 解压压缩包tar -xzvf swoole-4.6.6.tgz# 将解压出来的安装包copy到php容器# 注意若容器中的路径不存在请先建立docker cp swoole-4.6.6 php:/usr/src/php/ext/swoole# 进入容器中并安装扩展dock

2021-05-08 14:25:26 874

原创 docker-lnmp安装

1. docker安装nginxmkdir -p /docker/nginx/conf # 创建宿主机的Nginx配置目录mkdir -p /docker/mysql/conf # 创建宿主机的mysql配置目录mkdir -p /docker/www # 创建宿主机的项目存放目录docker pull nginx # 拉取官方镜像docker images # 查看所有镜像vim default.conf # 修改Nginx配置server { listen 80;

2021-05-07 17:36:06 74

原创 docker-安装及简单应用

1. 安装安装(centos7)yum install -y docker查看是否安装成功docker version修改docker的镜像源vim /etc/docker/daemon.json{"registry-mirrors": ["https://ftnejmh3.mirror.aliyuncs.com"]}常用命令systemctl start docker # 启动dockersystemctl stop docker # 停止dock

2021-05-07 16:13:45 334

原创 Redis-内存淘汰策略

1. 过期删除策略定期删除:在redis当中,默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。惰性删除:redis在获取某个key的时候就会其进行检查,若这个key设置了过期时间,它就会进行判断是否过期,如果过期了此时就会删除,不会给你返回任何东西。总结:定期删除是集中处理,惰性删除是零散处理。2. 几种淘汰机制volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。allkeys-random:从数据集(server.db[i

2021-04-22 16:56:36 113

原创 Redis-分布式锁

1. 概念分布式锁是为了解决不同进程需要互斥地访问共享资源产生的。在分布式模式下,假如某份数据只有一份或者存在限制,那么我们就需要使用锁技术来控制某一时刻修改数据的进程数。2. 实现方式基于数据库实现分布式锁;如mysql排它锁。基于缓存(Redis等)实现分布式锁; 本文介绍内容。基于Zookeeper实现分布式锁。3. 几个属性安全属性:互斥,不管任何时候,只有一个客户端能持有同一个锁。效率属性A:不会死锁,最终一定会得到锁,就算一个持有锁的客户端宕掉或者发生网络分区。效率属性B

2021-04-22 16:11:48 63

原创 Redis-缓存雪崩

1. 简介1.1 描述由于缓存层承载着大量的请求,有效地保护了存储层,但是如果缓存层由于某些原因不能正常提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会级联宕机的情况。1.2 缓存击穿、穿透、雪崩对比缓存击穿:key对应的数据存在,但在redis中过期,若此时大量并发请求过来,当发现缓存过期时一般都会从后端DB加载数据并重新写入到缓存当中,这个时候大并发的请求可能会瞬间把后端DB压垮。缓存穿透:key对应的数据在数据源中并不存在,每次针对此key的请求从缓存获取不到,

2021-04-22 15:33:36 75

原创 Redis-缓存穿透

1. 简介1.1 概念缓存穿透是指查询一个不存在的数据,缓存层与存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层。大致可分为以下3步:缓存层不命中存储层不命中,不将空结果写回缓存返回空结果描述:缓存穿透将导致不存在的数据每次请求都需要到存储层去查询,失去了缓存保护后端存储的意义。缓存穿透问题可能会使后端存储负载加大,由于很多存储不具备高并发性,甚至可能造成后端存储宕机,通常可以在程序中分别统计总调用数,缓存层命中数,存储层命中数,如果发现大量存储层命中为空,可能就是

2021-04-22 15:12:40 122

原创 Redis-Lua脚本

1. 简介1.1 概念Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放。其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。因为广泛的应用于:游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件等。比如:Lua脚本用在很多游戏上,主要是Lua脚本可以嵌入到其他程序中运行,游戏升级的时候,可以直接升级脚本,而不用重新安装游戏。1.2 优势减少网络开销:在Redis操作需求需要向Redis发送5次请求,而使用脚本功能完成同样的操作只需要发送一个请求

2021-04-20 15:43:49 249

原创 Redis-慢查询

1. 概念所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息(例如:发生时间、耗时、命令的详细信息)记录下来,Redis也提供了类似的功能。注意:慢查询只会记录执行命令的时间。2. 慢查询日志的参数slowlog-log-slower-than:指定执行时间超过多少微秒(1秒等于1000000微秒) 的命令请求会被记录到日志上。slowlog-max-len:指定服务器最多保存多少条慢查询操作,服务器先进先出的方式保存多条慢查询日志,当服务器存储的

2021-04-19 17:44:41 62

原创 Redis-set类型

1. 概念redis集合(set)类型和list列表类型类似,都可以用来存储多个字符串元素的集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的,不存在元素下标。redis的set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。2. 常用命令SADD 命令:用于将一个或者多个元素假如到集合当中,假如元素已经存在在于集合当中,则

2021-04-19 17:25:35 118

原创 Redis-zset类型与结构

1. 概念Redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,有序集合给每个元素多设置了一个分数,利用该分数作为排序的依据。有序集合可以利用分数进行从小到大的排序。虽然有序集合的成员是唯一的,但是分数(score)却可以重复。比如在一个班中,学生的学号是唯一的,但是每科成绩却是可以一样的,redis可以利用有序集合存储学生成绩快速做成绩排名功能。2. 常用命令zadd 命令:用于向一个有序集合中加入一个或者多个元素及其分数。假如加入的元素已经存在,那么更

2021-04-19 16:33:42 144

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除