Skip to content
Open
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package org.programmers.signalbuddyfinal.domain.trafficSignal.dto;

import com.google.auto.value.extension.serializable.SerializableAutoValue;
import lombok.*;
import org.locationtech.jts.geom.Point;
import org.programmers.signalbuddyfinal.domain.trafficSignal.entity.TrafficSignal;
import org.programmers.signalbuddyfinal.global.util.PointUtils;

@Getter
@Builder
@SerializableAutoValue
@AllArgsConstructor
@NoArgsConstructor
public class TrafficResponse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.programmers.signalbuddyfinal.domain.trafficSignal.dto.TrafficResponse;
import org.springframework.data.geo.Circle;
Expand All @@ -26,7 +24,7 @@
public class TrafficRedisRepository {

private final RedisTemplate<Object, Object> redisTemplate;
private final HashOperations<Object, Object, Map<String,String>> hashOperations;
private final HashOperations<Object, Object, TrafficResponse> hashOperations;
private final GeoOperations<Object,Object> geoOperations;

private static final String KEY_HASH = "traffic:info";
Expand All @@ -39,6 +37,10 @@ public TrafficRedisRepository(RedisTemplate<Object,Object> redisTemplate){
this.geoOperations = redisTemplate.opsForGeo();
}

public boolean isExist(){
return hashOperations.hasKey(KEY_HASH, KEY_GEO);
}

public void save(TrafficResponse trafficResponse) {
Long trafficId = trafficResponse.getTrafficSignalId();

Expand All @@ -50,13 +52,7 @@ public void save(TrafficResponse trafficResponse) {
);

// HASH 데이터 저장
Map<String, String> trafficData = new HashMap<>();
trafficData.put("serialNumber", String.valueOf(trafficResponse.getSerialNumber()));
trafficData.put("district", trafficResponse.getDistrict());
trafficData.put("signalType", trafficResponse.getSignalType());
trafficData.put("address", trafficResponse.getAddress());

hashOperations.put(KEY_HASH, trafficId.toString(), trafficData);
hashOperations.put(KEY_HASH, trafficId.toString(), trafficResponse);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redis에 Hash 구조로 저장된 데이터를 삭제할 때, 관련 데이터가 전부 삭제되는 것을 확인하셨을까요?

그리고 ValueOperations 를 사용하시면 객체가 통째로 직렬화가 되어 저장됩니다. 역직렬화도 마찬가지로 가능합니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

삭제할 때가 TTL이 모두 소진됐을 때를 말씀하시는거 맞죠? 그럼 삭제는 잘 됩니다!
ValueOperations 그래서 쓰는거군여..! 저도 그럼 코드 변경해볼게요! 감사합니다 ㅎㅎ


// GEO와 HASH 모두에 TTL 설정
redisTemplate.expire(KEY_GEO, TTL);
Expand Down Expand Up @@ -110,7 +106,7 @@ public TrafficResponse findById(Long id) {

String trafficId = String.valueOf(id);

Map<String, String> data = hashOperations.get(KEY_HASH, trafficId);
TrafficResponse data = hashOperations.get(KEY_HASH, trafficId);

if (data == null) {
log.info("redis에 데이터 없음");
Expand All @@ -131,10 +127,10 @@ public TrafficResponse findById(Long id) {

return TrafficResponse.builder()
.trafficSignalId(id)
.serialNumber(Long.valueOf(data.get("serialNumber")))
.district(data.get("district"))
.signalType(data.get("signalType"))
.address(data.get("address"))
.serialNumber(data.getSerialNumber())
.district(data.getDistrict())
.signalType(data.getSignalType())
.address(data.getAddress())
.lat(savedLat)
.lng(savedLng)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@
import org.programmers.signalbuddyfinal.domain.trafficSignal.repository.CustomTrafficRepositoryImpl;
import org.programmers.signalbuddyfinal.domain.trafficSignal.repository.TrafficRepository;
import org.programmers.signalbuddyfinal.global.exception.BusinessException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.programmers.signalbuddyfinal.domain.trafficSignal.repository.TrafficRedisRepository;

import java.util.ArrayList;
import java.util.List;

@Slf4j
Expand All @@ -27,32 +25,29 @@ public class TrafficService {
private final CustomTrafficRepositoryImpl customTrafficRepository;
private final TrafficRedisRepository trafficRedisRepository;
private final TrafficRepository trafficRepository;
private final RedisTemplate<Object, Object> redisTemplate;

public List<TrafficResponse> searchAndSaveTraffic(Double lat, Double lng, int radius){

log.debug("주변 보행등 정보 - lat = {}, lng = {}, radius = {}", lat, lng, radius);
List<TrafficResponse> responseDB;

boolean exists = Boolean.TRUE.equals(redisTemplate.hasKey(TRAFFIC_REDIS_KEY));

if (exists) {
if (trafficRedisRepository.isExist()) {
double kiloRadius = (double) radius/1000;
List<TrafficResponse> responseRedis = trafficRedisRepository.findNearbyTraffics(lat, lng, kiloRadius);

log.info("redis 주변 보행등 데이터 : redis data 갯수 = {} ", responseRedis.size());
log.debug("redis 주변 보행등 데이터 : redis data 갯수 = {} ", responseRedis.size());
return responseRedis;
}

try {
responseDB = customTrafficRepository.findNearestTraffics(lat, lng, radius);

log.info("주변 보행등 정보 캐싱 : DB data 갯수 = {} ", responseDB.size());
log.debug("주변 보행등 정보 캐싱 : DB data 갯수 = {} ", responseDB.size());
for (TrafficResponse response : responseDB) {
trafficRedisRepository.save(response);
}

log.info("DB 주변 보행등 데이터 캐싱 성공");
log.debug("DB 주변 보행등 데이터 캐싱 성공");
return responseDB;

} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public class TrafficRedisRepositoryTest {

@BeforeEach
void setUp() {

when(redisTemplate.opsForHash()).thenReturn(hashOperations);
when(redisTemplate.opsForGeo()).thenReturn(geoOperations);

Expand Down Expand Up @@ -96,13 +97,7 @@ void trafficSaveTest(){
eq( String.valueOf(id) )
);

Map<String, String> expectedTrafficData = new HashMap<>();
expectedTrafficData.put("serialNumber", expected.get(0).getSerialNumber().toString());
expectedTrafficData.put("district", expected.get(0).getDistrict());
expectedTrafficData.put("signalType", expected.get(0).getSignalType());
expectedTrafficData.put("address", expected.get(0).getAddress());

verify(hashOperations).put(eq(KEY_HASH), eq(id.toString()), eq(expectedTrafficData));
verify(hashOperations).put(eq(KEY_HASH), eq(id.toString()), eq(expected.get(0)));
verify(redisTemplate).expire(KEY_GEO, TTL);
verify(redisTemplate).expire(KEY_HASH, TTL);
}
Expand Down Expand Up @@ -132,13 +127,9 @@ void trafficNearByTestReturnTrafficList(){

when(geoOperations.position(KEY_GEO, id.toString())).thenReturn(List.of(point));

Map<String, String> expectedTrafficData = new HashMap<>();
expectedTrafficData.put("serialNumber", expected.get(0).getSerialNumber().toString());
expectedTrafficData.put("district", expected.get(0).getDistrict());
expectedTrafficData.put("signalType", expected.get(0).getSignalType());
expectedTrafficData.put("address", expected.get(0).getAddress());

doReturn(expectedTrafficData).when(hashOperations).get(eq(KEY_HASH), eq(id.toString()));

doReturn(expected.get(0)).when(hashOperations).get(eq(KEY_HASH), eq(id.toString()));

//When
trafficRedisRepository.save(expected.get(0));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ void testSearchAndSaveTrafficRedisExists() {

// Given
when(trafficRedisRepository.findNearbyTraffics(lat, lng, 1.0)).thenReturn(expected);
when(redisTemplate.hasKey(TRAFFIC_REDIS_KEY)).thenReturn(true);
when(trafficRedisRepository.isExist()).thenReturn(true);

// When
List<TrafficResponse> result = trafficService.searchAndSaveTraffic(lat, lng, 1000);
Expand Down