Redis

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

개발 일기92 2024. 6. 16. 12:24

소개

Lists는 key와 value가 일 대 다 관계.
value는 입력된 순서대로 저장됩니다.
Lists는 주로 큐(Queue)와 스택(Stack)으로 사용됩니다.
큐(Queue)는 들어오는 데이터를 순서대로 처리할때 사용합니다. FIFO
스택(Stack)은 웹브라우져의 백버튼 처럼 주로 되돌아 갈때 사용합니다. LIFO

 

키(리스트)의 생성과 삭제

value가 저장되면 키(리스트)는 생성됩니다. 키에 value가 하나도 없으면 키는 삭제됩니다.
즉, 키(리스트)의 생성과 삭제를 위한 별도의 작업은 필요없다.

 

명령어 요약

  • SET (PUSH): LPUSH, RPUSH, LPUSHX, RPUSHX, LSET, LINSERT, RPOPLPUSH
  • GET: LRANGE, LINDEX, LLEN
  • POP: LPOP, RPOP, BLPOP, BRPOP
  • REM: LREM, LTRIM
  • BLOCK: BLPOP, BRPOP, BRPOPLPUSH

1. LPUSH key value : 리스트의 왼쪽에 데이터를 저장.

RPUSH key value : 리스트의 오른쪽에 데이터를 저장.

저장 후 리스트에 있는 데이터의 수를 리턴함.

명령>	lpush mylist value1
결과>	1
명령>	lpush mylist value2
결과>	2
명령>	lrange mylist 0 -1   (키에 저장된 데이터를 조회한다)
결과>	0) value2
1) value1
명령>	lpush mylist value3 value4   (value를 여러개 지정할 수 있다)
결과>	4
명령>	lrange mylist 0 -1
결과>	0) value4
1) value3
2) value2
3) value1

2. LPOP key value1 value2 ... : 왼쪽 데이터를 꺼냄.

RPOP key value1 value2 ... : 오른쪽 데이터를 꺼냄

데이터 조회 후 데이터는 삭제됨.

명령>	lpush mylist value1 value2 value3 value4
결과>	4
명령>	lrange mylist 0 -1
결과>	0) value4
1) value3
2) value2
3) value1
명령>	rpop mylist
결과>	value1   맨 처음 입력된 value1 리턴된다
명령>	lrange mylist 0 -1
결과>	0) value4
1) value3
2) value2
명령>	rpop mylist
결과>	value2

Count 옵션( 6.2 버전부터 사용 가능)

명령>	lpush mylist value1 value2 value3 value4
결과>	4
명령>	rpop mylist 3
결과>	1) value1
2) value2
3) value3

3. LRANGE key start stop : start(0부터시작) 부터 stop(-1) 까지의 value 조회.

초과된 범위를 설정해도 에러나지 않음(범위를 초과해도 저장된 데이터 까지만 조회됨)

명령>	lpush mylist value1 value2 value3 value4
결과>	4
명령>	lrange mylist 0 -1
결과>	0) value4
1) value3
2) value2
3) value1
명령>	lrange mylist 0 1
결과>	0) value4
1) value3
명령>	lrange mylist 2 -1   세번째부터 끝까지 데이터 조회
결과>	0) value2
1) value1

 

오른쪽 기준으로 조회 시 맨오른쪽 데이터 = -1, 마지막에서 두번째 데이터 = -2

명령>	lrange mylist -2 -1
결과>	0) value2
1) value1
명령>	lrange mylist -4 -3
결과>	0) value4
1) value3
명령>	lrange mylist 0 -3   마지막 두 개를 제외하고 조회할 때
결과>	0) value4
1) value3

 

정렬 기능

sort , asc, desc를 사용하여 정렬가능.

명령>	lrange mylist 0 -1 sort
결과>	1) value1
2) value2
3) value3
4) value4
명령>	lrange mylist 0 -1 desc
결과>	1) value4
2) value3
3) value2
4) value1

4. LLS key value : 패턴으로 value 조회.

  • * : 모든 문자 매치(match): h*llo -> hllo, heeeello, etc
  • ? : 1개 문자 매치(match): h?llo -> hallo, hello, hxllo, etc
  • [alphabet] : 대괄호 안에 있는 문자 매치(match): h[ae]llo -> hallo, hello
  • [^e] : 대괄호 안에 있는 문자 제외하고 매치(match): h[^e]llo -> hallo, hbllo, ...  hello는 제외됨.
  • [a-c] : 대괄호 안에 있는 문자 범위로 매치(match): h[a-c]llo -> hallo, hbllo, hcllo
  • \ : 위에 사용한 특수문자(*?[^])를 그대로 사용하려면 앞에 \를 사용.
명령>	lpush mylist value11 value12 value21 value22
결과>	4
명령>	lls mylist *
결과>	1) value22
2) value21
3) value12
4) value11
명령>	lls mylist value1*
결과>	1) value12
2) value11

 

정렬 기능

LLS key value sort | asc | desc

명령>	lls mylist * sort
결과>	1) value11
2) value12
3) value21
4) value22

