DB/Redis
[Redis] Strings, Lists
jungmin.park
2023. 12. 19. 14:03
본 강의는 인프런에서 수강한 내용을 바탕을 작성된 게시글입니다.
Strings
문자열, 숫자, serialized object(JSON string) 등 저장
대부분의 문자열 연산은 O(1)이다.
- set : 문자열의 값을 저장합니다.
- setnx : 키가 아직 존재하지 않는 경우에만 문자열 값을 저장합니다. 잠금을 구현하는데 유용
- get : 문자열 값을 검색합니다.
- mget : 단일 작업으로 여러 문자열 값을 검색합니다.
SET, GET
127.0.0.1:6379> set lecture inflearn-redis
OK
127.0.0.1:6379> get lecture
"inflearn-redis"
127.0.0.1:6379> set object '{"lecture" : "inflearn-redis", "language":"en"}'
OK
127.0.0.1:6379> get object
"{\"lecture\" : \"inflearn-redis\", \"language\":\"en\"}"
127.0.0.1:6379> set inflearn-redis:ko:price 200
OK
127.0.0.1:6379> get inflearn-redis:ko:price
"200"
jedis.set("lecture", "inflearn-redis");
System.out.println(jedis.get("lecture"));
jedis.set("object", "{'lecture' : 'inflearn-redis', 'language':'en'}");
System.out.println(jedis.get("object"));
jedis.set("inflearn-redis:ko:price", "200");
System.out.println(jedis.get("inflearn-redis:ko:price"));
- set key value
- value로는 숫자, 문자열, object 등 저장가능
- json은 다시 파싱해서 사용해주어야 한다.
- get key
- set inflearn-redis:ko:price 200
- 강좌가 어떤 언어로 만들어져있고 가격이 얼마인지 저장하고 싶을때 다음과 같이 정의
- 필수 규칙사항은 아니다.
> SET bike:1 Deimos
OK
> GET bike:1
"Deimos"
// Strings
String res1 = jedis.set("bike:1", "Deimos");
System.out.println("res1 = " + res1);
System.out.println("jedis.get(bike:1) = " + jedis.get("bike:1"));
MSET, MGET
127.0.0.1:6379> MSET price 100 language ko
OK
127.0.0.1:6379> get price
"100"
127.0.0.1:6379> get language
"ko"
127.0.0.1:6379> MGET price language
1) "100"
2) "ko"
jedis.mset("price", "100", "language", "ko");
System.out.println(jedis.get("price"));
System.out.println(jedis.get("language"));
System.out.println(jedis.mget("price", "language"));
- MSET key1 value2 key2 value2 ...
- 다수의 String 타입을 한 번에 저장하는 명령어
- MGET key1 key2 key3 ...
- 다수의 키의 값을 한 번에 반환하는 명령어
INCR
스트링 값을 1올릴때 사용
127.0.0.1:6379> incr price
(integer) 101
127.0.0.1:6379> incrby price 20
(integer) 121
jedis.incr("price");
System.out.println(jedis.get("price"));
jedis.incrBy("price", 20);
System.out.println(jedis.get("price"));
- incr key
- Strings 값을 1올릴때 사용
- incrby key [올릴 값]
- Strings 값에 특정 값을 더할 때 사용
Lists
String을 Linked List로 저장 -> push / pop에 최적화 O(1)
Queue(FIFO) / Stack(FILO) 구현에 사용
- LPUSH : 헤드에 새 요소를 추가한다.
- RPUSH : 꼬리에 새 요소를 추가한다.
- LLEN : 길이를 반환한다.
- LMOVE : 한 목록에서 다른 목록으로 원자적으로 이동
- LTRIM : 목록을 지정된 요소 범위로 줄인다.
LPUSH, RPOP, LPOP
127.0.0.1:6379> lpush queue job1 job2 job3
(integer) 3
127.0.0.1:6379> rpop queue
"job1
jedis.lpush("queue", "job1", "job2", "job3");
System.out.println(jedis.rpop("queue"));
- lpush key [value1, value2, value3]
- 다음과 같이 job1, job2, job3 로 데이터가 들어간다면 다음과 같이 들어가게 된다.
- 여기서 rpop을 하게 되면 가장 오른쪽에 있는 job1이 출력되고 데이터는 삭제된다.
job3 | job2 | job1 |
127.0.0.1:6379> lpush stack job1 job2 job3
(integer) 3
127.0.0.1:6379> lpop stack
"job3"
- lpush 한 후 lpop를 하는 경우 stack로 사용될 수 있다.
LRANGE
127.0.0.1:6379> lpush queue job4 job5
(integer) 4
127.0.0.1:6379> lrange queue 0 -1
jedis.lpush("queue", "job4", "job5");
System.out.println(jedis.lrange("queue", 0, -1));
left | job5 | job4 | job3 | job2 | right |
0(-5) 1(-4) 2(-3) 3(-2) 4 (-1)
- lrange queue 0 -1
lrange은 왼쪽부터 0이며 오른쪽은 -1부터 시작한다.
127.0.0.1:6379> lrange queue 0 -1
1) "job5"
2) "job4"
3) "job3"
4) "job2"
127.0.0.1:6379> lrange queue -2 -1
1) "job3"
2) "job2"
127.0.0.1:6379> lrange queue 2 3
1) "job3"
2) "job2"
LTRIM
지정된 영역만 남길 수 있다.
127.0.0.1:6379> ltrim queue 0 1
OK
127.0.0.1:6379> lrange queue 0 -1
1) "job5"
2) "job4"
System.out.println(jedis.ltrim("queue", 0, 1));
System.out.println(jedis.lrange("queue", 0, -1));