Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.0k views
in Technique[技术] by (71.8m points)

关于【redis5设计与源码分析】第八章Stream的不解

首先 创建一个消息流:xadd mystream * name hb age 20
根据这条指令,再参照图8-1,可以很容易明白 【* name hb age 20】是一条消息。比如ID1。*是redis自行生成的消息ID,具有唯一性。
8.1.3 stream结构
<每个消息流都包含一个Rax结构。以消息ID为key,listpack结构为value存储在Rax结构中。每个消息的具体信息存储在这个listpack中>
也就是说【每个*自动生成的序号】是key,【name hb age 20】是listpack结构存储的value。
问题1:对于<每个listpack中可能存储多条消息>不理解,既然一条消息是一个ID,而且消息存储是key-value对。那么一个listpack应该存储的是一条具体消息内容吧?也就是value。一个listpack里面应该是有多个field,一个流有多个listpack吧。 问题2:这句话的意思是不是entry只存储field也就是name和age。

<每个listpack在创建时,会构造该节点的master entry(根据第一个插入的消息构建)>
问题3:这句话的意思也应该是listpack会存储多个消息也就是多个ID的具体消息吧

<每个消息会占用多个listpack entry>
问题4:综上所述,是不是说key存储在rax前缀树里,而所有的类似name,age的key-value对存储在listpack里,listpack有多个entry,比如一个消息ID是4567的消息有两个key-value对,每个value占一个entry?

问题5:消息的值也就是【name-hb】中的hb是存储在什么地方,是entry里面吗?因为我认为master ertry存储的公共field。

希望各位前辈能给我解答一下,谢谢。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

是不是这么一个意思:就是listpack从放入消息的那一刻就存在了
然后由于一致性,首先创建master entry 包括很多字段都是entry
而真正的内容比如 name=hb 中的hb也是按照符合master entry 的field域的存储方式继续放在master entry的这些entry之后的,然后就形成了一个list形式的结构。
如果有多个消息的话,还是继续追加在后面。

个人理解,不知道对不对。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...