索引的本质

索引是什么 索引是帮助MySQL高效获取数据的排好序的数据结构 最重要的点是有序的,我们用索引就是为了快速的查找数据,如果一堆数据是无序的,程序只能挨个遍历每个元素,对比值,才能找到某个元素,最坏的情况要

github_Action使用

需求 最近想实现一个自动部署惊天博客的功能,我有一个静态博客项目,是使用hugo进行编译和部署的,之前自己写了一个脚本将变动的博客自动编译部署到github page 上,也不是很麻烦。但是需要在本机执行一次命令

Linux下的循环

数字性循环 #!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done #!/bin/bash for i in $(seq 1 10) do echo $(expr $i \* 3 + 1); done #!/bin/bash for i in {1..10} do echo $(expr $i \* 3 + 1); done #!/bin/bash awk 'BEGIN{for(i=1; i<=10; i++) print i}' 字符性循环 #!/bin/bash for i in `ls`; do echo $i is file name\! ; done #!/bin/bash for i in $* ; do echo $i is input chart\! ; done #!/bin/bash for i in f1 f2 f3 ; do echo $i is appoint ; done

Go逐行读取文件

package main import ( "bufio" "fmt" "io" "os" ) func main() { filename := "./1.txt" f, err := os.Open(filename) if err != nil { fmt.Printf("read %s fail, err: %v\n", filename, err) } defer f.Close() reader := bufio.NewReader(f) for { line, _, err := reader.ReadLine() if err == io.EOF { fmt.Println("done!") break } fmt.Println(line) // TODO } }

zap包使用

package model import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func InitLogger(level string) *zap.SugaredLogger { encoder := getEncoder() // 同时输出到文件和控制台 core := zapcore.NewTee( zapcore.NewCore(encoder, stdWriter(), getLogLevel(level)), zapcore.NewCore(encoder, fileWriter(), getLogLevel(level)), ) return zap.New(core, zap.AddCaller()).Sugar() } func getLogLevel(level string) zapcore.LevelEnabler { switch level { case "DEBUG": return zapcore.DebugLevel case "INFO": return zapcore.InfoLevel case "WARN": return zapcore.WarnLevel case "ERROR": return zapcore.ErrorLevel default: return zapcore.InfoLevel } } func getEncoder() zapcore.Encoder { encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder return zapcore.NewConsoleEncoder(encoderConfig) } func stdWriter() zapcore.WriteSyncer { return zapcore.AddSync(os.Stdout) } func fileWriter() zapcore.WriteSyncer { file, _

RabbitMQ中的内存节点与磁盘节点

每个RabbitMQ 节点只有两种类型,要么是内存节点,要么是磁盘节点 内存节点 内存节点将所有的队列、交换器、绑定、用户、权限和vhost的元数据定义都仅存储在内存中. 显而易见,内存节点拥有更出色的性能 磁

RabbitMQ集群中的交换器

交换器不像队列那样有真实的进程, 它只是一张名称与队列进程PID的关系表 当你将消息发布到交换器时,实际上是由你所连接到的信道将消息上的路由键同交换器的绑定列表进行比较,然后路由消息。正是信道(chann

集群中的队列

从直觉上来看,一说到集群,我们就联想到高可用,一个节点宕机了,不会影响整体服务,客户端会从其他节点拿数据。比如 ES, Redis, mongoDB 等的集群都是符合直觉的架构。 但是,事情到了rabbitMQ 这里,却完全不一样了。 在将

RabbitMQ集群部署

本文采用docker-compose 的方式部署 rabbitMQ集群 docker-compose.yml version: "3" services: rabbitmq: restart: always container_name: rabbitMQ image: rabbitmq:3.7.7-management # 注意 hostname(本地域名), rabbitMQ集群之间的通信就是靠此寻址的。物理机部署时也可以使用固定IP

RabbitMQ应答队列

生产者在某个队列上等待消费者返回的消息, 这个队列被称为应答队列,RabbitMQ 天生支持应答队列的机制。 什么时候需要应答队列 当一条消息被消费者处理后,需要告知生产者一些信息时,消费者就需要在应答队列上

powershell配置

安装powershell 下载地址 安装scoop 打开powershell 执行 修改策略 set-executionpolicy remotesigned -s cu 安装scoop iex (new-object net.webclient).downloadstring('https://get.scoop.sh') 自动补全 PSReadLine 在 V5 或以上版本中自带 命令 $profile 可见看见配置文件的路径,如果没有此文件,新建即可 打配置

awk分组统计

Shell学习笔记:awk实现group by分组统计功能 日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量。 1.样例数据 test.txt YD5Gxxx|6618151|68

golnag插件式开发的一种案例

OCP:开闭原则 软件的5大设计原则 “SOLID” 原则,其中之一就是 OCP(开闭原则) 该设计原则是由Bertrand Meyer在20世纪80年代大力推广的,其核心要素是:如果软件系统想要更容易被改变,那

右键注册自定义程序

想把自己写的一个控制台程序添加到右键,可以通过修改注册表的方式实现,但是修改起来比较麻烦,推荐使用右键管理器进行修改 右侧的 ”文件“ ”文件夹“ ”目录“ 等,代表在该项右键时,右键菜单显示的内容 点击 + 新建:

架构整洁之道书摘八——软件架构

软件架构这项工作的实质就是规划如何将系统切分成组件,并安排好组件之间的排列关系,以及组件之间互相通信的方式。 (拆分、组合、通信) 目标 设计良好的架构可以让系统便于理解、易于修改、方便维护,并且能轻松部署