Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

SET Key value Ex seconds Px milliseconds NX|XX

  • 1.0.0 버전 부터 지원
  • 시간 복잡도 : O(1)
KeyValue를 저장한다. 만약 key가 이미 있다면, value의 데이터 타입에 관계없이 덮어쓴다.

옵션

2.6.12 버전 부터 아래의 옵션을 지원한다.
  • Ex seconds : key의 유효시간을 "초 단위"로 정할 수 있다.
  • Px milliseconds : key의 유효시간을 "밀리 초 단위"로 정할 수 있다.
  • NX : key가 없다면, 값을 설정하라
  • XX : key가 있다면, 값을 설정하라
2.6.12 이전에는 SETNX, SETEX, PSETEX등이 있었는데, 이 후 버전에서는 옵션으로 통합할 수 있다. 이들 명령은 제거될 예정이다.

반환 값

성공하면 "OK" 실패하면 NULL 을 반환한다.

예제

# 값을 설정 
> SET session:yundream abcd123409df
OK

# 설정 값을 가져왔다.
> GET  session:yundream 
"abcd123409df"

# Key가 존재하지 않을 경우 값을 설정한다. 
# 이미 Key가 존해하므로 실패한다. 
> SET session:yundream abcd123409dfddd NX
(nil)

# 이 Key는 10초 후 삭제된다. 
> SET session:yundream abcd123409df EX 10
OK

사용 패턴

NX와 EX max-lock-time의 조합으로 간단하게 잠금(locking) 시스템을 구현할 수 있다.

Key가 아직 삭제되지 않은 상태에서 클라이언트가 "NX" 옵션으로 SET 명령을 내리면, 이 명령은 실패 하고 nil을 반환 할 거다. EX 시간이 지나서 key가 삭제되면, 비로서 다른 클라이언트에서 이 key를 사용할 수 있게 된다. 명시적 잠금구현인 셈이다.

Expire Time 없이 락을 구현할 수도 있다.
  1. 고정된 (그리고 추측할 수 있는) 문자열 대신에, 추측할 수 없는 랜덤 값을 설정하는 방법이 있다. Key를 만든 유저만 이 랜덤값을 알 고 있다.
  2. Key를 알고 있어야지만 key를 DEL할 수 있도록 스크립트를 작성한다.
대략 다음과 같은 모습일 거다.
if redis.call("get",KEYS[1]) == ARGV[1]
then
    return redis.call("del",KEYS[1])
else
    return 0
end