Redis

Redis - String 데이터 타입, 명령어

개발 일기92 2024. 6. 16. 11:17

String

key-value

Strings는 key와 value가 일 대 일 관계.
반면 Lists, Sets, Sorted Sets, Hashes는 일 대 다 관계.

 

Key/Value Data type: Binary-safe strings

바이너리-안전 문자열은 알파벳, 숫자, 한글, 이미지(비정형 데이터) 등을 사용할수 있다는 의미.
즉, value 뿐만 아니라 key도 위에 언급한 것들을 사용할 수 있다.

 

key/value maximum length: 512 megabytes

key와 value 모두 최대 길이는 512MB.

 

key design

  • 적절한 key 사이즈를 유지하는 것이 좋다.
    사용자 보기 관점: "user_1000_email"
    메모리 절약 관점: "u1000e"
  • key를 구성할때 단어 사이에 구분자를 사용하는 것이 좋다.
    예를 들어 '_' 등을 사용해서 key를 구성하면 쉽게 알아볼 수 있다.
    특히, Enterprise 버전에서 SQL(select) 사용을 고려한다면 다른 구분자보다 '_' 사용을 추천.

 

명령어 요약

  • SET(저장): SET, SETNX, SETEX, SETPEX, MSET, MSETNX, APPEND, SETRANGE
  • GET(조회): GET, MGET, GETRANGE, STRLEN
  • INCR(1씩증가): INCR, DECR, INCRBY, DECRBY, INCRBYFLOAT

1. SET key value

명령>	set key value
결과>	OK
명령>	get key
결과>	value

 

value 부분 띄어쓰기를 포함하려면 ""큰따옴표 사용.

명령>	set key "Hello Redis!"
결과>	OK
명령>	get key
결과>	Hello Redis!

 

같은 key로 SET 명령을 실행하면 이전 value는 지워지고 새로 입력한 value가 남는다.

명령>	set key Hello
결과>	OK
명령>	set key Redis
결과>	OK
명령>	get key
결과>	Redis

 

겹쳐 쓰기 방지:NX (대/소문자 구분 없이 사용가능. Redis의 모든 옵션들은 대/소 구분 없이 사용가능)

명령>	set key1 Hello NX
결과>	OK
명령>	set key1 Redis NX
결과>	(nil)
명령>	get key1
결과>	Hello

 

겹쳐질 경우에만 저장: XX

명령>	set key2 Hello XX
결과>	(nil)
명령>	set key2 Hello
결과>	OK
명령>	set key2 Redis XX
결과>	OK
명령>	get key2
결과>	Redis

 

지정한 시간 이후 데이터 삭제됨: EX <second> ( timestamp, 밀리초 후 삭제 옵션도 따로있다.)

명령>	set key3 Hello EX 5
결과>	OK
명령>	get key3   1초 후
결과>	Hello
명령>	get key3   5초 후
결과>	(nil)

 

새 값 넣고 기존 값 반환하기

명령>	set key1 value1
결과>	OK
명령>	set key1 value2 get
결과>	value1
명령>	get key1
결과>	value2

2. DEL key1 : 삭제한 key의 개수를 반환.

명령>	set key1 Hello
결과>	OK
명령>	set key2 Redis
결과>	OK
명령>	set key3 Server
결과>	OK
명령>	del key1
결과>	1
명령>	del key2 key3
결과>	2

3. GET key1 value

명령>	get key4
결과>	(nil)
명령>	set key4 value
결과>	OK
명령>	get key4
결과>	value

4. 데이터 조회, 만료시간 설정 옵션

  • EX: 만료(expire) 시간을 초(second)로 설정.
  • PX: 만료(expire) 시간을 밀리초(millisecond)로 설정.
  • EXAT: 만료(expire) 시각을 timestamp-seconds로 설정.
  • PXAT: 만료(expire) 시각을 timestamp-milliseconds로 설정.
  • PERSIST: 만료(expire) 시간/시각을 삭제.
명령>	getex key ex 10
결과>	value
명령>	get key 10초 후
결과>	(nil)

 

GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]


5. GETDEL KEY : 데이터 조회 후 삭제 ( 6.2.0 ver 이상 부터 사용가능)

명령>	getdel key
결과>	value
명령>	get key
결과>	(nil)

6. incr key : value를 1씩 증가, decr key : value 1씩 감소

명령>	incr key
결과>	1
명령>	incr key
결과>	2
명령>	set key 10
결과>	OK
명령>	incr key
결과>	11

 

INCR, DECR ERROR

  • 문자에 incr, decr명령어 실행 시 
  • 정수 값 초과할 경우( 레디스의 정수는 64비트 부호 정수로 범위는 -9,223,372,036,854,775,808(263) ~ 9,223,372,036,854,775,807(263-1) 이다.)
명령>	set key Hello
결과>	OK
명령>	incr key
결과>	ERR value is not an integer or out of range
명령>	set key 234293482390480948029348230948   숫자가 아닌 문자열로 저장된다.  
결과>	OK
명령>	incr key
결과>	ERR value is not an integer or out of range
명령>	set key 9223372036854775807   가장 큰 양의 정수 2^63 − 1  
결과>	OK
명령>	incr key
결과>	ERR increment or decrement would overflow

 


7. INCRBY KEY VALUE : 지정한 정수 만큼 value증가 (-10 같은 음수로도 활용가능)

<-> DECRBY KEY VALUE : 지정한 정수 만큼 value감소 (-10 같은 음수로도 활용가능)

명령>	incrby key 10
결과>	10
명령>	incrby key 20
결과>	30
  • incrby key 1.2 같은 정수가 아닌 숫자일 경우 ERR value is not an integer or out of range 에러 발생

8. INCRBYFLOAT key value : 지정한 정수or유리수 만큼 증가.(음수 사용가능)

지정한 value가 없을 경우 0을 기준으로 지정한 숫자 반환

명령>	incrbyfloat key 15.6
결과>	15.6
명령>	incrbyfloat key 3.3
결과>	18.9

9. SETNX key value : 동일한 key가 없을경우에만 저장됨. ( set key value NX 명령과 같은 동작)

명령>	setnx key Hello
결과>	1 (저장 후 1반환)
명령>	setnx key Redis
결과>	0   (key로 이미 데이터가 있으므로 저장 실패. 0 반환)
명령>	get key
결과>	Hello   처음에 저장한 데이터 Hello가 조회됨.

10. SETEX key <seconds> value : 지정한 seconds이후 데이터 삭제

PSETEX key <milliseconds> value : 지정한 milliseconds 이후 데이터 삭제

명령>	setex key 5 value
결과>	OK
명령>	ttl key
결과>	2   (남은 시간을 초(second)로 알려줌)
명령>	get key
결과>	(nil)   (5초가 지나서 데이터가 지워짐)

11. MSET key1 value1 key2 value2 : 여러 데이터를 한번에 저장.

MGET key1 value1 key2 value2 : 여러 데이터를 한번에 조회

명령>	mset key1 Hello key2 Redis
결과>	OK
명령>	get key1
결과>	Hello
명령>	get key2
결과>	Redis

 

mset 명령은 원자적으로 동작합니다. 일부만 저장되거나 일부만 실패하지 않는다.


12. MSETNX key1 value1 key2 value2 : 여러 데이터를 한번에 저장. 

단, 기존에 key가 없어야 한다. 여러 키중 하나라도 존재한다면 전부 저장되지 않음.

명령>	msetnx key1 Hello key2 Redis
결과>	1
명령>	msetnx key2 XXXXX key3 Server
결과>	0   (key2에 이미 데이터가 있으므로 저장 실패)
명령>	mget key1 key2 key3
결과>	1) Hello
2) Redis
3) (nil)

13. APPEND key value : 기존 키값에 있는 value에 신규 value를 추가. ( version 2.0.0 부터 사용가능)

