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));

 

 

Reference


https://linuxhint.com/redis-lset/