Skip to content

Commit

Permalink
[#135] Feat: Pin 전용 redisTemplate 분리
Browse files Browse the repository at this point in the history
  • Loading branch information
haeun-i committed Feb 29, 2024
1 parent 8e738a0 commit b986bb5
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 17 deletions.
6 changes: 3 additions & 3 deletions src/main/java/com/pcb/audy/domain/pin/service/PinService.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public PinSaveRes savePin(Long courseId, PinSaveReq pinSaveReq) {
String sequence = lexoRankUtil.getLexoRank(courseId, size);
PinRedisRes pinRedisRes =
PinServiceMapper.INSTANCE.toPinRedisRes(pinSaveReq, courseId, sequence);
redisProvider.set(getKey(courseId, pinRedisRes.getPinId()), pinRedisRes, PIN_EXPIRE_TIME);
redisProvider.setPin(getKey(courseId, pinRedisRes.getPinId()), pinRedisRes, PIN_EXPIRE_TIME);
return PinServiceMapper.INSTANCE.toPinSaveRes(pinRedisRes);
}

Expand All @@ -55,7 +55,7 @@ public PinOrderUpdateRes updatePinOrder(Long courseId, PinOrderUpdateReq pinOrde
.sequence(sequence)
.build();

redisProvider.set(key, updatedPinRedisRes, PIN_EXPIRE_TIME);
redisProvider.setPin(key, updatedPinRedisRes, PIN_EXPIRE_TIME);
return PinServiceMapper.INSTANCE.toPinOrderUpdateRes(pinOrderUpdateReq);
}

Expand All @@ -75,7 +75,7 @@ public PinNameUpdateRes updatePinName(Long courseId, PinNameUpdateReq pinNameUpd
.address(prevPin.getAddress())
.sequence(prevPin.getSequence())
.build();
redisProvider.set(key, updatedPin, PIN_EXPIRE_TIME);
redisProvider.setPin(key, updatedPin, PIN_EXPIRE_TIME);
return PinServiceMapper.INSTANCE.toPinNameUpdateRes(updatedPin);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.pcb.audy.domain.pin.dto.request.PinOrderUpdateReq;
import com.pcb.audy.domain.pin.dto.request.PinSaveReq;
import com.pcb.audy.domain.pin.dto.response.*;
import java.util.List;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
Expand All @@ -18,6 +19,10 @@ public interface PinServiceMapper {

PinSaveRes toPinSaveRes(PinRedisRes pinRedisRes);

PinGetRes toPinGetRes(PinRedisRes pinRedisRes);

List<PinGetRes> toPinGetResList(List<PinRedisRes> pinList);

PinNameUpdateRes toPinNameUpdateRes(PinRedisRes pinRedisRes);

PinOrderUpdateRes toPinOrderUpdateRes(PinOrderUpdateReq pinOrderUpdateReq);
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/pcb/audy/global/redis/RedisConfig.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.pcb.audy.global.redis;

import com.pcb.audy.domain.pin.dto.response.PinRedisRes;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down Expand Up @@ -30,4 +31,14 @@ public RedisTemplate<String, Object> redisTemplate() {
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return redisTemplate;
}

@Bean
public RedisTemplate<String, PinRedisRes> pinRedisTemplate(
RedisConnectionFactory connectionFactory) {
RedisTemplate<String, PinRedisRes> pinRedisTemplate = new RedisTemplate<>();
pinRedisTemplate.setConnectionFactory(connectionFactory);
pinRedisTemplate.setKeySerializer(new StringRedisSerializer());
pinRedisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(PinRedisRes.class));
return pinRedisTemplate;
}
}
17 changes: 17 additions & 0 deletions src/main/java/com/pcb/audy/global/redis/RedisProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,25 @@
@RequiredArgsConstructor
public class RedisProvider {
private final RedisTemplate<String, Object> redisTemplate;
private final RedisTemplate<String, PinRedisRes> redisPinTemplate;
private final long PIN_EXPIRE_TIME = Integer.MAX_VALUE;

public List<PinRedisRes> getPinsByPattern(String pattern) {
Set<String> keys = redisPinTemplate.keys(pattern);
if (CollectionUtils.isEmpty(keys)) {
return List.of();
}
return redisPinTemplate.opsForValue().multiGet(keys);
}

public void setPin(String key, PinRedisRes o, long expireTime) {
if (hasKey(key)) {
delete(key);
}
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(PinRedisRes.class));
redisTemplate.opsForValue().set(key, o, Duration.ofMillis(expireTime));
}

public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
Expand Down
18 changes: 5 additions & 13 deletions src/main/java/com/pcb/audy/global/util/LexoRankUtil.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.pcb.audy.global.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pravin.raha.lexorank4j.LexoRank;
import com.pcb.audy.domain.pin.dto.response.PinGetRes;
import com.pcb.audy.domain.pin.dto.response.PinRedisRes;
import com.pcb.audy.domain.pin.service.PinServiceMapper;
import com.pcb.audy.global.redis.RedisProvider;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand All @@ -18,7 +18,6 @@
public class LexoRankUtil {

private final RedisProvider redisProvider;
private final ObjectMapper objectMapper;

public String getLexoRank(Long courseId, int order) {
// 어떤 코스에(courseId), 몇 번째 순서에(order), 어떤 핀을 넣을 것인가(target)
Expand All @@ -43,19 +42,12 @@ public String getLexoRank(Long courseId, int order) {

public List<PinGetRes> sortByLexoRank(Long courseId) {
String pattern = courseId + ":*";
List<Object> redisData = redisProvider.getByPattern(pattern);
List<PinRedisRes> redisData = redisProvider.getPinsByPattern(pattern);

if (redisData == null) {
return List.of();
}

List<PinGetRes> pinResList = new ArrayList<>();
for (Object pin : redisData) {
PinGetRes pinRedisRes = objectMapper.convertValue(pin, PinGetRes.class);
pinResList.add(pinRedisRes);
}

Collections.sort(pinResList);
return pinResList;
Collections.sort(redisData);
return PinServiceMapper.INSTANCE.toPinGetResList(redisData);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class PinServiceTest implements PinTest {
// then
verify(redisProvider).get(any());
verify(objectMapper).convertValue(any(), eq(PinRedisRes.class));
verify(redisProvider).set(any(), any(), anyLong());
verify(redisProvider).setPin(any(), any(), anyLong());
assertThat(pinNameUpdateRes.getPinName()).isEqualTo(TEST_UPDATED_PIN_NAME);
}

Expand Down

0 comments on commit b986bb5

Please sign in to comment.