5. LLEN key : value의 개수를 조회. 1.1.0버전부터 사용가능

명령>	lpush mylist value1 value2
결과>	2
명령>	llen mylist
결과>	2
명령>	rpop mylist
결과>	value1
명령>	llen mylist
결과>	1

6. LINDEX key index : 특정 인덱스의 데이터를 조회. 음수사용가능.

명령>	lpush mylist value1 value2 value3 value4
결과>	4
명령>	lrange mylist 0 -1
결과>	0) value4
1) value3
2) value2
3) value1
명령>	lindex mylist 0
결과>	value4
명령>	lindex mylist 1
결과>	value3
명령>	lindex mylist -1
결과>	value1
명령>	lindex mylist -2
결과>	value2

7.LPOS key value : 값으로 인덱스 반환 (6.0.6 버전부터 사용가능)

명령>	rpush mylist A B C 1 2 3 C C
결과>	8
명령>	lpos mylist A
결과>	(integer) 0
명령>	lpos mylist C
결과>	(integer) 2   첫 번째 C의 순서가 조회됩니다.

 

RANK 옵션

명령>	lpos mylist C RANK 2 (2번째 C의 index반환)
결과>	(integer) 6
명령>	lpos mylist C RANK -1 (오른쪽 끝 부터 C조회 후 index반환)
결과>	(integer) 7

 

COUNT 옵션 : 같은 값이 여러 개 있을 경우 찾을 개수를 지정한다.

0을 지정시 전부 조회.

명령>	lpos mylist C COUNT 2
결과>	1) (integer) 2
2) (integer) 6
명령>	lpos mylist C COUNT 0
결과>	1) (integer) 2
2) (integer) 6
3) (integer) 7

 

MAXLEN 옵션

리스트에 값이 너무 많을 경우 지정한 값을 찾는데 부하가 많이 발생할 수 있다.

검색 수를 지정하여 제한할때 사용.

RANK, COUNT, MAXLEN 옵션을 같이 사용 가능하다.

명령>	lpos mylist C COUNT 0 MAXLEN 3
결과>	1) (integer) 2
명령>	lpos mylist C COUNT 0 MAXLEN 7
결과>	1) (integer) 2
2) (integer) 6

 

주의 사항

명령>	lpos mylist D
결과>	(nil) (찾는 값이 없을 경우)
명령>	lpos mylist D COUNT 0
결과>	(empty array) (count옵션 사용 시 값이 없을 때)

 

LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]


8. LSET key index value : 해당 인덱스의 값을 지정한 value로 바꿈. 음수 사용가능!

명령>	lpush mylist value1 value2 value3 value4
결과>	4
명령>	lrange mylist 0 -1
결과>	0) value4
1) value3
2) value2
3) value1
명령>	lset mylist 0 "XXXXX"
결과>	OK
명령>	lset mylist 2 "YYYYY"
결과>	OK
명령>	lset mylist -1 "ZZZZZ"
결과>	OK
명령>	lrange mylist 0 -1
결과>	0) XXXXX
1) value3
2) YYYYY
3) ZZZZZ

9. LINSERT key < BEFORE | AFTER > 기준value 지정value2 : 기준value 앞or뒤에 지정 value를 넣는다.

기준 데이터가 여러개일 경우는? => 왼쪽에서 첫번째 데이터를 기준으로 한다.

기준 데이터가 없을 경우는 ? => -1 반환

2.2.0버전부터 사용가능

명령>	lpush mylist value1 value3
결과>	1
명령>	lrange mylist 0 -1
결과>	0) value2
1) value1
명령>	linsert mylist after value3 value2    value3 뒤에 value2을 넣는다
결과>	3   입력 후 총 데이터 갯수를 리턴한다
명령>	linsert mylist before value3 value4    value3 앞에 value4을 넣는다
결과>	4
명령>	lrange mylist 0 -1
결과>	1) value4
2) value3
3) value2
4) value1

 

인덱스로 특정 위치에 데이터 넣기(Enterprise 서버에서 사용가능)

명령>	linsert mylist after 1 value7 by index
결과>	5
명령>	linsert mylist before -1 value8 by index
결과>	6

10. lrem key count value : 값으로 데이터 삭제.

count 양수일 경우 : 왼쪽부터 count 수 만큼 value 삭제.

count 음수일 경우 : 오른쪽부터 count수 만큼 value 삭제

count 0일 경우 : 지정한 value 전부 삭제.

삭제된 value의 개수를 리턴

 

명령>	lpush mylist value2 value2 value2 value1
결과>	4
명령>	lrange mylist 0 -1
결과>	0) value1
1) value2
2) value2
3) value2
명령>	lrem mylist 1 value2
결과>	1
명령>	lrange mylist 0 -1
결과>	0) value1
1) value2
2) value2
명령>	lrem mylist 0 value2
결과>	2   삭제된 value 개수를 리턴한다
명령>	lrange mylist 0 -1
결과>	0) value1

 

인덱스로 삭제 (Enterprise 서버에서 사용 가능)

