swoole_table->__construct

创建内存表。

swoole_table->__construct(int $size, float $conflict_proportion = 0.2)
  • $size参数指定表格的最大行数,如果$size不是为2的N次方,如10248192,65536等,底层会自动调整为接近的一个数字,如果小于1024则默认成1024,即1024是最小值
  • table占用的内存总数为 (结构体长度 + KEY长度64字节 + 行尺寸$size) * (1.2预留20%作为hash冲突) * (列尺寸),如果机器内存不足table会创建失败
  • set操作能存储的最大行数与$size正相关,但不完全一致,如$size为1024实际可存储的行数小于1024

swoole_table基于行锁,所以单次set/get/del在多线程/多进程的环境下是安全的
set/get/del是原子操作,用户代码中不需要担心数据加锁和同步的问题

容量计算

Table底层是建立在共享内存之上的HashTable数据结构。$size最大行数,决定了HashTable的总行数。由于Table是在共享内存之上,所以无法动态扩容。这个$size必须在创建前设置好。

Table能存储的总数据行数,取决于数据的Key冲突率。如果冲突率超过20%,预留的hash冲突内存块容量不足,就会报Unable to allocate memory错误,并返回false,存储失败。


  • 丰灵

    这里的size有问题啊,我设置了size为10的话 在插入第五行数据过后就会出现 Unable to allocate memory 这个错误,如果设置为20行的话 在第11行插入过后就会出现错误,求指教!!

  • 小宇

    我测试时候也发现这个size不对,当我设为200000时,最多只能加42048条记录,超过就会提示Warning: swoole_table::set(): Unable to allocate memory,麻烦开发人员看看怎么回事。

  • 周振忠

    必须为2的指数

  • 屏风山下的猎人

    swoole_table的生命周期是不是随着进程的存在而存在?

  • 吾爱

    指定了size无效啊,设置的2 ,结果插了4条数据也能成功

  • .杉

    如果size小于1024则设置是无效的,意思就是底层已经强制默认了最小行数是1024 ~~~ if (rows_size >= 0x80000000) { rows_size = 0x80000000; } else { uint32_t i = 10; while ((1U

  • .杉

    所以说行数只能是1024,2048,4096依次递推,如果设置为1那么就是1024,如果是1025那么实际就是2048

  • killernb

    经测试$size应该是实际行数的3倍左右! 哪里不对么?!