Redis执行流程大揭秘:从命令到结果的奇幻之旅
随着内卷这一情况的不断深化,在数据库方面只学习 MySQL 显然是不够的。那么效率极高的 Redis 就成为了学习首选,以至于现在熟练掌握 Redis 已经成为应届生的必备技能了。
笔者也是在一个多月前第一次接触到 Redis,期间断断续续地学了一点内容,但并不是深入系统的学习,只是去看了一下几个常见问题的八股文,太浮躁了。既然要直接准备秋招,那就还有大把的时间,所以今天开始系统地学习一下 Redis 相关的内容。
安装、运行这些最开始的东西就不多赘述了,毕竟操作 Redis 的代码也已经写了不少了。那除了这些以外,还有什么适合当作学习的第一步呢?
今天的文章将会深入 Redis 到底是如何执行我们输入的命令的。
Redis 是怎么执行命令的?面对这个问题,大部分朋友心中的答案是:客户端发送命令给到服务端,服务端收到执行之后再处理将命令执行结果返回给客户端,简单来说如下图:
显然这样的答案不能帮我们了解 Redis 的工作原理,还是看看更细节的过程吧。
命令执行流程一条命令的执行过程有很多细节,但大体可分为:客户端先将用户输入的命令,转化为 Redis 相关的通讯协议,再用 sock ...
细说空结构体:Go语言中的奇妙用途
在 Go 语言中,正常的 struct 就是一个普通的内存块,必定是要占用一块内存的,并且结构体的大小是要经过边界,长度是对其的。
当你需要一个结构体,但是却丝毫不关系里面的内容,声明一个最小的结构体,也需要占用 1 字节,这是就要用到今天的主角——空结构体了。
“空结构体”是不占内存的,size 为 0;运行下面的代码可以得出,空结构体是不占用内存的。
12345678910package mainimport ( "fmt" "unsafe")func main() { fmt.Println(unsafe.Sizeof(struct{}{}))}
本质上来讲,使用空结构体的初衷只有一个:节省内存,但是更多的情况,节省的内存其实很有限,这种情况使用空结构体的考量其实是:根本不关心结构体变量的值。
什么原理特殊变量:zerobase空结构体时没有内存大小的结构体。这句话是没有错,但是更准确的来说,其实是有一个特殊起点的,那就是 zerobase 变量,这是一个 uintptr 全局变 ...
了解MongoDB——你想知道的都在这
数据库的学习总算是走出 MySQL 了,开源项目涉及的知识确实非常广,还有几个关系型数据库还在学习,今天就先来学习一下另外一个被广泛应用的 NoSQL——MongoDB。
本文仅作为笔者在了解 MongoDB 时学到的一些东西,并不会包含很深入的原理解析,当个科普文就可以了。
什么是 NoSQL?在学习 MongoDB 之前,先来了解一下什么是 NoSQL。之前在面试时被面试官问道,除了 MySQL 以外,还了解什么数据库。我回答,不知道。结束后,我机智的舍友问我为什么不回答 NoSQL,我以为这是不知道其他数据库的英文表达(离谱)。
NoSQL 也被称为 “not only SQL” 或 “non-SQL”,它是一种数据库设计方法,可以在关系数据库中的传统结构之外存储和查询数据。
虽然 NoSQL 仍然可以存储关系数据库管理系统 (RDBMS) 中的数据,但与 RDBMS 相比,数据存储方式有所不同。决定使用关系数据库还是非关系数据库在很大程度上取决于上下文,并且因用例而异。
NoSQL 数据库并非采用关系数据库的典型表结构,而是将数据存储在一个数据结构中,例如 JSON 文档。由于 ...
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│ ...
