1010import org .springframework .data .redis .core .*;
1111import org .springframework .stereotype .Repository ;
1212
13+ import java .time .LocalDateTime ;
1314import java .util .*;
1415import java .util .concurrent .TimeUnit ;
1516
@@ -20,15 +21,15 @@ public class ConcertRedisRepository {
2021 private final RedisTemplate <String , String > redisTemplate ;
2122 private final RedisTemplate <String , Object > objectRedisTemplate ;
2223
23- private static final String LOCK_FLAG_PREFIX = "initLoad: " ;
24+ private static final String LOCK_FLAG_PREFIX = "initLoad:" ;
2425
25- private static final String CONCERT_DETAIL_PREFIX = "concertDetail: " ;
26+ private static final String CONCERT_DETAIL_PREFIX = "concertDetail:" ;
2627
27- private static final String CONCERT_LIST_PREFIX = "concertList: " ;
28+ private static final String CONCERT_LIST_PREFIX = "concertList:" ;
2829
29- private static final String VIEW_COUNT_MAP = "viewCountMap " ;
30+ private static final String CONCERTS_COUNT_PREFIX = "totalConcertsCount: " ;
3031
31- private static final String CONCERTS_COUNT_PREFIX = "totalConcertsCount: " ;
32+ private static final String CONCERTS_VIEW_COUNTS = "concertsViewCount " ;
3233
3334 private static final int HOUR = 3600 ;
3435
@@ -50,7 +51,7 @@ public void unlockSave(String key) {
5051 }
5152
5253 // 공연 목록 캐싱
53- public void listSave (ListSort sort , Pageable pageable , List <ConcertItem > list ) {
54+ public void saveConcertsList (ListSort sort , Pageable pageable , List <ConcertItem > list ) {
5455 String key = CONCERT_LIST_PREFIX + sort .name () + pageable .getPageNumber ();
5556 objectRedisTemplate .opsForValue ().set (key , list , HOUR , TimeUnit .SECONDS );
5657 }
@@ -70,64 +71,70 @@ public void deleteAllConcertsList() {
7071 }
7172
7273 // 공연 상세 캐싱
73- public void detailSave ( long concertId , ConcertDetailResponse concertDetailResponse ) {
74+ public void saveConcertDetail ( Long concertId , ConcertDetailResponse concertDetailResponse ) {
7475 objectRedisTemplate .opsForValue ().set (
7576 CONCERT_DETAIL_PREFIX + concertId ,
7677 concertDetailResponse ,
77- HOUR ,
78- TimeUnit .SECONDS
78+ 2 ,
79+ TimeUnit .DAYS
7980 );
81+ redisTemplate .opsForHash ().put (CONCERTS_VIEW_COUNTS , concertId .toString (), concertDetailResponse .getViewCount () + "" );
82+ }
83+
84+ // 공연 정보 가져오기
85+ public ConcertDetailResponse getCachedConcertDetail (Long concertId ) {
86+ ConcertDetailResponse concertDetailResponse = getConcertDetailResponse (concertId );
87+ if (concertDetailResponse == null ) return null ;
88+ return concertDetailResponse ;
8089 }
8190
82- // todo : 객체 일부의 값만 바뀌는거니 해당 값만 바꿔서 저장하거나 Redis 내부의 값만 갱신할 수 있는 방법 찾기
83- public ConcertDetailResponse getDetail (long concertId ) {
91+ private ConcertDetailResponse getConcertDetailResponse (long concertId ) {
8492 ConcertDetailResponse concertDetailResponse = (ConcertDetailResponse ) objectRedisTemplate .opsForValue ().get (CONCERT_DETAIL_PREFIX + concertId );
8593 if (concertDetailResponse == null ) return null ;
86- int viewCount = concertDetailResponse .getViewCount ();
87- viewCountSet (concertId , viewCount + 1 );
88- concertDetailResponse .setViewCount (viewCount + 1 );
89- detailSave (concertId , concertDetailResponse );
9094 return concertDetailResponse ;
9195 }
9296
9397 // 공연 상세 삭제
94- public void deleteDetail (String concertId ) {
98+ public void deleteConcertDetail (String concertId ) {
9599 redisTemplate .delete (CONCERT_DETAIL_PREFIX + concertId );
96100 }
97101
98102 // 모든 공연 상세 삭제
99- public void deleteAllConcertDetail () {
103+ public void deleteAllCachedConcertDetail () {
100104 deleteAllItemsByPREFIX (CONCERT_DETAIL_PREFIX );
101105 }
102106
103- // 조회수 처리 -> 좀 지저분한데 개선 여지 찾아보기
104- public int viewCountSet (long concertId , int viewCount ) {
105- Map <String , Integer > rawMap = (Map <String , Integer >) objectRedisTemplate .opsForValue ().get (VIEW_COUNT_MAP );
106-
107- if (rawMap == null ) {
108- Map <Long , Integer > viewCountMap = new HashMap <>();
109- viewCountMap .put (concertId , viewCount );
110- objectRedisTemplate .opsForValue ().set (VIEW_COUNT_MAP , viewCountMap );
111- } else {
112- Map <Long , Integer > viewCountMap = convertViewCountMap (rawMap );
113- viewCountMap .put (concertId , viewCount );
114- objectRedisTemplate .opsForValue ().set (VIEW_COUNT_MAP , viewCountMap );
115- log .info (viewCountMap .size () + "view count size." );
107+ // 모든 공연의 조회수 맵 조회 -> 하나의 해시를 기준으로 가져올 수 있게 처리
108+ public Map <Long , Integer > getCachedViewCountMap () {
109+ Map <Object , Object > rawMap = redisTemplate .opsForHash ().entries (CONCERTS_VIEW_COUNTS );
110+ Map <Long , Integer > viewCountMap = new HashMap <>();
111+ for (Map .Entry <Object , Object > rawEntity : rawMap .entrySet ()) {
112+ Long concertID = Long .valueOf (rawEntity .getKey ().toString ());
113+ Integer viewCount = Integer .valueOf (rawEntity .getValue ().toString ());
114+ viewCountMap .put (concertID , viewCount );
116115 }
117- return viewCount ;
116+ return viewCountMap ;
118117 }
119118
120- // 조회수 맵 조회
121- public Map <Long , Integer > getViewCountMap () {
122- Map <String , Integer > rawMap = (Map <String , Integer >) objectRedisTemplate .opsForValue ().get (VIEW_COUNT_MAP );
123- if (rawMap == null ) return null ;
124- objectRedisTemplate .delete (VIEW_COUNT_MAP );
125- return convertViewCountMap (rawMap );
119+ // 공연의 조회수 조회
120+ public Long getCachedViewCount (Long concertId ) {
121+ Long viewCount = Long .valueOf (redisTemplate .opsForHash ()
122+ .get (
123+ CONCERTS_VIEW_COUNTS ,
124+ concertId .toString ()
125+ )
126+ .toString ());
127+
128+ return viewCount ;
126129 }
127130
128- // 조회수 맵 삭제
129- public void deleteViewCountMap () {
130- objectRedisTemplate .delete (VIEW_COUNT_MAP );
131+ // 공연에 예매시작, 종료일자 추가
132+ public void updateCachedTickingDate (Long concertId , LocalDateTime TicketTime , LocalDateTime TicketEndTime ) {
133+ ConcertDetailResponse concertDetailResponse = getConcertDetailResponse (concertId );
134+ if (concertDetailResponse == null ) return ;
135+ concertDetailResponse .setTicketTime (TicketTime );
136+ concertDetailResponse .setTicketEndTime (TicketEndTime );
137+ saveConcertDetail (concertId , concertDetailResponse );
131138 }
132139
133140 // String Integer 타입 맵을 Long Integer로 변환
@@ -164,20 +171,20 @@ private void deleteAllItemsByPREFIX(String prefix) {
164171
165172 // 총 공연의 개수 저장
166173 public Long saveTotalConcertsCount (Long totalConcertsCount , ListSort sort ) {
167- redisTemplate .opsForValue ().set (CONCERTS_COUNT_PREFIX + sort .name (),totalConcertsCount .toString ());
174+ redisTemplate .opsForValue ().set (CONCERTS_COUNT_PREFIX + sort .name (), totalConcertsCount .toString ());
168175 return totalConcertsCount ;
169176 }
170177
171178 // 총 공연의 개수 조회
172179 public Long getTotalConcertsCount (ListSort sort ) {
173- String raw = redisTemplate .opsForValue ().get (CONCERTS_COUNT_PREFIX + sort .name ());
180+ String raw = redisTemplate .opsForValue ().get (CONCERTS_COUNT_PREFIX + sort .name ());
174181 if (raw == null ) return -1L ;
175- else return Long .parseLong (redisTemplate .opsForValue ().get (CONCERTS_COUNT_PREFIX + sort .name ()));
182+ else return Long .parseLong (redisTemplate .opsForValue ().get (CONCERTS_COUNT_PREFIX + sort .name ()));
176183 }
177184
178185 // 총 공연의 개수 삭제
179186 public void deleteTotalConcertsCount (ListSort sort ) {
180- redisTemplate .delete (CONCERTS_COUNT_PREFIX + sort .name ());
187+ redisTemplate .delete (CONCERTS_COUNT_PREFIX + sort .name ());
181188 }
182189
183190 // 사용자가 좋아요를 누른 공연의 개수 조회(임시 캐시 느낌으로 짧게 저장, 조회시 시간 갱신 ~1일
@@ -189,7 +196,7 @@ public Long getUserLikedCount(User user) {
189196 }
190197
191198 // 사용자가 좋아요를 누른 공연의 개수 저장
192- public Long saveUserLikedCount (User user ,Long count ) {
199+ public Long saveUserLikedCount (User user , Long count ) {
193200 redisTemplate .opsForValue ().set (
194201 CONCERTS_COUNT_PREFIX + user .getId (),
195202 count .toString (),
0 commit comments