PostgreSQL-gis Redis-geo BuntDB 性能比拼
网上关于 redis geo pg 和 buntdb 的比较太少了,所以自己比较并记录一下。
听说 postgresql 中的 postGIS 在处理经纬度方面速率很快(gist 内部使用的是搜索树,geo 内部使用的是 geohash),所以比较一下,看看 8w 数据量的情况下,哪个快一点。
PostgreSQL(pg)搭建
pg 添加 postGIS 扩展(postGIS 扩展很强大,建议深入学习):
create extension postgis;
附:Mac 安装 PostGIS 流程:link
pg 创建测试表:
postgres=# create table gis_idx_test(id int, info text, pos geometry) with (autovacuum_enabled=off,toast.autovacuum_enabled=off);
pg 创建索引(使用 gist 的原因是:gist 比 RTree 更强大,虽然插入数据慢,但是检索数据快,适合存储空间的数据):
create index idx_gis_idx_test on gis_idx_test using gist (pos);

插入数据(我这里使用的是 gorm 插入数据,因为 gorm 不支持 geometry 数据格式,所以只能裸写 sql 了_; 尴尬):
func InsertPostgresWithIdAndValue(id int, longitude, latitude float64) {
// ST_GeomFromText('POINT(%f %f)', 4326)) 格式化为经纬度的
// pg 是先精度 后纬度 eg:ST_GeomFromText('POINT(120 19) 表示经度120 纬度 19
// INSERT INTO gis_idx_test (id, pos) VALUES (234, ST_GeomFromText('POINT(115 -7.3)', 4326));
str := fmt.Sprintf("INSERT INTO gis_idx_test (id, pos) VALUES (%d, ST_GeomFromText('POINT(%f %f)', 4326))", id, longitude, latitude)
db.Exec(str)
}
共 85318 条数据,其实算是比较少了。
pg redis buntdb 性能比较(单条命令时间查询)
pg 查询
SELECT * FROM gis_idx_test WHERE ST_DWithin(pos :: geography, ST_GeomFromText ( 'POINT(112 -7)', 4326 ) :: geography, 200000) IS TRUE;
使用explain (analyze,buffers)即可查看 pg 查询时间

redis 设置 slowlog 并查询时间
redis查询命令:georadius outlet 112 -7 200 km withdist

明显可以看出查询单次数据,redis 的性能是要远高于 pg 的,大概差距为 5 倍(101ms&19.2ms)。

本文对比了PostgreSQL(带GIS扩展)、Redis(带Geo索引)和BuntDB在地理数据查询性能方面的表现。通过单条命令查询时间、wrk压测QPS及系统资源占用分析,发现Redis在速度上领先,但PostgreSQL在数据准确性上有优势。BuntDB在特定场景下速度优于Redis,且支持并发执行。结论指出,针对地理位置处理,内存型数据库通常优于持久化数据库,但需权衡数据量和性能。

325

被折叠的 条评论
为什么被折叠?



