MySQL实战总结
本文用于记录笔者在学习和使用MySQL时遇到的一些问题以及思考。
主要分为四个部分,也都是之前在面试的时候被提问过的问题,在写过第一次面试的面经之后就再没有总结过面试的问题了,其实在第二次面试被挂了之后就一直都在摆烂。
从头开始总结一下最近一段时间学到的一些内容,避免以后在秋招的时候还是不会。
B+树有关 B+ 树的问题实在第二次面试的时候被提问到的,当时的回答也是一塌糊涂。
学习MySQL的索引,就避不开要了解 B+ 树,在 MySQL 里 InnoDB 存储引擎就是采用 B+ 树来组织数据的,这是我们在背八股文时一定要记住的东西。那么在 B+ 树里的节点里存放的是什么呢?查询数据的过程又是怎样的?为什么要选择 B+ 树来组织数据呢?下面我们来深入学习一下。
从数据页的角度看 B+ 树这次,我们从数据页的角度看 B+ 树,看看每个节点长啥样。
InnoDB 是如何进行存储数据的?MySQL 支持多种存储引擎,不同的存储引擎,存储数据的方式也是不同,我们最常用的就是 InnoDB 存储引擎。
记录时按照行来存储的,但是数据库的读取并不以「行」为单位,否则一次读取(也就是一次 I/O ...
解锁灵活与高效——Casbin
今天这篇博客的标题看起来就很有逼格,不错,就是我们万能的 ChatGPT起的。当然,还是稍微改了一下,它给的实在是太有逼格了,我不太敢用。
每隔一段时间使用ChatGPT就会给我一种AI已经发展得这么牛逼的感觉,但是每次用它来解决一些实际问题的时候又会让我觉得它是个智障。
不得不说,ChatGPT在很多方面都已经发展到了可以取代一大部分人的水平了。从它出现之后,我就没有自己动手写过思政方面的任何东西,全是它完成的,属实是有点东西。写点题外话让破防的自己慢慢恢复一下,题外话到此为止。
本文要记录的是一个访问控制库——Casbin。
简介Casbin 是一个开源的访问控制框架,用于实现权限管理和访问控制的功能。它提供了一种简单而灵活的访问控制模型,可以用于保护应用程序、服务或其他系统中的资源。Casbin 的设计目标是提供一种通用的访问控制模型,并支持多种编程语言。
Casbin 的核心概念是访问控制模型和策略。访问控制模型定义了一组规则,用于描述谁可以访问哪些资源以及在什么条件下可以访问。策略是基于模型定义的规则,描述了实际的访问控制规则集合。
Casbin 支持多种访问控制模型,包括 ...
管理定时任务--cron
corn 是一个用于管理定时任务的库,用 Go 实现 Linux 中 crontab 这个命令的效果。除了 cron 以外,Go语言中还有另一个比较小巧、灵活的定时任务库,可以执行定时的、周期性的任务。但是它功能相对简单些,并且已经不维护了。如果有定时任务需求,还是建议使用cron。
简单使用12345678910111213141516171819package mainimport ( "fmt" "time" "github.com/robfig/cron/v3")func main() { c := cron.New() c.AddFunc("@every 1s", func() { fmt.Println("tick every 1 second") }) c.Start() time.Sleep(time.Second * 5)}
使用非常简单,创建cron对象,这个对象用于管理定时任务。
调用cron对象的Add ...
高性能日志库——Zap
今天把项目中的日志部分完成了,内容还是比较多的,所以从写代码到看各种函数花了十几个小时。那就还是老样子,先总结一下最重要的部分——Zap库的基本使用方法。
日志系统在任何一个投入使用的项目中,都需要一个好的日志系统(关于什么是日志,可以看之前的总结,更建议看总结中的参考)。在 Go 语言中,我们有很多能够投入使用的日志库,比如log、zap等。对于一个好的日志记录器来说,我们需要它能够实现一下功能:
能够将事件记录到文件中,而不是应用程序控制台。
日志切割-能够根据文件大小、时间或间隔等来切割日志文件。
支持不同的日志级别。例如INFO,DEBUG,ERROR等。
能够打印基本信息,如调用文件/函数名和行号,日志时间等。
默认的Go Logger在学习Uber-go的zap包之前,还是先学习一下Go语言提供的基本日志功能。由于之前写项目的时候在日志系统设计方面并没有很在意,所以根本就没记住什么东西,还是重新学一下吧。
如何使用实现一个Go语言中的日志记录器非常简单——创建一个新的日志文件,然后设置它为日志的输出位置。
那就来看一段简单的实现代码吧:
1234567891011121 ...
命令行解析——flag
在介绍 Viper 库的那一篇文章中我们有提到过 viper 在设置键值时的优先级,依次是 调用Set显示设置的 > 命令行选项 > 环境变量 > 配置文件 > 默认值。
在实际项目开发中一般不会直接 Set 来设置,因为要使用的配置现象过多。因此,在考虑直接读取配置文件之前,我们要先做一件事,那就是解析命令行,看看有没有相应的键值设置。
Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。
如何获取命令行参数?如果只是简单的想要获取命令行参数,可以直接使用 os.Args 来获取命令行参数。
123456789101112131415package mainimport ( "fmt" "os")func main() { //os.Args是一个[]string if len(os.Args) > 0 { for index, arg := range os.Args { fmt.Printf("args[%d]=%v\n" ...
Go语言配置管理神器——Viper
今天来记录一下在 go-vue-admin 项目中学习到的第一个东西——Viper。
在第一篇文章中,我们已经基本了解了这个项目中后端部分的基本框架以及主函数的内容。从主函数开始,第一条代码便是初始化 Viper。关于 Viper,我也已经不是第一次使用了,但之前确实是没有去了解过,所以要从头开始学习。
Viper 是什么XXX是什么?这是我们去学习一个东西想到的第一个问题。那么 Viper是 什么,详细内容如下:
viper 是一个配置解决方案,拥有丰富的特性:
支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件;
可以设置监听配置文件的修改,修改时自动加载新的配置;
从环境变量、命令行选项和io.Reader中读取配置;
从远程配置系统中读取和监听修改,如 etcd/Consul;
代码逻辑中显示设置键值。
为什么选择 Viper ?在构建现代应用程序时,你无需担心配置文件格式;你想要专注于构建出色的软件。Viper的出现就是为了在这方面帮助你的。
Viper能够为你执行下列操作:
查找、加载和反序列化JSON、T ...
go-vue-admin学习
将近一个月没有更新博客了,主要还是因为道心破了,实在是没有什么动力学习了。二十多天里,试着考了几天研,也试着工作考研两手抓。考虑了很久,还是觉得要提升代码能力,找了一个新的开源项目,不像之前一样每天跟着教程写了,试着能不能自己把别人的代码看懂吃透。
这里插一句,道心破了主要是因为在后面的几场面试里总是达不到想要的效果,说话磕磕巴巴,问项目就回答的含糊不清,也不怪面试官给我秒挂,太不自信了,再沉淀一段时间吧,只能寄希望于秋招了。
项目结构1234├── deploy: 部署相关的文件├── docs: 项目文档├── server: 后端代码└── web: 前端代码
项目分为两个部分,使用 vue 框架的前端部分和使用 gin 框架的后端部分,前端部分在web 目录下,后端部分在server目录下。由于我对前端的内容不是很了解,所以主要关注 server 后端部分。了解一下目前 github 排名第一的 golang admin 项目是怎么设计的。
后端结构123456789101112131415161718192021222324252627282930313233├── api│ ...
Go语言设计哲学——语言特性
Go 语言设计哲学第二弹,这不禁勾起了我的伤心往事,当时跟腾讯的面试官聊的多好啊,结果还是被挂了,呜呜呜……
面向对象在学过基础的 Go 语言语法后,我们就发现了 Go 和 C++ 最大的不同,那就是 Go 好像不支持面向对象。
这门编程语言里没有类(class)、继承(extends),难道真的不支持面向对象编程,难道它也知道我没有对象?完了,被监视了(狗头)。
你看,找工作给脑子找坏了吧。不必理会上面一段无脑发言,总结为玩原神玩的。那么 Go 到底支不支持面向对象,让我们一步一步地探寻。
类和继承类(class)在面向对象编程中是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的特性和方法(via @维基百科)。
继承是面向对象软件技术当中的一个概念,如果一个类别 B “继承自”另一个类别 A,就把这个 B 称为 “A的子类”,而把 A 称为 “B的父类别” 也可以称 “A 是 B 的超类”(via @维基百科)。
继承有如下两个特性:
子类具有父类别的各种属性和方法,不需要再次编写相同的代码。
子类别继承父类时,可以重新定义某些属性,并重写某些方法, ...
深入Go语言2——反射与unsafe
又到了一周一次的总结篇了,本周学到的知识可以用海量来表示了,毕竟这也是近一个月以来既没有考试也没有面试的一周,所以就一直在做项目、改简历。当然,较大模块的内容还是会在整理之后单独来记录。以后的事以后再聊,还是先来看看本周都学了什么吧。
反射在计算机科学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。(来自wikipedia)
反射是程序审查自身结构的能力,并能对程序做出一定的修改。
对于人来说,审查自身或过往事情的能力,叫 “反思” 或 “反省”。
Go 中的反射包:reflect介绍同 Java 语言一样,Go 语言也有运行时反射,这为我们提供了一种可以在运行时操作任意类型对象的能力。比如查看一个接口变量的具体类型、看看一个结构体又多少字段、修改某个字段的值等。
Go语言是静态编译类语言,比如在定义一个变量的时候,已经知道了它是什么类型,那么为什么还需要反射呢?这是因为有些事情只有在运行时才知道。比如你定义了一个函数,它有一个 interf ...
聊天室
这次真成全栈工程师了。第三个 Go 语言项目,简单地实现了一个基于 TCP 连接的聊天室。
实现功能也比较简单,用户输入昵称进入聊天室,进入聊天室后会向其他用户广播,用户可以看到聊天室的所有聊天记录和当前在线人数,支持@其他人,支持敏感词检测。
由于本项目也是基于书籍中的教程进行的开发,所以在此还是大概记录一下完成该项目学到的东西。
WebSocket本项目最重要的组成之一,本项目便是基于 WebSocket 进行开发的。
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,用于在 Web 应用程序中创建实时、双向的通信通道。
传统的 HTTP 请求通常是一次请求、一次相应,而 WebSocket 则可以建立一个持久连接,允许服务器即时向客户端推送数据,同时也可以接受客户端发送的数据。 WebSocket 相比于传统的轮询或长轮询方式,能够显著减少网络流量和延迟,提高数据传输的效率和速度。它对实时 Web 应用程序和在线游戏的开发非常有用。
WebSocket 可以在浏览器和服务器之间建立一条双向通信的通道,实现服务器主动向浏览器推送消息,而无需浏览器向服务器不 ...