zoukankan      html  css  js  c++  java
  • sds(简单动态字符串) 内存预分配优化策略



    在眼下版本号的 Redis 中, SDS_MAX_PREALLOC 的值为 1024 * 1024 , 也就是说。 当大小小于 1MB 的字符串运行追加操作时,sdsMakeRoomFor 就为它们分配多于所需大小一倍的空间; 当字符串的大小大于 1MB 。 那么 sdsMakeRoomFor 就为它们额外多分配 1MB 的空间。

    运行过 APPEND 命令的字符串会带有额外的预分配空间。 这些预分配空间不会被释放。 除非该字符串所相应的键被删除, 或者等到关闭 Redis 之后, 再次启动时又一次加载的字符串对象将不会有预分配空间。

    由于运行 APPEND 命令的字符串键数量通常并不多, 占用内存的体积通常也不大。 所以这一般并不算什么问题。

    还有一方面。 假设运行 APPEND 操作的键非常多。 而字符串的体积又非常大的话, 那可能就须要改动 Redis server。 让它定时释放一些字符串键的预分配空间。 从而更有效地使用内存。

    小结

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


  • 相关阅读:
    大数据时代-散记
    MongoDB命令行操作
    easyui获取日期datebox中的值
    linux文件系统学习
    Linux中部署JAVA程序
    百度Clouda的初步探索
    global.asax?app.config?webconfig??
    Android adb install INSTALL_FAILED_DEXOPT
    Android SharedPreferences 权限设置
    vim 支持 markdown 语法
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6741800.html
Copyright © 2011-2022 走看看