【深入理解Go】从0到1实现一个validator

2021-09-27
阅读 6 分钟
2.4k
validator是我们平时业务中用的非常广泛的框架组件,很多web框架、微服务框架都有集成。通常用来做一些请求参数的校验以避免写出重复的检验逻辑。接下来的文章中,我们就去看看如何去实现一个validator。

【Go语言踩坑系列(九)】Channel(上)

2020-04-12
阅读 4 分钟
4.3k
我们知道,Go实现了两种并发形式,第一种是多线程共享内存,其实就是Java,C++等语言的多线程并发,通过锁来进行访问。另一种则是Go特有的CSP(communicating sequential processes)并发模型。

【Go语言踩坑系列(六)】面向对象

2020-03-29
阅读 7 分钟
3.3k
首先,我们需要明确面向对象的思想是包含各种独立而又互相调用,这就需要一个承载的数据结构,那么这个结构是什么呢?很显然,在GO语言中就是结构体。其次,结构体作为一种数据结构,无论是在C还是C++还是Go都发挥了极其重要的作用。另外,在Go语言中其实并没有明确的面向对象的说法,实在要扯上的话,我们可以将struct...

【2019年度总结】重生

2019-12-31
阅读 6 分钟
3.4k
1月。刚刚结束为期五个月的实习,我回到杭州暂做休整。这五个月,是我一生中成长最快的五个月,也是我一生中受到打击最大的五个月。在校期间,我通过两年时间积累起来的自信一落千丈,我感受到我的能力是那样一文不值、身体是如此的弱不禁风。那一刻我才明白,我不过是一只井底之蛙罢了。我折服于雷总能力的广度与深度、...

【PHP7源码分析】奇妙的json_encode()

2019-11-03
阅读 7 分钟
4.2k
最近在工作中碰到了一个现象:对于一个以数字为索引的PHP数组,在数组索引下标分别为连续和不连续的情况下,我们在分别对其进行json_encode()之后,得到了两种不一样的输出结果。看下面一段代码:

【Redis5源码学习】浅析redis命令之scan篇

2019-10-09
阅读 9 分钟
4.2k
对于增量式迭代命令不保证每次迭代所返回的元素数量,我们可以使用COUNT选项, 对命令的行为进行一定程度上的调整。COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。使用COUNT 选项对于对增量式迭代命令相当于一种提示, 大多数情况下这种提示都比较有效的控制了返回值的数量。

【Redis5源码学习】浅析redis命令之restore篇

2019-10-08
阅读 4 分钟
4.4k
Grape 命令语法 命令含义:反序列化给定的序列化值,并将它和给定的 key 关联。 命令格式: {代码...} 命令实战 {代码...} 返回值 如果反序列化成功那么返回 OK ,否则返回一个错误。 源码分析 源码分析部分我们分为几个部分来讲解。 参数处理 {代码...} 在上边我们提到了restore命令格式,我们可以看到,在第四个参数开...

【Redis5源码学习】浅析redis命令之rename篇

2019-10-04
阅读 3 分钟
2.9k
baiyan 命令语法 命令含义:将 key改名为newkey命令格式: {代码...} 命令实战: {代码...} 返回值: 改名成功时提示 OK ,失败时候返回一个错误 源码分析 主要流程 rename命令的处理函数是renameCommand(): {代码...} renameCommand()函数调用了底层通用重命名函数: {代码...} 我们首先整理一下这个命令的思路,如果让...

【Redis5源码学习】浅析redis命令之persist篇

2019-10-03
阅读 4 分钟
2.3k
命令含义:移除给定key的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。命令格式:

【Redis5源码学习】浅析redis命令之randomkey篇

2019-10-01
阅读 4 分钟
3.8k
baiyan 命令语法 命令含义:从当前选定数据库随机返回一个key命令格式: {代码...} 命令实战: {代码...} 返回值: 随机的键;如果数据库为空则返回nil 源码分析 主体流程 keys命令对应的处理函数是randomKeyCommand(): {代码...} 随机键生成以及过期判断 randomKeyCommand()调用了dbRandomKey()函数来真正生成一个随机...

【Redis5源码学习】浅析redis命令之object篇

2019-09-27
阅读 5 分钟
2.1k
baiyan 命令使用 命令含义:查看指定key的一些信息,一般用于调试或查看内部编码使用命令格式: {代码...} OBJECT有4个可选的子命令subcommand: OBJECT REFCOUNT:查看当前键的引用计数 OBJECT ENCODING:查看当前键的编码 OBJECT IDLETIME:查看当前键的空转时间 OBJECT FREQ:查看当前键最近访问频率的对数 OBJECT HE...

【Redis5源码学习】浅析redis命令之migrate篇

2019-09-27
阅读 10 分钟
2.5k
命令含义:将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除命令格式:

【Redis5源码学习】浅析redis命令之move篇

2019-09-26
阅读 8 分钟
2.4k
命令含义:将当前数据库的 key 移动到给定的数据库 db 当中。命令注释:如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive)。命令格式:

【Redis5源码学习】浅析redis命令之expire篇

2019-09-22
阅读 5 分钟
3.1k
Grape 命令语法 命令含义:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。命令格式: {代码...} 命令实战: {代码...} 返回值: 设置成功返回 1 。当 key 不存在或者不能为 key 设置生存时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的生存时间),返回 0 。 源码分析: expire对应...

【Redis5源码学习】浅析redis命令之keys篇

2019-09-22
阅读 7 分钟
3.4k
baiyan 命令语法 命令含义:查找并返回所有符合给定模式 pattern 的 key 命令格式: {代码...} 命令实战: {代码...} 返回值: 根据pattern匹配后的所有键的集合 源码分析 keys命令对应的处理函数是keysCommand(): {代码...} 由于我们使用了keys *命令,需要返回所有键的集合。我们首先观察这段代码,它会使用一个安全...

