레시드란 메모리 기반 저장 서비스로, 키-값 구조를 띄고있는 일종의 캐시이다. 문자열만 저장할 수 있는 Memcached와 달리, 다양한 자료구조를 다양한 형식으로 저장할 수 있다. (String, Set, SortedSet, Hash, List등)
$ brew install redis
- homebrew로 서비스 시작
$ brew services start redis
- 서비스 중단
$ brew services stop redis
- 서비스 재기동
$ brew services restart redis
- redis클라이언트로 접속
$ redis-cli
@EnableRedisRepositories // Redis Repository 활성화
@Configuration
public class RedisConfiguration {
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.host}")
private String host;
@Bean
public RedisConnectionFactory redisConnectionFactory(){
// 외부 레디스와의 연결
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<?,?> redisTemplate(){
// byte값을 객체 직렬화
RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
→ 스프링부트 2.0 이상부터는 redis에 대한 설정이 별도 필요없다.
커스터마이징할때 사용하기!
spring.redis.host=localhost
spring.redis.port=6379
@SpringBootTest
class RedisServiceTest {
@Autowired
RedisTemplate<String, String> redisTemplate;
@Test
void 레디스_문자열_다루기() {
String key = "string_redis";
String value = "string";
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set(key, value);
redisTemplate.expire(key, 60, TimeUnit.SECONDS);
Assertions.assertThat(value).isEqualTo(redisTemplate.opsForValue().get(key));
}
@Test
void 레디스_set오퍼레이션() {
// given
SetOperations<String, String> setOperations = redisTemplate.opsForSet();
String key = "setKey";
// when
setOperations.add(key, "h", "e", "l", "l", "o");
// then
Set<String> members = setOperations.members(key);
Long size = setOperations.size(key);
assertThat(members).containsOnly("h", "e", "l", "o");
assertThat(size).isEqualTo(4);
}
@Test
void 레디스_해시오퍼레이션(){
//given
HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();
String key = "HashKey";
//when
hashOperations.put(key, "hello", "world");
//then
Object value = hashOperations.get(key, "hello");
assertThat(value).isEqualTo("world");
Map<Object, Object> entries = hashOperations.entries(key);
assertThat(entries.keySet()).containsExactly("hello");
assertThat(entries.values()).containsExactly("world");
Long size = hashOperations.size(key);
assertThat(size).isEqualTo(entries.size());
}
}