Golang redis.v3 源代码再分析

今天继续跟大家来剖析Golang redis.v3,一个在Golang redis client。

昨天的文章发出之后,有读者反馈

你是明白了,你还要让所有用户都打开源码才知道你说的啥么… 还是在手机上….. 建议把涉及的关键源码也贴出来 手机就无障碍理解你的意思了。

再次感谢这位朋友,是你让我重新审视昨天发的文章。在手机上无法看到关键代码,很难理解文中的源码分析,所以今天再进行分析,希望今天的部分可以让大家无障碍的阅读和学习,且在文章内容上也做了进一步的深入。

还是继续推荐黄健宏de书籍:

《Redis实战-译本》

《Redis设计与实现-第一版》,注:虽然是基于2.6的,但是完全不影响我们对redis基本数据结构的学习,暂时不想买书的朋友,可以看这本。而且还有基于2.6的源代码注释

《Redis设计与实现-第二版》,基于3.0的源代码注释

以上两本书,你都值得拥有。

说到这里,大家以为我是软文了,其实真不是的。能专注做一件事很不简单,何况作者专注了这么长时间,作者是90后哦,看过作者的简介,我相信没人不佩服他。

redis client初始化

该redis客户端支持连接池的,基本的redis初始化代码如下图: NewClient

初始化配置选项

NewClient的参数是redis.Options,

参数说明如下图: Options

例子分析

今天换一个例子来说明,String(字符串)

当我们在初始化redis client的时候,配置了Logger之后,在进行redis操作的时候就会按照其logger格式化输出。

代码如下图: redis_logger

通过logger输出,会打印

SET one: [redis.go 52]

昨天例子中:之后输出的是0,今天:之后是”“,这是为什么呢?

因为不管是什么类型的cmd,都会调用reset(), 基本默认值是nil

redis_cmd

不同的cmd有不同的默认值:0, false, “”, nil,

补充

接下来详细分析一下command.go

按照Java的编程思想,有以下这些cmd的实现: IntCmd, StatusCmd,SliceCmd,DurationCmd,BoolCmd,StringCmd,FloatCmd,StringSliceCmd,BoolSliceCmd,StringStringMapCmd,StringIntMapCmd,ZSliceCmd,ScanCmd,ClusterSlotCmd,

他们都有baseCmd struct 属性。

大家应该会很纳闷,为什么会有这么多呢?特别的StatusCmdStringCmd感觉没什么差别。

根据我的初步分析,Status很明显是跟状态有关,具体的查看下面两个代码,应该可以很容易看出来。【这个为什么这么用,暂时不知道】

详细对比cmd对应实现了的方法,其实StringCmd比StatusCmd多以下方法Int64(),Uint64(),Float64(),他们只是将String转换成对应的类型而已。

redis_get redis_status


茶歇驿站

一个让你可以在茶歇之余,停下来看一看,里面的内容或许对你有一些帮助。

这里的内容主要是团队管理,个人管理,后台技术相关,其他个人杂想。

茶歇驿站二维码

当然,你觉得对你有帮助,也可以给我打赏。 打赏