【Redis5源码学习】浅析redis命令之dump篇

2019-09-20
阅读 3 分钟
5.3k
DUMP key序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键。序列化生成的值有以下几个特点:

【Redis5源码学习】浅析redis命令之del篇

2019-09-19
阅读 5 分钟
3.8k
baiyan 命令语法 命令含义:删除一个键所对应的值命令格式: {代码...} 命令实战: {代码...} 返回值:被删除 key 的数量 源码分析 首先我们开启一个redis客户端,使用gdb -p redis-server的端口。由于del命令对应的处理函数是delCommand(),所以在delCommand处打一个断点,然后在redis客户端中执行以下几个命令: {代码...

【业务学习】关于MySQL order by limit 走错索引的探讨

2019-09-16
阅读 2 分钟
6.5k
Grape 描述 今天在跑脚本的时候发现了几条慢查询,根据之前的经验实属不应该,后来经过查找资料和分析出来结果,在这里简单记录一下。 首先,我的sql是这个样子: {代码...} 索引是下边这个样子: {代码...} 按照我之前的理解这条sql是可以走这个索引的,但是他没有,他选择了主键索引。 分析 看到这是个慢查询,我起手...

【Redis5源码学习】浅析redis命令执行的生命周期

2019-09-15
阅读 13 分钟
2.4k
首先看一张我们非常熟悉的redis命令执行图:那么思考这样一个问题,当我们连接了redis服务端之后,然后输入并执行某条redis命令:如set key1 value1。这条命令究竟是如何被发送到redis服务端的,redis服务端又是如何解析,并作出相应处理,并返回执行成功的呢?

【业务学习】2019-05-09 http1.1&2.0的基本原理

2019-09-01
阅读 4 分钟
2.7k
我们目前用到最多的是http1.x协议,header和body我们都不陌生,那么startline是什么呢?startline是我们所说的request_line或status_line,也就是GET /HTTP/1.1或者HTTP/1.1 200 OK这种字段。在叙述http的各种工作方式之前,我们先熟悉一下TCP/IP模型:

【Redis5源码学习】浅析redis中的IO多路复用与事件机制

2019-09-01
阅读 14 分钟
7.3k
读这篇文章之前请先阅读:浅析服务器并发IO性能提升之路—从网络编程基础到epoll,以更好的理解本文的内容,谢谢。我们知道,我们在使用redis的时候,通过客户端发送一个get命令,就能够得到redis服务端返回的数据。redis是基于传统的C/S架构实现的。它通过监听一个TCP端口(6379)的方式来接收来自客户端的连接,从而进...

【业务学习】浅析服务器并发IO性能提升之路 — 从网络编程基础到epoll

2019-08-26
阅读 10 分钟
3.7k
我们常常使用HTTP协议来传输各种格式的数据,其实HTTP这个应用层协议的底层,是基于传输层TCP协议来实现的。TCP协议仅仅把这些数据当做一串无意义的数据流来看待。所以,我们可以说:客户端与服务器通过在建立的连接上发送字节流来进行通信。这种C/S架构的通信机制,需要标识通信双方的网络地址和端口号信息。对于客户端...

【业务学习】初识Kafka

2019-08-15
阅读 4 分钟
1.6k
这几天简单学习了一下Kafka,看了一些书,也查了一些资料,结合这些,我简单总结了一下Kafka的一些基础知识,以此作记录~老规矩,抛出我们这篇文章的三个问题:

【PHP7源码学习】2019-04-25 PHP生命周期浅析

2019-08-10
阅读 5 分钟
2.4k
今天我们来看下PHP的生命周期,我们都知道PHP生命周期有五个步骤,那么在源码层级是怎么去实现PHP生命周期呢?首先,我们抛出本文的几个问题:

【Redis5源码学习】2019-04-19 字典dict

2019-08-04
阅读 9 分钟
2.1k
hash:数据量小的时候使用ziplist,量大时使用dict zset:数据量小的时候使用ziplist,数据量大的时候使用skiplist + dict

【PHP7源码学习】剖析PHP数组的有序性

2019-08-03
阅读 4 分钟
4.8k
在 PHP7中,我们往数组中插入元素的顺序,就决定了我们数组遍历元素的顺序。可以说,PHP7中的数组是有序的。这个有序就是指元素插入数组时的顺序,与遍历时顺序的一致性。为了直观地让大家了解到PHP7数组的有序性,请看下面一段PHP代码:

【Redis5源码学习】2019-04-18 整数集合intset

2019-08-01
阅读 7 分钟
1.7k
intset是Redis集合的底层实现之一,当添加的所有数据都是整数时,会使用intset;否则使用dict。特别的,当遇到添加数据为字符串,即不能表示为整数时,Redis 会把数据结构转换为 dict,即把 intset 中的数据全部搬迁到 dict。

【Redis5源码学习】2019-04-17 压缩列表ziplist

2019-07-29
阅读 4 分钟
4k
乍一看标题,我们可能还不知道ziplist是何许人也。但是如果我说list、hash、zset这几种数据结构,大家就很熟悉了。而ziplist就是这几种数据结构的底层实现之一:

【Redis5源码学习】2019-04-16 跳跃表skiplist

2019-07-29
阅读 4 分钟
2.4k
想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。

【Redis5源码学习】2019-04-15 简单动态字符串SDS

2019-07-25
阅读 8 分钟
3.3k
今天我们正式进入redis5源码的学习。redis是一个由C语言编写、基于内存、单进程、可持久化的Key-Value型数据库,解决了磁盘存取速度慢的问题,大幅提升了数据访问速度,所以它常常被用作缓存。