명령>	set key1 Hello
결과>	OK
명령>	append key1 Redis
결과>	10
명령>	get key1
결과>	HelloRedis
명령>	append key2 "Hello World"   (기존에 없는 key일 경우에는 데이터를 저장. = set)
결과>	11
명령>	get key2
결과>	Hello World

14. STRLEN key : 해당 키의 value값 길이를 반환.

명령>	set key value
결과>	OK
명령>	strlen key
결과>	5
명령>	append key 1234567890
결과>	15
명령>	get key
결과>	value1234567890
명령>	strlen key
결과>	15

15. SETRANGE key <value offset(index)> <input value> : 지정 위치에 value로 변환

offset은 0부터 시작하고 음수를 사용할 수 없다.

명령>	set key "This is MySQL Server"
결과>	OK
명령>	setrange key 8 Redis
결과>	20
명령>	get key
결과>	This is Redis Server

=>지정한 offset 8부터 Redis를 넣고 기존 MySQL값을 덮어씌워서 This is Redis Server를 반환


16. GETRANGE key <start> <end> : 시작과 끝offset의 value를 반환 (version 2.4.0 부터 사용가능)

명령>	set key "This is Redis Server"
결과>	OK
명령>	getrange key 0 3
결과>	This
명령>	getrange key 8 12
결과>	Redis
명령>	getrange key 8 100
결과>	Redis Server

 

음수 사용 가능!! (마지막 문자는 -1부터 시작)

명령>	getrange key -6 -1
결과>	Server
명령>	getrange key 0 -1   (모든 데이터 조회는 0 -1을 지정)
결과>	This is Redis Server

17. STRALGO LCS strings value1 value2 : 두 문자열이 얼마나 유사한지 평가

STRALGO LCS KEYS key1 key2

(version 6.0.0 부터 사용가능)

LCS(Longest Common Subsequence) 알고리즘

시간 복잡도 : O(N*M) (첫문자열길이*두번째문자열길이)

명령>	stralgo lcs strings ohmytext mynewtext
결과>	"mytext"
명령>	stralgo lcs keys key1 key2
결과>	"mytext"
명령>	stralgo lcs keys key1 key2 len
결과>	6
명령>	stralgo lcs keys key1 key2 idx
결과>	1) "matches"
2) 1) 1) 1) (integer) 4
             2) (integer) 7
         2) 1) (integer) 5
             2) (integer) 8
    2) 1) 1) (integer) 2
             2) (integer) 3
         2) 1) (integer) 0
             2) (integer) 1
3) "len"
4) (integer) 6
명령>	stralgo lcs keys key1 key2 idx minmatchlen 4
결과>	1) "matches"
2) 1) 1) 1) (integer) 4
             2) (integer) 7
         2) 1) (integer) 5
             2) (integer) 8
3) "len"
4) (integer) 6
명령>	stralgo lcs keys key1 key2 idx minmatchlen 4 withmatchlen
결과>	1) "matches"
2) 1) 1) 1) (integer) 4
             2) (integer) 7
         2) 1) (integer) 5
             2) (integer) 8
         3) (integer) 4
3) "len"
4) (integer) 6

 

STRALGO LCS [STRINGS ...] [KEYS ...] [LEN] [IDX] [MINMATCHLEN <len>] [WITHMATCHLEN]


18. GETSET key value : 조회와 저장 한번에 수행

getset명령어는 원자성 보장!

명령>	incr key
결과>	100
명령>	getset key 0
결과>	100
명령>	incr key
결과>	1

Redis 6.2 버전에서 SET 명령에 GET 옵션이 추가되었습니다. GETSET 명령과 동일하게 작동합니다.
GETSET 명령은 향후 사용되지 않을(deprecated)거라고 합니다.

 

출처 : http://redisgate.kr/redis/command/strings.php

'Redis' 카테고리의 다른 글

Redis - Sets  (0) 2024.06.16
Redis - Lists 데이터 타입, 명령어  (3) 2024.06.16
Redis - 수정중 6  (0) 2024.06.15
Redis - 수정중 5  (0) 2024.06.15
Redis - 수정중 4  (0) 2024.06.15