1. Redis 메모리 운영 효율적으로 관리하기
- Redis는 in-memory 데이터 저장 관리 기술을 제공합니다.
- 그러나 시스템 메모리 크기는 제한이 있습니다.
- 사용자가 저장하는 데이터는 이보다 훨씬 크기 때문에 모든 데이터를 메모리에 저장해서 관리할 수가 없습니다.
- 이러한 문제점을 개선하기 위해 Redis는 LRU / LFU 알고리즘을 제공합니다.
- 메모리를 효율적으로 사용하기 위해서 LFU 알고리즘으로 설정해서 사용하는걸 추천합니다.
* LFU 알고리즘 설정
vi redis.conf
lfu-log-factor 10 // LFU 알고리즘에 의한 메모리 운영
lfu-decay-time 1
- LRU 알고리즘은 lfu-log-factor 값을 변경하면서 튜닝하는데 기본값은 10입니다. (일반적으로 10이 가장 효율적)
- Redis에 쓰기 작업이 계속 발생하면 최대 메모리에 도달하게 되는데 이때 키에 삭제 작업을 수행하게 되면 성능 지연이 발생합니다.
- 이러한 문제를 해결하기 위해 LazyFree 쓰레드를 이용합니다.
vi redis.conf
lazyfree-lazy-eviction yes // unlink로 삭제하고 새 키 저장
layfree-lazy-expire yes // unlin로 만기된 키 삭제
lazyfree-lazy-server-del yes // unlink로 데이터 변경
slave-lazy-flush yes // 복제 서버가 삭제 후 복제할 때 FlushAll async 명령어로 삭제
2. Redis 클라이언트
- 클라이언트는 주로 Jedis, Redisson, Lettuce 3가지 중에서 Jedis와 Lettuce를 많이 사용합니다.
- 성능 측면에서 Lettuce가 Netty 기반으로 만들어져서 비동기로 요청을 처리하기 때문에 Jedis보다 더 빠르므로 Lettuce를 사용합니다.
TPS | Redis CPU | Redis Connection | 응답 속도 | |
jedis no connection pool | 31,000 | 20% | 35 | 100ms |
jedis use connection pool | 55,000 | 69.5% | 515 | 50ms |
lettuce | 100,000 | 7% | 6 | 7.5ms |
3. Redis Lettuce 클라이언트 설정
- Redis를 사용하기 위해 Maven 설정을 합니다.
- Redis 설정 정보
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisConfig {
private String redisHost = "1.2.3.4";
private int redisPort = 6379;
// redis 연결
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(this.redisHost, this.redisPort);
}
@Bean
public ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
// redis template 생성
@Bean
public StringRedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
stringRedisTemplate.setHashKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setHashValueSerializer(new StringRedisSerializer());
return stringRedisTemplate;
}
}
4. Redis 성능 튜닝하기
- 성능 튜닝 포인트는 System, Query, Server 튜닝이 있습니다.
- Redis는 인-메모리 기반 데이터 저장 구조로 시스템 RAM 영역을 할당받아서 사용하기 때문에 System 튜닝이 가장 중요합니다.
1) System 튜닝하기
- Block-Size : 기본값은 8kb 입니다. 동시 접속자가 많고 Redis에 CRUD가 빈번하게 발생하면 4kb로 변경하고, 동시 접속자가 적고 조회 위주로 Redis를 사용하면 16kb로 변경합니다.
- tcp keep alive time 을 변경합니다.
vi /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 7200
- 시스템 환경 설정을 변경합니다.
vi /etc/sysctl.conf
vm.overcommit_memory=1 sysctl -w net.core.somaxconn=65535
cat /proc/sys/net/core/somaxconn
vi /etc/sysctl.conf
net.core.somaxconn = 65535
vi /etc/security/limits.conf
redis soft nofile 65536
redis hard nofile 65536
redis soft nproc 131072
redis hard nproc 131072
2) Slow Query 튜닝하기
- Slow 쿼리를 튜닝하기 위해서는 우선 쿼리 수집을 한 후 분석하여 적합한 데이터 구조를 사용해야 합니다.
lowlog get 저장된 키 // 해당 키 값으로 쿼리 호출
slowlog len // Slow Query 개수
slowlog reset // 저장된 모든 slow Query 제거
3) Server 튜닝하기
- 스와핑 발생 빈도 줄이기 위한 설정 변경
vi redis.conf
maxmemory 1000000000 // RAM 메모리가 허용하는 최대 범위(전체 RAM 크기의 90% 값으로 설정)
swap 0 1 // Database 1에 설정한 swap DB 0
'개발' 카테고리의 다른 글
AngularJs 보안 가이드 (0) | 2020.07.28 |
---|---|
AngularJs 성능 개선 가이드 (0) | 2020.07.28 |
프리랜서 계약서 양식 (0) | 2020.07.27 |
IntelliJ Memory Option 최적화 (0) | 2020.07.26 |
Intellij Freezing(인텔리J 프리징) 현상 해결 (0) | 2020.07.26 |