这个命令主要是密码验证信息,我们来看如何处理的,执行函数为authCommand。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
代码如下:
void authCommand(redisClient *c)
{
if (!server.requirepass)
{
addReplyError(c,"Client sent AUTH, but no password is set");
}
else if (!time_independent_strcmp(c->argv[1]->ptr, server.requirepass))
{
c->authenticated = 1;
addReply(c,shared.ok);
}
else
{
c->authenticated = 0;
addReplyError(c,"invalid password");
}
}
看起来代码不多,我们细细研究。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先,我之前的文章为了简单,没有修改配置文件,导致redis是不需要密码验证的,
因为redis.conf配置文件里有一行是:
# requirepass foobared
那么为了密码验证如何做?
去掉#,然后把foobared修改为自己的密码即可!!!就是这么简单,
经理再也不用担心我的密码验证了!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这样的话,server.requirepass就会指向自己的密码。
这样的话:
if (!server.requirepass)
{
addReplyError(c,"Client sent AUTH, but no password is set");
}
就不会执行!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然后我发现了一个函数:time_independent_strcmp,我们来看看干嘛的!
这个函数有一句话解释:/* Return zero if strings are the same, non-zero if they are not.
也就是,相同返回0,不同返回1
很多不是特别重要的函数,大家没必要去看,把握主干就可以,要从宏观去认识一个事物,
吾生有涯而知识无涯啊!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (!time_independent_strcmp(c->argv[1]->ptr, server.requirepass))
{
c->authenticated = 1;
addReply(c,shared.ok);
}
如果密码相同,则设置authenticated为1
那么addReply(c,shared.ok);是干嘛的?从字面上理解为增加响应。
为什么这个时候不发送给客户呢?我写这篇文章时还没有看完整,
但是我之前碰到过一个事务的概念,我猜可能有的时候会执行多个命令,
把每个命令的响应放在一起再一次性发回。后面再验证。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
现在来理解addReply.
prepareClientToWrite函数的核心是给socket fd开启写句柄函数。
aeCreateFileEvent(server.el, c->fd, AE_WRITABLE,sendReplyToClient, c);
也就是说使用sendReplyToClient函数来处理。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shared.ok的encoding是:REDIS_ENCODING_RAW
所以会执行:
if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != REDIS_OK)
_addReplyObjectToList(c,obj);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_addReplyToBuffer函数又是如何运行的呢?
不急着看代码,我又重新看了下RedisClient的代码。
/* Response buffer */
int bufpos;
//已经写的数据字节数
char buf[REDIS_REPLY_CHUNK_BYTES];
//这个缓冲区用来存储发送的数据
先把这两个成员变量弄清楚。
然后看代码,不难理解,就是把"+OK\r\n"复制到缓冲区里。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
汗,这个命令竟然就这么简单的执行完毕,这也太土豪了吧!
总结:
客户发: auth mypassword
服务器:
成功1: +OK\r\n
失败1:-ERR Client sent AUTH, but no password is set\r\n
失败2:-ERR invalid password\r\n