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 倍&