使用Redis存储和查询字段

时间:2018-04-17 10:10:11

标签: database indexing redis sphinx in-memory-database

我想在redis中存储包含以下字段的数千条记录:

User_id: int64;
latitude: float;
longitude: float;
age: int32;
height: int32

以后我想检索接近(lat:x,lng:y)的所有user_id人,年龄 30到40

是否可以使用redis执行此操作?那么可以允许这个的memory database列表是什么?

3 个答案:

答案 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 SETGEO命令。

构建索引:

  1. 使用GEO命令构建位置索引:GEOADD location lng1 lat1 uid1 lng2 lat2 uid2

  2. 使用SORTED SET命令构建年龄索引:ZADD age 31 uid1 20 uid2

  3. 搜索:

    1. 按位置搜索,并将结果保存到临时设置:GEORADIUS location lng lat 100 m store location_result
    2. 获取临时集和年龄集的交集,并将结果保存到另一个临时集:ZINTERSTORE location_age_result 2 location_result age WEIGHTS 0 1
    3. 过滤满足年龄条件的用户:ZRANGEBYSCORE location_age_result 30 40
    4. 注意:

      使用ZINTERSTORE命令时,我们使用WEIGHTS选项仅将年龄保留为新设置的分数。