作者回复: 赞 实践的态度!
作者回复: 学习的很仔细! 《Redis设计与实现》这本书分析的代码是Redis3.0的源码,在Redis3.0.4源码中,SDS结构体里还是用的free表示未使用空间。 但是应该差不多是Redis3.2.0开始,SDS结构体开始使用alloc字段了。
作者回复: 这是个好问题。 其实这个图片ID和存储对象ID对应关系的存储,就是用在分布式存储系统中的一个小的元数据服务,访问模式也比较简单,key-value的PUT、GET就行,但是要求请求响应快。Redis很轻量级,而且速度也快,所以用的Redis。 MySQL用在这个场景中显得有些太重了,这个场景里面没有关系模型,也没有事务需求和复杂查询,上MySQL不太需要。图片数量再增加时,MySQL的表就太大了,插入效率会降低。
作者回复: dictEntry是Redis全局哈希表中的表项,包含了key和value的指针,这里的value可以是String,List,Hash等数据类型。 你说的hash结构最外层的key,如果是指全局哈希表中的key的话,指向key的指针是已经包含在dictEntry这个结构中了,同时key本身的数据结构是RedisObject。
作者回复: 其实,在Redis的设计和使用上,是一个典型的“系统”思维,也就是权衡(trade-off),根据自己的业务场景、数据量、访问特征,来进行选择。 我们自己做系统研发,这是个核心思想 :)
作者回复: 我们是会把图片 ID 的前7位作为键值对的key,Hash集合是键值对的value,在你举的例子中,图片ID 1101000060和1101001060。它们的前7位分别是1101000和1101001,对应了两个键值对。所以,它们图片ID的后3位虽然相同,都是060,也是在两个Hash集合中的,不会冲突的。 你看看是不是呢?
作者回复: 一个数据库可以粗略分成访问接口和底层存储,从访问接口来看,NoSQL和RDBMS还是有区别的,RDBMS是SQL接口,NoSQL是PUT/GET/DELETE/SCAN。但是从底层存储来看,一些NoSQL的存储机制开始被RDBMS采用,例如MySQL就使用RocksDB作为底层的存储引擎,叫做MyRocks。
作者回复: 这里的prev_len取值情况是指用几个字节来表示prev_len。 prev_len是表示前一个entry的长度,如果前一个entry的长度小于254字节,那么prev_len就用1个字节来表示。否则的话,prev_len就使用5个字节表示。