728x90
반응형
Redis 특수 명령어
Redis는 Expiration 가 필요해!
redis
는 기본적으로 in-memory
데이터베이스로 동작하기 때문에 저장된 모든 데이터가 서버의 메모리를 차지합니다.
데이터가 계속해서 쌓기이만 한다면 메모리가 가득차게 되서 성능 저하 또는 서버가 중단될 수 있습니다.
또한, 캐싱 레이어(caching layer
)로 많이 사용되기 때문에 redis
에서 조회한 데이터가 최신 데이터가 아닐 확률이 있습니다.
(일정 시간 이후에 최신 데이터가 필요하다면, 해당 데이터를 삭제해야 합니다.)
따라서, 데이터를 일정 시간이 지나면 삭제하여 불필요한 메모리를 사용을 방지할 수 있습니다.
(데이터가 만료 되자마자 물리적으로 바로 삭제되지는 않고, 만료라고 표시했다가 백그라운드에서 주기적으로 삭제)
정리하면 데이터를 특정시간(TTL) 이후에는 만료시키는 기능을 의미 합니다. 🙌
TTL 이란?
- 데이터가 유효한 시간(sec)
명령어
set
$ set greeting hello
OK
- Strings 타입의 데이터 생성
expire
$ expire greeting 10
(integer) 1
- 데이터 만료 기간 설정(sec)
ttl
$ ttl greeting
(integer) 7
- 데이터의 남은 만료 시간 조회
setex
$ setex greeting 10 hello
OK
- 데이터 만료기간 까지 함께 저장
Set NX/XX
만약에 member
의 가 coupon
가 존재하는 경우에만 특정 값을 넣고 싶다고 해볼까요?
그렇다면, member
의 coupon
을 조회하고 값이 있는지 확인하고 set 명령어를 실행해야 합니다.
그런데 매번 이렇게 하는게 귀찮은 개발자들의 요청으로 set nx/xx
명령어가 탄생 했습니다!
nx
는 해당 key 가 존재하지 않는 경우에만 set 명령어xx
는 해당 key 가 존재하는 경우에만 set 하는 명령어- set 이 동작하지 않는 경우 (
nil
) 응답
명령어
set nx
$ set member:coupon 50 nx
OK
- set [key] [value] nx 문법
- member:coupon 가 존재하지 않는 경우 set
set xx
$ set member:coupon 0 xx
OK
$ set member:name 31 xx
(nil)
- set [key] [value] nx 문법
- member:coupon 가 존재하는 경우 set
Pub/Sub
- 일반적인 데이터베이스와는 다르게
Redis
는 메시지를 주고, 받는 기능을 제공 publisher
와subscriber
가 서로 알지 못해도 통신이 가능하도록decoupling
된 패턴publisher
는subscriber
에게 직접 메시지를 전송하지 않고channel
에 메시지를publish
합니다.subscriber
는 관심있는channel
만 구독하여subscribe
하며 메시지를 수신 합니다.subscriber
의 기능이 변경되어도publisher
는 이를 신경 쓰지 않아도 되고subscriber
가 필요에 따라 구독하는 채널을 조정하면 됩니다.- 두 시스템 간의 강한 커플링을 줄일 수 있습니다.
Streams
와 다른 점은 메시지가 보관되는Streams
와 달리Pub/Sub
는subscribe
하지 않을 때 발생된 메시지는 수신이 불가 합니다.- Fire and Forget 방식
Pub/Sub
시스템은 메시지를 보관(queuing
) 하지 않습니다.publish
하는 시점에 이미 실행한subscribe
명령으로 대기하고 있는subscriber
에게만 전달
명령어
subscribe
$ subscribe ch:order ch:coupon
1) "subscribe"
2) "ch:order"
3) (integer) 1
1) "subscribe"
2) "ch:coupon"
3) (integer) 2
1) "message"
2) "ch:order"
3) "new-order"
1) "message"
2) "ch:coupon"
3) "lunar-new-year-discount"
publish
$ publish ch:order new-order
(integer) 1
$ publish ch:coupon lunar-new-year-discount
(integer) 1
Pipeline
- 다수의
commands
를 한 번에 요청하여 네트워크 성능을 향상 시키는 기술 - Round-Trip Times 최소화
- 일반적으로 request-response model 에서 요청과 응답에 따라 네트워크를 통해 트래픽이 왔다 갔다 하며 Round-Trip Times 이 발생
- Round-Trip 의 횟수를 줄여서(클라이언트와 redis 서버 간의 통신 횟수를 줄임), 네트워크 지연을 최소화
- 대부분 redis client 라이브러리에서 지원
redis-cli 에서는 pipeline 기능을 제공하지 않습니다...!!
Spring example
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.stereotype.Service;
@Service
@Requiredargsconstructor
public class RedisPipelineService {
private final RedisTemplate<String, String> redisTemplate;
public void setMemberNameWithExpire() {
redisTemplate.executePipelined((RedisCallback<Void>) connection -> {
// SET member:name ralph
connection.set("member:name".getBytes(), "ralph".getBytes());
// EXPIRE member:name 10 (10초 후 만료)
connection.expire("member:name".getBytes(), 10);
return null; // 결과를 반환할 필요 없음
});
}
}
Transaction
- 다수의 명령을 하나의 트랜잭션으로 처리 → 원자성(Atomicity) 보장
- 중간에 예외가 발생하면 모든 작업 rollback
all or nothing
: 모든 작업이 적용되거나 모든 작업이 적용되지 않거나
- 하나의 트랜잭션이 처리되는 동안 다른 클라이언트의 요청이 중간에 끼어들 수 없음
pipeline
은 다수의 명령어를 한번에 요청하지만, 실제로는 개별적으로 명령어가 수행됩니다.pipeline
에 있는 명령어를transaction
기술을 사용하여 수행할 수 있습니다.
명령어
multi
$ multi
OK
$ (TX)
- 트랜잭션 시작
exec
$ exec
- 트랜잭션 적용
discard
$ discard
- rollback
참고
728x90
반응형
'데이터베이스 > 0 + Redis' 카테고리의 다른 글
[Redis] 사용시 주의사항 (0) | 2025.02.03 |
---|---|
[Redis] 데이터 타입 활용 (0) | 2025.02.02 |
[Redis] Redis 특징과 데이터 타입 소개 (0) | 2025.01.28 |