Aerospike DB - lists/maps 适用于大尺寸、高写入负载?
Aerospike DB - lists/maps suitable at large sizes, under high write load?
概览
Aerospike list/map 通过 UDF 进行的操作是写时复制(一次修改会导致整个重写)。因此,随着 list/map 大小的增长,基于 UDF 的追加变得越来越昂贵。
UDF 列表操作,测试结果
Time required to append 100 values to a list (each append persisted to disk independently)
Time measured at the Java client
Each result is the average of 10 measurements.
Initial list size = 1 -> 19.6ms
Initial list size = 1000 -> 43.4ms
Initial list size = 10000 -> 237.3ms
问题
在高写入负载下,lists/maps 在单个记录中是否可取(1000 的值,总共约 200kB)大小?
单记录 lists/maps 可以通过 本机客户端 API 有效地操作。
问题中的测试结果是基于使用 UDF 的,因为 UDF 会产生开销(并且可能无法在内存中本地修改?),所以速度较慢。
根据 Ronen 的建议,我更新了我的 client/server 以获取新列表 API 并使用 com.aerospike.client.cdt.ListOperation
编写了一个新测试。无论列表大小,新测试的结果都非常快。
Aerospike 服务器版本 3.7.0 添加了对直接使用客户端操作列表的支持 API。查看您最喜欢的客户端语言的最新版本以获得支持(Java 3.1.8+、Go 1.9.0+、C 3.1.25+)。此类操作地图的功能将随之而来。
通过原生 API 修改列表比通过 UDF 更有效。首先,无需支付 UDF 执行的开销。如果数据在内存中,列表将以一种非常有效地执行增量操作的格式保存在内存中。它可以轻松承受重 read/write 负载,延迟更短。然而,您应该始终针对您的工作量进行基准测试。
概览
Aerospike list/map 通过 UDF 进行的操作是写时复制(一次修改会导致整个重写)。因此,随着 list/map 大小的增长,基于 UDF 的追加变得越来越昂贵。
UDF 列表操作,测试结果
Time required to append 100 values to a list (each append persisted to disk independently)
Time measured at the Java client
Each result is the average of 10 measurements.
Initial list size = 1 -> 19.6ms
Initial list size = 1000 -> 43.4ms
Initial list size = 10000 -> 237.3ms
问题
在高写入负载下,lists/maps 在单个记录中是否可取(1000 的值,总共约 200kB)大小?
单记录 lists/maps 可以通过 本机客户端 API 有效地操作。
问题中的测试结果是基于使用 UDF 的,因为 UDF 会产生开销(并且可能无法在内存中本地修改?),所以速度较慢。
根据 Ronen 的建议,我更新了我的 client/server 以获取新列表 API 并使用 com.aerospike.client.cdt.ListOperation
编写了一个新测试。无论列表大小,新测试的结果都非常快。
Aerospike 服务器版本 3.7.0 添加了对直接使用客户端操作列表的支持 API。查看您最喜欢的客户端语言的最新版本以获得支持(Java 3.1.8+、Go 1.9.0+、C 3.1.25+)。此类操作地图的功能将随之而来。
通过原生 API 修改列表比通过 UDF 更有效。首先,无需支付 UDF 执行的开销。如果数据在内存中,列表将以一种非常有效地执行增量操作的格式保存在内存中。它可以轻松承受重 read/write 负载,延迟更短。然而,您应该始终针对您的工作量进行基准测试。