【问题标题】:Should Redis dynamic strings be unsigned int? why keep free instead of size?Redis 动态字符串应该是 unsigned int 吗?为什么保持免费而不是大小?
【发布时间】:2013-12-20 01:12:24
【问题描述】:

由于我正在从事的项目需要使用键值存储,因此我最近一直在研究键值存储(Memcached、Redis)。在细读 Redis 的特性和浏览源代码时,我注意到 Redis 有一个动态字符串类型(酷)。

struct {
    int len;
    int free;
    char buf[];
};

我以前使用过类似的方法,并且(高兴/好笑)看到类似的数据结构。但是有一些奇怪的行为。我对“免费”而不是“大小”语义以及值是 (int) 而不是 (unsigned int) 感到惊讶。

是否应该将元素 len 和 free 声明为 unsigned int?

什么会更好,一个成员 'free' 存储剩余空间,还是一个成员 'size' 存储总分配大小?

Redis 多久处理一次长于 (unsigned short int) 的字符串? (64k)?

【问题讨论】:

    标签: c redis


    【解决方案1】:

    我非常怀疑这是一个错误。我的猜测是,Salvatore 故意选择这个 (int) 是因为“内存优化/速度/避免强制转换”,以及实际上这个值不会超出范围的事实。可能字节序也是一个因素。

    Redis 更高级别的可变长度字符串类型绝对没有 64k 的限制。在某些情况下,我使用了超过 100MB(单键)的字符串。

    阅读docs:字符串值的最大长度为 512 MB。

    【讨论】:

    • 哇。 100MB 在单个密钥中。我的用例是很多小键。
    • 我可能会补充一点,这些是特殊情况,使用专用的 redis 服务器。当并发性能成为问题时,请始终注意SLOWLOG。我们将慢日志条目保持在最长 10 毫秒左右。
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2012-08-20
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多