Redis-Geo学习

10/10/2021 SpringRedis

附近的人功能实现

本章代码位置https://github.com/remember-5/spring-boot-demo/tree/master/demo-redis

# 新建项目

新建一个项目,加入spring-data-redis模块

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

修改配置文件

spring:
  application:
    name: spring-boot-demo-jedis
  redis:
#    sentinel:
#      master: #master节点
#      nodes: # 地址
    host: 127.0.0.1
    port: 6379
    password: 
    database: 1 # Redis默认情况下有16个分片,这里配置具体使用的分片
    lettuce:
      pool:
        min-idle: 8  # 连接池中的最小空闲连接 默认 0
        max-idle: 10 # 连接池中的最大空闲连接 默认 8
        max-active: 8 # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-wait: -1ms  # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
    timeout: 10000ms # 连接超时时间(记得添加单位,Duration)
  cache:
    # 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配
    type: redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

序列化redisTemplate,创建RedisConfig

@Configuration
public class RedisConfig {


    @Bean(name = "redisTemplate")
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        //序列化
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        // value值的序列化采用fastJsonRedisSerializer
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        // 全局开启AutoType,这里方便开发,使用全局的方式
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        // 建议使用这种方式,小范围指定白名单
        // ParserConfig.getGlobalInstance().addAccept("com.xxx.xxx");
        // key的序列化采用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setConnectionFactory(factory);
        return template;

    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

创建GeoHashData

@Data
@Builder
@AllArgsConstructor
public class GeoHashData {
    /**
     * redis的key
     */
    private String key;

    /**
     * 经度 x
     */
    private Double longitude;


    /**
     * 纬度 y
     */
    private Double latitude;

    /**
     * 存储的内容
     */
    private String member;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

添加service层,创建GeoHashService


@Slf4j
@Component
@RequiredArgsConstructor
public class GeoHashService {
    private final RedisTemplate<Object, Object> redisTemplate;
    private final static String KEY = "home:geo";
}
1
2
3
4
5
6
7
8

首先测试添加数据

public void saveGeoHash() {
        ArrayList<GeoHashData> geoHashData = new ArrayList<>();
        geoHashData.add(new GeoHashData(KEY, 121.686009, 31.200382, "金宇别墅"));
        geoHashData.add(new GeoHashData(KEY, 121.271036, 31.339226, "永胜公寓"));
        geoHashData.add(new GeoHashData(KEY, 121.437856, 31.222863, "江苏路500"));
        geoHashData.add(new GeoHashData(KEY, 121.947222, 30.903604, "滴水湖"));

        for (GeoHashData data : geoHashData) {
            Long aLong = redisTemplate.opsForGeo().add(data.getKey(), new Point(data.getLongitude(), data.getLatitude()), data.getMember());
            log.info("添加数据 {}", aLong);
        }
    }
1
2
3
4
5
6
7
8
9
10
11
12
Last Updated: 11/5/2021, 2:56:50 PM
我再没见过 像你一般的星空
Seto