인덱스를 사용하는 것이 value를 사용하는 것 보다 성능이 좋다.

음수 사용가능.

명령>	lrem mylist 1 by index
결과>	2
명령>	lrem mylist -1 by index
결과>	1

11. LRM key val* : 지정 패턴으로 value 삭제. ( enterprise 6.0.0 부터 사용가능)

  • * : 모든 문자 매치(match): h*llo -> hllo, heeeello, etc
  • ? : 1개 문자 매치(match): h?llo -> hallo, hello, hxllo, etc
  • [alphabet] : 대괄호 안에 있는 문자 매치(match): h[ae]llo -> hallo, hello
  • [^e] : 대괄호 안에 있는 문자 제외하고 매치(match): h[^e]llo -> hallo, hbllo, ... 그러나 hello는 제외됨.
  • [a-c] : 대괄호 안에 있는 문자 범위로 매치(match): h[a-c]llo -> hallo, hbllo, hcllo
  • \ : 위에 사용한 특수문자(*?[^])를 그대로 사용하려면 앞에 \를 붙이세요.
명령>	lpush mylist value11 value12 value21 value22
결과>	4
명령>	lrm mylist value1*
결과>	2
명령>	lls mylist *
결과>	1) value22
2) value21

12. LTRIM key start stop : 지정한 범위만 데이터를 남기고 나머지 데이터 삭제

음수 사용가능(리버스 인덱스)

명령>	lpush mylist value1 value2 value3 value4
결과>	4
명령>	lrange mylist 0 -1
결과>	0) value4
1) value3
2) value2
3) value1
명령>	ltrim key 1 2
결과>	OK
명령>	lrange key 0 -1
결과>	1) value3
2) value2

 

주의 사항

명령>	ltrim key 10 10
결과>	OK   (모두 지워짐)
명령>	lrange key 0 -1
결과>	   (결과 없음)

13. LMOVE key1 key2(destination) <LEFT | RIGHT>(key1)   <LEFT | RIGHT>(key2)   

=> key1에서 left(head) OR right(tail) 데이터를 꺼내어 key2의 left OR right에 적재.

version 6.2.0 부터 사용 가능.

명령>	lpush src_key msg_1 msg_2 msg_3
결과>	3
명령>	lpush dest_key msg_A msg_B msg_C
결과>	3
명령>	lmove src_key dest_key left left
결과>	msg_3
명령>	lrange src_key 0 -1
결과>	1) "msg_2"
2) "msg_1"
명령>	lrange dest_key 0 -1
결과>	1) "msg_3"
2) "msg_C"
3) "msg_B"
4) "msg_A"

14. RPOPLPUSH key1 key2 : key1의 끝 데이터를 꺼내 key2의 맨 앞에 적재.

이 명령은 원자적으로 동작

1.2.0 버전부터 사용가능

명령>	lpush src_key msg_1 msg_2 msg_3
결과>	3
명령>	lpush dest_key msg_A msg_B msg_C
결과>	3
명령>	rpoplpush src_key dest_key
결과>	msg_1
명령>	lrange src_key 0 -1
결과>	0) msg_3
1) msg_2
명령>	lrange dest_key 0 -1
결과>	0) msg_1
1) msg_C
2) msg_B
3) msg_A

 

Circular list(환형 리스트)

명령>	lpush key msg_1 msg_2 msg_3
결과>	3
명령>	lrange key 0 -1
결과>	0) msg_3
1) msg_2
2) msg_1
명령>	rpoplpush key key
결과>	msg_1
명령>	lrange key 0 -1
결과>	0) msg_1
1) msg_3
2) msg_2

15. LPUSHX key value : 키가 있을경우에만 맨 앞에 데이터 저장.

RPUSHX key value : 키가 있을경우에만 맨 에 데이터 저장.

2.2.0 버전부터 사용가능

명령>	lpush mylist Hello
결과>	1
명령>	lpushx mylist Redis
결과>	2
명령>	lpushx mylist2 World   존재하지 않는 key에 입력할 수 없다. 0을 리턴한다.
결과>	0
명령>	exists mylist2
결과>	0

16. BLPOP key <timeout seconds> : 데이터가 있을명우는 LPOP과 같은 명령어. 없을 경우는 지정한 초만큼 대기 후 꺼내옴.

timeout seconds가 0 이면 데이터가 적재될 때까지 대기후 적재되면 꺼내온다.

BRPOP key <timeout seconds>

2.0.0 버전부터 사용가능.


17. BLMOVE key1 key2(destination)  <LEFT|RIGHT> <LEFT|RIGHT> <timeout> 

대기 후 리스트간 데이터 이동

6.2.0 버전 부터 사용가능


18. BRPOPLPUSH key1 key2 timeout : 대기 후 데이터 들어오면 맨끝데이터를 목적key의 왼쪽에 적재

timeout이 0일때, 데이터가 입력될때까지 기다린다.

2.2.0 버전부터 사용가능.

 

 

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

'Redis' 카테고리의 다른 글

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