PostgreSQL-gis Redis-geo BuntDB 性能比拼

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值