我正在使用 Aerospike 3.40。带有浮点值的 bin 不会出现。我正在使用python客户端。请帮忙。
3 回答
Aerospike 3.6 版本现在支持它
服务器本身不支持浮点数。它支持整数、字符串、字节、列表和映射。不同的客户端以不同的方式处理不支持的类型。例如,PHP 客户端将序列化其他类型(如 boolean 和 float)并将它们存储在字节字段中,然后在读取时反序列化它们。Python 客户端将从下一个版本 (>= 1.0.38) 开始执行此操作。
但是,这种方法的局限性在于使不同的客户端(例如 PHP 和 Python)难以读取此类序列化数据,因为它没有使用通用格式进行序列化。
使用浮点数解决此问题的一种常见方法是将它们转换为整数。例如,如果您有一个名为“货币”的 bin,您可以将浮点数乘以 100,去掉尾数,并将其存储为整数。在出路时,您只需除以 100。类似的方法是将有效数字存储在一个 bin 中,将尾数存储在另一个 bin 中,它们都是整数类型,并在读取时重新组合它们。所以 123.456789 被存储为 v_sig 和 v_mantissa。
(v_sig, v_mantissa) = str(123.456789).split('.')
在阅读时,您会将两者结合起来
v = float(v_sig)+float("0."+str(v_mantissa))
仅供参考,现在在 aerospike 服务器版本 >= 3.6.0上原生支持浮点数作为双精度数。大多数客户端,例如Python和 PHP 都支持将浮点数转换为 as_double。
浮点数可以分为两部分,小数点之前和小数点之后,并将它们存储在两个 bin 中并在应用程序代码中利用它们。
但是,在 Aerospike 中创建更多数量的 bin 会产生性能开销,因为每个 bin 将使用一个新的 malloc。
如果从 Python 切换到任何其他语言不是用例,最好使用更好的序列化机制并将其保存在单个 bin 中。这意味着每个浮点数只使用一个 bin,并且还会减少 Aerospike 中的数据大小。Aerospike 中较少的数据量总是有助于提高网络 I/O 的速度,这是缓存的主要目标。