Spring에서 Redis를 이용해 캐싱 구현하는 법

Spring에서 Redis 서버로 캐싱하는 방법은 2가지 방법이 있다. 기본적인 동작 확인만 목표로 하기 때문에 자세한 설정 방법은 생략한다. 어노테이션을 사용하는 방법 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' Config에 @EnableCaching 추가 @SpringBootApplication @EnableCaching public class Application { ... } Entity에 Serializable 구현 Redis에서 데이터를 바이트 스트림으로 저장하기 위해서 필요하다. @Entity public class User implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String name; private String email; private Integer age; public User() { super(); } public User(Integer id, String name, String email, Integer age) { super(); this....

2024-09-15 · 2 min · 261 words

Spring redis로 pub sub 구현하기

Redis 의존 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' spring-boot-starter-data-redis 의존을 통해 properties 파일로 설정이 가능하다. Bean 생성 @Bean public RedisTemplate<String, Object> redisTemplate(final RedisConnectionFactory connectionFactory) { final RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); return template; } pubish 하기위한 RedisTemplate다. @Bean RedisMessageListenerContainer redisContainer(final MessageListener messageListener) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(jedisConnectionFactory()); container.addMessageListener(messageListener, topic()); return container; } 메시지 수신에 대한 비동기 처리를 하기위해서는 RedisMessageListenerContainer 에 MessageListener를 추가하면 된다. @Override public void onMessage(final Message message, final byte[] pattern) { try { EntryResponse response = objectMapper....

2024-09-15 · 1 min · 126 words

Redis Transaction

목표 redis를 이용한 작업 중에서 원자적으로 동작해야되는 로직이 필요했다. 이를 위해 redis에서 transaction을 사용하는 방법을 이해한다. 방법 Redis에서 MULTI가 트랜잭션의 시작을 나타내고 EXEC가 트랜잭션의 커밋, DISCARD가 롤백을 나타낸다. RedisTemplate 자체애도 multi(), exec()가 있지만, 각 커맨드가 같은 connection에서 실행된다는 보장이 없다. 이를 위해 SessionCallback 인터페이스로 하나의 커넥션에서 수행할 연산을 전달한다. //execute a transaction List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() { public List<Object> execute(RedisOperations operations) throws DataAccessException { operations.multi(); operations.opsForSet().add("key", "value1"); // This will contain the results of all operations in the transaction return operations....

2024-09-15 · 1 min · 97 words