我想在redis中存储包含以下字段的数千条记录:
User_id: int64;
latitude: float;
longitude: float;
age: int32;
height: int32
以后我想检索接近(lat:x,lng:y)的所有user_id
人,年龄 30到40
是否可以使用redis执行此操作?那么可以允许这个的memory database
列表是什么?
答案 0 :(得分:1)
我希望版主不要因为这个答案而叮嘱我,因为它直接回答了问题“......可以允许这样做的内存数据库列表”
您可以考虑我公司的数据库系统eXtremeDB。请注意,与redis不同,它不是开源或NoSQL。它是一个内存中的结构化数据DBMS; SQL是可选的。
答案 1 :(得分:1)
如果你使用http://redisearch.io
,有一种方法可以有效,轻松地使用Redis免责声明:我为开发RediSearch的Redis Labs工作。
如果你有东西设置,你可以做类似的事情:
127.0.0.1:6379> FT.CREATE myidx SCHEMA coord GEO age NUMERIC height NUMERIC
OK
127.0.0.1:6379> FT.ADD myidx 123 0 FIELDS coord 0,0 age 30 height 40
OK
127.0.0.1:6379> FT.ADD myidx 456 0 FIELDS coord 0.1,0.1 age 30 height 40
OK
127.0.0.1:6379> FT.ADD myidx 789 0 FIELDS coord 0.1,0.1 age 64 height 64
OK
127.0.0.1:6379> FT.ADD myidx 9999 0 FIELDS coord -50,50 age 30 height 40
OK
127.0.0.1:6379> FT.ADD myidx 1000 0 FIELDS coord -50,50 age 64 height 64
OK
127.0.0.1:6379> FT.SEARCH myidx "@coord:[0 0 1 km]"
1) (integer) 1
2) "123"
3) 1) "coord"
2) "0,0"
3) "age"
4) "30"
5) "height"
6) "40"
127.0.0.1:6379> FT.SEARCH myidx "@coord:[0 0 100 km]"
1) (integer) 3
2) "789"
3) 1) "coord"
2) "0.1,0.1"
3) "age"
4) "64"
5) "height"
6) "64"
4) "456"
5) 1) "coord"
2) "0.1,0.1"
3) "age"
4) "30"
5) "height"
6) "40"
6) "123"
7) 1) "coord"
2) "0,0"
3) "age"
4) "30"
5) "height"
6) "40"
127.0.0.1:6379> FT.SEARCH myidx "@coord:[0 0 100 km] @age:[30 40]"
1) (integer) 2
2) "456"
3) 1) "coord"
2) "0.1,0.1"
3) "age"
4) "30"
5) "height"
6) "40"
4) "123"
5) 1) "coord"
2) "0,0"
3) "age"
4) "30"
5) "height"
6) "40"
答案 2 :(得分:0)
你可以通过Redis实现这一目标。 SORTED SET
和GEO
命令。
构建索引:
使用GEO
命令构建位置索引:GEOADD location lng1 lat1 uid1 lng2 lat2 uid2
使用SORTED SET
命令构建年龄索引:ZADD age 31 uid1 20 uid2
搜索:强>
GEORADIUS location lng lat 100 m store location_result
ZINTERSTORE location_age_result 2 location_result age WEIGHTS 0 1
ZRANGEBYSCORE location_age_result 30 40
注意:强>
使用ZINTERSTORE
命令时,我们使用WEIGHTS
选项仅将年龄保留为新设置的分数。