분류 | 게시판 |
베스트 |
|
유머 |
|
이야기 |
|
이슈 |
|
생활 |
|
취미 |
|
학술 |
|
방송연예 |
|
방송프로그램 |
|
디지털 |
|
스포츠 |
|
야구팀 |
|
게임1 |
|
게임2 |
|
기타 |
|
운영 |
|
임시게시판 |
|
백엔드 작업 하면서 내부 변동성 없는 데이터를 DB를 통해 아주 자주~ 자주 호출 하는 구분이 생겼다.
캐싱 어노테이션을 이용해 보려 했지만 그낙 내 맘에 들지는 않았다.
일정 시간이 지나면 원하는 것만 캐시 내용이 제거 됬으면 하는 내 소망이였다. 그래서 만들었다.import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * 일정 시간 지나면 항목 제거 Map<P> * 항목을 추가하면 내부에 runnable이 생성되고 interval 시간에 삭제 처리가 이뤄 진다. * @param <K> * @param <V> * @see {@link RemoveEventListener} */ public class CacheIntervalMap<K, V> extends ConcurrentHashMap<K, V>{ private static final long serialVersionUID = -3116825266165827645L; /** 스케줄러 서비스 */ private final ScheduledExecutorService scheduleExe; /** 지속 시간 */ private final long interval; /** 지속 시간 단위 */ private final TimeUnit unit; /** 자동 삭제하기 전 문의하기 이벤트 리스너 */ private final RemoveEventListener<K, V> listener; /** 중간 취소 처리 위한 관리 객체 */ private final Map<K, Future<K>> callManage; /** * 일정 시간이 지나면 제거 * @param <K> * @param <V> */ private static class RemoverCashIntervalMap<K, V> implements Callable<K>{ private final CacheIntervalMap<K, V> owner; private final K key; public RemoverCashIntervalMap(CacheIntervalMap<K, V> owner, K key) { this.owner = owner; this.key = key; } @Override public K call() throws Exception { System.out.println("자동 삭제 " + this.key ); if( ! this.owner.containsKey(this.key) ) return this.key; // 일단 지우고 나서 리스너로 문의해 본다. final V value = this.owner.remove(this.key); if( this.owner.listener == null ) return this.key; if( ! this.owner.listener.isRemove(this.key, value) ) { // 이미 삭제된거 어쩔 수 없다. 다시 추가~! this.owner.put(this.key, value); } return this.key; } } /** * 삭제하기 * @param interval 일정시간 * @param unit 시간 단위 */ public CacheIntervalMap(long interval, TimeUnit unit) { this(interval, unit, null); } /** * 삭제하기 * @param interval 일정시간 * @param unit 시간 단위 * @param listener 삭제할지 말지 결정. */ public CacheIntervalMap(long interval, TimeUnit unit, RemoveEventListener<K, V> listener) { super(); this.interval = interval; this.unit = unit; this.listener = listener; this.scheduleExe = Executors.newSingleThreadScheduledExecutor(); this.callManage = new ConcurrentHashMap<K, Future<K>>(); } @Override public V remove(Object key) { this.callManage.remove( key ).cancel(false); return super.remove(key); } @Override public V put(K key, V value) { this.callManage.put(key, this.scheduleExe.schedule( new RemoverCashIntervalMap<K,V>(this, key), interval, unit) ); return super.put(key, value); } @Override public void putAll(Map<? extends K, ? extends V> m) { for( K key : m.keySet() ) { this.callManage.put(key, this.scheduleExe.schedule( new RemoverCashIntervalMap<K,V>(this, key), interval, unit) ); } super.putAll(m); } @Override public void clear() { for( Future<K> k : this.callManage.values() ) { k.cancel(true); } this.callManage.clear(); super.clear(); } } |
이벤트 클래스
/** * 삭제 되기 전 발생하는 이벤트 * @param <K> * @param <V> * @see {@link CacheIntervalMap} */ public interface RemoveEventListener<K, V> { /** * 삭제 되기전 문의 하기~ * @param key * @param value * @return true: 삭제해라. false:다음에 삭제할까 생각해 볼께. */ public boolean isRemove(K key, V value); } |
final Map<String, Integer> testExe = new CacheIntervalMap<String, Integer>(5, TimeUnit.SECONDS, new RemoveEventListener<String, Integer>() { @Override public boolean isRemove(String key, Integer value) { // BB는 삭제하지 않는다. return !"BB".equals(key); } }); testExe.put("AA", 100); testExe.put("BB", 200); testExe.put("CC", 300); |
결과
자동 삭제 AA 자동 삭제 BB 자동 삭제 CC 자동 삭제 BB 자동 삭제 BB 자동 삭제 BB |
출처 | 내 머리. |
죄송합니다. 댓글 작성은 회원만 가능합니다.
번호 | 제 목 | 이름 | 날짜 | 조회 | 추천 | |||||
---|---|---|---|---|---|---|---|---|---|---|
114 | 웹서비스 기획자 뽑기 힘드네요. [1] | 봄아 | 22/05/12 16:40 | 167 | 0 | |||||
113 | 언론/포탈 개혁을 해야 한다. [2] | 봄아 | 22/03/10 17:13 | 265 | 4 | |||||
112 | 또 시작이다 | 봄아 | 22/03/10 03:35 | 348 | 4 | |||||
111 | 내가 생각하는 싱어게인2 top3 | 봄아 | 22/02/28 11:53 | 113 | 0 | |||||
110 | 질문~ 구름솜에 픽사티브 뿌리면 먼지 안날까요? [2] | 봄아 | 21/11/18 10:20 | 84 | 0 | |||||
109 | 파워 추천해 주세요 [30] | 봄아 | 21/09/12 13:15 | 110 | 14 | |||||
108 | 혜원이한테 전화 왔어요 | 봄아 | 21/09/10 09:24 | 131 | 7 | |||||
▶ | [Java] 캐시 클래스. [4] | 봄아 | 21/09/03 17:14 | 127 | 4 | |||||
106 | 광배가 사라졌음... ㅎㄷㄷ [5] | 봄아 | 21/05/14 17:12 | 647 | 8 | |||||
105 | 아이즈원 [평행우주 프로젝트] 펀딩 어마어마 하네요. [4] | 봄아 | 21/04/28 14:11 | 311 | 5 | |||||
104 | 아이즈원 커버 송 모음... [1] | 봄아 | 21/03/31 10:02 | 108 | 5 | |||||
103 | 파인애플 피자 저는 좋던데... [2] | 봄아 | 21/03/17 11:42 | 238 | 4 | |||||
102 | 막콘 소감 from DC 펌. | 봄아 | 21/03/15 09:34 | 226 | 5 | |||||
101 | EBS가 일 잘하네. [1] | 봄아 | 20/12/11 15:31 | 1459 | 14 | |||||
100 | 아이즈원 영상 새로 올라 왔더라구요. [1] | 봄아 | 20/10/30 09:36 | 141 | 4 | |||||
99 | 아이즈원 번쩍 번쩍 환상동화. [2] | 봄아 | 20/09/24 15:53 | 188 | 5 | |||||
98 | 이번엔 쯔위 피큐어 ㅎㄷㄷ [3] | 봄아 | 20/08/31 09:27 | 355 | 6 | |||||
97 | 트와이스 사나 피규어 [3] | 봄아 | 20/08/11 18:41 | 334 | 8 | |||||
96 | 슈퍼밴드 + 팬텀싱어 | 봄아 | 20/04/24 17:27 | 137 | 0 | |||||
95 | 모모 찡한 컷 [1] | 봄아 | 20/02/27 15:49 | 187 | 10 | |||||
94 | [MPD직캠] 아이즈원 ALL 직캠 4K ‘FIESTA’ | 봄아 | 20/02/19 11:49 | 125 | 6 | |||||
93 | 아이즈원 Bloom*IZ [1] | 봄아 | 20/02/18 09:53 | 126 | 6 | |||||
92 | JYP에서 트둥이들 스토킹으로부터 보호해 달라고 경찰 불렀네요. [1] | 봄아 | 19/12/19 15:43 | 209 | 10 | |||||
91 | IU(아이유) _ above the time(시간의 바깥) [3] | 봄아 | 19/11/18 13:08 | 116 | 6 | |||||
90 | 이쁜 꽃에 불결한 것이 묻었네요. ㅠㅠ [4] | 봄아 | 19/11/05 09:41 | 306 | 2 | |||||
89 | 아이즈원 뱀파이어 [3] | 봄아 | 19/09/13 22:34 | 230 | 6 | |||||
88 | 이가은 기억 할께.ㄹ [1] | 봄아 | 19/07/18 11:26 | 280 | 4 | |||||
87 | 리더의 포근함을 체험한 꾸라. [6] | 봄아 | 19/07/03 09:53 | 361 | 8 | |||||
86 | 슈퍼밴드 내가 좋아라 하는 노래들. [3] | 봄아 | 19/05/28 17:39 | 84 | 1 | |||||
85 | 슈퍼밴드 보시나요? [3] | 봄아 | 19/05/16 17:45 | 136 | 7 | |||||
|
||||||||||
[1] [2] [3] [4] | ||||||||||