﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-aa19870406-随笔分类-redis</title><link>http://www.cppblog.com/aa19870406/category/19567.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 17 Jul 2012 22:19:21 GMT</lastBuildDate><pubDate>Tue, 17 Jul 2012 22:19:21 GMT</pubDate><ttl>60</ttl><item><title>redis源码剖析-main流程</title><link>http://www.cppblog.com/aa19870406/archive/2012/07/17/183875.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Tue, 17 Jul 2012 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2012/07/17/183875.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/183875.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2012/07/17/183875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/183875.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/183875.html</trackback:ping><description><![CDATA[<div><span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">一、redis运行流程<br />以下是redis main函数的运行流程<br /><br /></span><div><font face="Tahoma" size="3"><span style="line-height: normal;"><img src="http://www.cppblog.com/images/cppblog_com/aa19870406/redis.png" width="504" height="1074" alt="" /><br /></span></font></div></div><img src ="http://www.cppblog.com/aa19870406/aggbug/183875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2012-07-17 13:28 <a href="http://www.cppblog.com/aa19870406/archive/2012/07/17/183875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>redis源码剖析-字符串</title><link>http://www.cppblog.com/aa19870406/archive/2012/07/03/181190.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Mon, 02 Jul 2012 16:59:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2012/07/03/181190.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/181190.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2012/07/03/181190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/181190.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/181190.html</trackback:ping><description><![CDATA[<div style="text-align: center;"><span style="font-size: 18pt; ">redis源码剖析-字符串<br /><br /></span></div>redis实现了自己的字符串结构。在文件sds.h/dsd.c中定义。redis中的字符串叫sds(simple dynamic string)。<br />sds实质是char*:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->typedef&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*sds;</div>sds通过sdsnewlen()函数来创建,sds sdsnewlen(const void *init, size_t initlen)。该函数内部会创建一个sdshdr的结构,返回值sds，即char *，该结构定义如下:<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span>&nbsp;sdshdr<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;free;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[];<br />};</div>其中len存储当前字符串的长度，free存储该结构体剩余可存储字节数，buf存储字符串值。sdsnewlen()函数在创建sdshdr后，会返回buf的地址（sdshdr-&gt;buf)。<br />sdsnewlen()函数创建了字符串，并返回字符串地址sds,要使用sdshdr中的len和free，则需要获取sdshdr结构体的地址。如何根据获得的sds得到sdshdr结构体的地址呢？<br /><div>redis中参考了linux内核关于通用list(list_head)的实现机制,实现方法如下:<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span>&nbsp;sdshdr&nbsp;*sh&nbsp;=&nbsp;&nbsp;(<span style="color: #0000FF; ">void</span>*)&nbsp;(sds-(<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;sdshdr)));</div>sds是返回的字符串地址，即sdshdr-&gt;buf，用sds的地址减去其在结构体中的偏移，即可得到sdshdr的地址。由于buf在sdshdr结构体的最后，所以其偏移就是sizeof(len)+sizeof(free),该偏移恰好是sizeof(struct sdshdr)。<br />如果buf在sdshdr中的位置是任意的，如何根据buf的地址获取sdshdr的地址呢？实现如下:<br />假设现在sdshdr声明如下:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span>&nbsp;sdshdr<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;free;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />};</div><font color="#0000ff" size="2">则sdshdr地址如下获取：<br /></font><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;offset_buf&nbsp;=&nbsp;(<span style="color: #0000FF; ">int</span>)((<span style="color: #0000FF; ">struct</span>&nbsp;sdshdr&nbsp;*)0)-&gt;buf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">struct</span>&nbsp;sdshdr&nbsp;*sh&nbsp;=(<span style="color: #0000FF; ">struct</span>&nbsp;sdshdr&nbsp;*)(&nbsp;(<span style="color: #0000FF; ">int</span>)sdsbuf&nbsp;-&nbsp;offset_buf); &nbsp;</div><font color="#0000ff" size="2">其中sdsbuf是调用sdsnewlen()返回的buf地址。即 sds sdsbuf = sdsnewlen(...);<br /></font><span style="font-size: 13px; background-color: #eeeeee; ">((</span><span style="font-size: 13px; color: #0000ff; ">struct</span><span style="font-size: 13px; background-color: #eeeeee; ">&nbsp;sdshdr&nbsp;</span><span style="font-size: 13px; background-color: #eeeeee; ">*</span><span style="font-size: 13px; background-color: #eeeeee; ">)</span><span style="font-size: 13px; background-color: #eeeeee; ">0</span><span style="font-size: 13px; background-color: #eeeeee; ">)</span><span style="font-size: 13px; background-color: #eeeeee; ">-&gt;</span><span style="font-size: 13px; background-color: #eeeeee; ">buf 表示当结构体sdshdr在地址0时，buf相对于sdshdr首地址的偏移。</span><font color="#0000ff" size="2"><br /></font></div><br /> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div> <img src ="http://www.cppblog.com/aa19870406/aggbug/181190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2012-07-03 00:59 <a href="http://www.cppblog.com/aa19870406/archive/2012/07/03/181190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>