Redis实战:黑马点评之附近商户
注:关于GEO的知识笔者整理到了另一篇文章中:【Redis】Redis高级:GEO&BitMap&HyperLogLog,这里只讲解相关代码的编写
1 导入店铺数据到GEO
当我们在点击任意一种商户分类(比如美食)之后,就会出现一系列的商家,用户可以按照多种排序方式对商家进行排序,而我们此时需要完成的功能是按照距离进行排序,这时就需要使用GEO数据类型
前端发起查询时,会发送商户类型、页码、当前用户的经度和维度四个参数,我们只需要以该经纬度为圆心,分页查询出一定范围内指定类型的商户信息然后即可,geo会自动帮我们完成排序
这里geo的key中需要携带上商户的分类信息,因为前端发起的查询指定商户的类型,而geo中又没有办法保存相应的类型信息,因此最好将商户的类型设计到geo的key中,按类型分别来保存geo
为了尽量节省内存空间,geo的member我们只需要保存商户id即可。
首先我们需要做的事,就是将所有商户的位置信息保存在redis中,这里我们可以通过一个测试类来完成:
@Test
public void loadShopData(){
//从数据库中查询出所有商户信息
List<Shop> shopList = shopService.list();
//以商户类型分类,将商户信息保存在map中
Map<Long, List<Shop>> shopMap = shopList.stream().collect(Collectors.groupingBy(Shop::getTypeId));
//分批写入redis
for (Map.Entry<Long, List<Shop>> shopEntry : shopMap.entrySet()) {
//组装key
String key = RedisConstants.SHOP_GEO_KEY + shopEntry.getKey();
//获取特定类型的商户的集合
List<Shop> value = shopEntry.getValue();
//新建一个地理信息集合中
List<RedisGeoCommands.GeoLocation<String>> locations = new ArrayList<>(value.size());
//遍历并插入
for (Shop shop : value) {
//将商户的信息插入到地理信息集合中
locations.add(
new RedisGeoCommands.GeoLocation(
shop.getId