<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]redis C接口hiredis 简单函数使用介绍]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Wed, 06 Sep 2017 02:14:55 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：搞一些Nginx的扩展啥的都用那个hiredis进行静态编译后，编译进Nginx，这儿先研究一下这个Redis的C连接认证以及取数据先。<br/><br/>代码@/usr/local/src/hiredis：<br/><textarea name="code" class="php" rows="15" cols="100">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stddef.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;string.h&gt;
#include &lt;assert.h&gt;
#include &lt;hiredis/hiredis.h&gt;

void doTest()
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;//redis默认监听端口为6387 可以再配置文件中修改
&nbsp;&nbsp;&nbsp;&nbsp;redisContext* c = redisConnect(&quot;127.0.0.1&quot;, 6379);
&nbsp;&nbsp;&nbsp;&nbsp;if ( c-&gt;err)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisFree(c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Connect to redisServer faile&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Connect to redisServer Success&#92;n&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;//验证
&nbsp;&nbsp;&nbsp;&nbsp;const char* password = &quot;XjackMe42108&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;redisReply* r = (redisReply *)redisCommand(c, &quot;auth %s&quot;, password);
&nbsp;&nbsp;&nbsp;&nbsp;if (r-&gt;type == REDIS_REPLY_ERROR) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Authentication failure&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Authentication success&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;const char* command1 = &quot;set stest1 value1&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;r = (redisReply*)redisCommand(c, command1);

&nbsp;&nbsp;&nbsp;&nbsp;if( NULL == r)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Execut command1 failure&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisFree(c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;if( !(r-&gt;type == REDIS_REPLY_STATUS &amp;&amp; strcasecmp(r-&gt;str,&quot;OK&quot;)==0))
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Failed to execute command[%s]&#92;n&quot;,command1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisFree(c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Succeed to execute command[%s]&#92;n&quot;, command1);

&nbsp;&nbsp;&nbsp;&nbsp;const char* command2 = &quot;strlen stest1&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;r = (redisReply*)redisCommand(c, command2);
&nbsp;&nbsp;&nbsp;&nbsp;if ( r-&gt;type != REDIS_REPLY_INTEGER)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Failed to execute command[%s]&#92;n&quot;,command2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisFree(c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;int length =&nbsp;&nbsp;r-&gt;integer;
&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The length of &#039;stest1&#039; is %d.&#92;n&quot;, length);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Succeed to execute command[%s]&#92;n&quot;, command2);


&nbsp;&nbsp;&nbsp;&nbsp;const char* command3 = &quot;get stest1&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;r = (redisReply*)redisCommand(c, command3);
&nbsp;&nbsp;&nbsp;&nbsp;if ( r-&gt;type != REDIS_REPLY_STRING)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Failed to execute command[%s]&#92;n&quot;,command3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisFree(c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;The value of &#039;stest1&#039; is %s&#92;n&quot;, r-&gt;str);
&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Succeed to execute command[%s]&#92;n&quot;, command3);

&nbsp;&nbsp;&nbsp;&nbsp;const char* command4 = &quot;get stest2&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;r = (redisReply*)redisCommand(c, command4);
&nbsp;&nbsp;&nbsp;&nbsp;if ( r-&gt;type != REDIS_REPLY_NIL)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Failed to execute command[%s]&#92;n&quot;,command4);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisFree(c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(r);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Succeed to execute command[%s]&#92;n&quot;, command4);


&nbsp;&nbsp;&nbsp;&nbsp;redisFree(c);

&#125;

int main()
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;doTest();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;

&#125;

</textarea><br/>编译一下：<br/>gcc redisTest.c /home/test/rpmbuild/BUILD/ngx_http_monitor_module-2.2.0/hiredis/libhiredis.a -I/home/test/rpmbuild/BUILD/ngx_http_monitor_module-2.2.0/ <br/>关于头文件之 linux下C include搜索的路径：http://blog.csdn.net/chosen0ne/article/details/7210946<br/>编译静态的resis静态链接库make static,别make 会生成动态连接库，如果只指定 -L路径，会弄成了动态编译，有依赖SO的情况，静态文件大点无所谓了:<br/>&nbsp;&nbsp;cd hiredis<br/>&nbsp;&nbsp;make clean<br/>&nbsp;&nbsp;make static<br/>静态编译出来就是这样的：<br/>ldd a.out <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linux-vdso.so.1 =&gt;&nbsp;&nbsp;(0x00007ffeec95e000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libc.so.6 =&gt; /lib64/libc.so.6 (0x0000003771400000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/lib64/ld-linux-x86-64.so.2 (0x0000003771000000)<br/><br/>执行：<br/>./a.out <br/>Connect to redisServer Success<br/>Authentication success<br/>Succeed to execute command[set stest1 value1]<br/>The length of &#039;stest1&#039; is 6.<br/>Succeed to execute command[strlen stest1]<br/>The value of &#039;stest1&#039; is value1<br/>Succeed to execute command[get stest1]<br/>Succeed to execute command[get stest2]<br/><br/><br/>参考：http://blog.csdn.net/mniwc/article/details/12851837
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]redis C接口hiredis 简单函数使用介绍]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>