zoukankan      html  css  js  c++  java
  • redis学习-sds数据类型

    今天开始了redis的学习,本来想直接从源码看起的,不过看到有篇对redis介绍的基础教程 Redis 设计与实现(第一版)》

    于是决定从这个开始入门。

    1.数据类型定义

    typedef char *sds;
    
    
    struct sdshdr {
    
        // buf 已占用长度
        int len;
    
        // buf 剩余可用长度
        int free;
    
        // 实际保存字符串数据的地方
        char buf[];
    };

    2.重新计算新的长度
    newlen = sdshdr.len + required_len

    if newlen < SDS_MAX_PREALLOC:
            newlen *= 2
        else:
            newlen += SDS_MAX_PREALLOC

    3. 关于这种分配策略会浪费内存吗?
    执行 APPEND 命令的字符串键数量通常并不多, 占用内存的体积通常也不大, 所以这一般并不算什么问题
    如果执行 APPEND 操作的键很多, 而字符串的体积又很大的话, 那可能就需要修改 Redis 服务器, 让它定时释放一些字符串键的预分配空间, 从而更有效地使用内存。


    小结

    • Redis 的字符串表示为 sds ,而不是 C 字符串(以  结尾的 char*)。
    • 对比 C 字符串, sds 有以下特性:
      • 可以高效地执行长度计算(strlen);
      • 可以高效地执行追加操作(append);
      • 二进制安全;
    • sds 会为追加操作进行优化:加快追加操作的速度,并降低内存分配的次数,代价是多占用了一些内存,而且这些内存不会被主动释放。


  • 相关阅读:
    分布式数据库中间件Mycat百亿级数据存储(转)
    大文本字符串滤重的解决方案(转)
    java处理大文本2G以上
    Mysql binlog详解
    varnish squid nginx比较
    java运行时内存分类
    redis rdb aof比较
    LeetCode 94 ——二叉树的中序遍历
    线性代数之——向量空间
    线性代数之——A 的 LU 分解
  • 原文地址:https://www.cnblogs.com/hanframe/p/4055139.html
Copyright © 2011-2022 走看看