TIL

4_3.Redis 데이터 타입 활용

꿀승 2025. 1. 16. 15:09
728x90
반응형
SMALL

학습내용

  1. Redis 주요 데이터 타입
  2. Redis 데이터 타입 활용 예제
  3. Redis CLI 기본명령어 (간단)

학습정리

1. Redis 주요 데이터 타입

public void redisTypeExample() {
  log.info("RedisTypeExample");

  //===String==========
  //하나의 키에 하나의 문자열, 숫자 데이터 저장
  //숫자를 문자로 저장해도 숫자로 인식을 해서 더하기 빼기가 가능
  jedis.set("username", "꿀승");
  jedis.set("userAge", "30");

  String name = jedis.get("username");
  String age = jedis.get("userAge");

  log.info("[redisTypeExample] name:{}, age:{}", name, age);

  jedis.incr("userAge");
  age = jedis.get("userAge");
  log.info("[redisTypeExample] age:{}", age);

  jedis.decr("userAge");
  age = jedis.get("userAge");
  log.info("[redisTypeExample] age:{}", age);

  //===List==========
  //삽입순서를 유지하며, FIFO, LIFO 방식으로 더이터 처리 가능
  //하나의 키에 여러 값을 저장
  //기본적으로 한방향으로 정해서 사용
  jedis.rpush("Tasks1","task1","task2","task3");
  //Task1 : task1->task2->task3  rpush 는 왼쪽->오른쪽으로 가면서 저장

  jedis.lpush("Tasks2","task1","task2","task3");
  //Task2 : task3->task2->task1  lpush 는 오른쪽->왼쪽으로 가면서 저장

  String tasks1 = jedis.lpop("Tasks1"); //왼쪽부터 제거 =>task1
  String tasks2 = jedis.rpop("Tasks1"); //오른쪽부터 제거 =>task3

  log.info("[redisTypeExample] tasks1:{}, tasks2:{}", tasks1,tasks2);

  String tasks3 = jedis.lpop("Tasks2"); //왼쪽부터 제거 =>task3
  String tasks4 = jedis.rpop("Tasks2"); //오른쪽부터 제거 =>task1

  log.info("[redisTypeExample] tasks3:{}, tasks4:{}", tasks3,tasks4);

  //========Set===========
  //중복을 허용하지 않는 데이터 구조, 순서없음
  //다양한 집합 연산이 가능(교집합,합집합,차집합) 지원
  jedis.sadd("event1", "user1", "user2");
  jedis.sadd("event2", "user2", "user3");

  //교집합
  Set<String> commonUser = jedis.sinter("event1", "event2");
  log.info("[redisTypeExample] commonUser:{}", commonUser); //user2


  //========Hash=======
  //구조 : 레디스키 :{ 키 : 벨류}
  //레디스키 userId는 실제사용시에는 db의 id 값
  jedis.hset("userId", "name", "꿀승");
  jedis.hset("userId", "email", "email@email.com");
  jedis.hset("userId", "age", "30");

  String userName = jedis.hget("userId", "name"); //꿀승
  Map<String, String> userProfile = jedis.hgetAll("userId");

  log.info("[redisTypeExample] userName:{}", userName);
  log.info("[redisTypeExample] userProfile:{}", userProfile); //{name=꿀승, email=email@email.com, age=30}

  //=======Sorted set (정렬된 집합)======
  //값과 점수를 저장하여 점수기준으로 정렬, 특정 범위 데이터를 효율적으로 조회 가능
  //key, score, value 순
  jedis.zadd("leaderboard", 1500, "player1");
  jedis.zadd("leaderboard", 2000, "player2");

  //0은 시작지점, 1은 끝나는 지점 인덱스처럼
  // start,stop 은 각각의 지점을 말하는 것
  // 0, -1 은 전부나옴
  //zrange 스코어 낮은거 부터, 오름차순
  //zrevrange 스코어 높은거 부터, 내림차순
  List<String> players1 = jedis.zrange("leaderboard", 0, 1);
  log.info("[redisTypeExample] players1:{}", players1); // player1(1500) ->player2(2000)

  //해당 스코어 더하기
  jedis.zincrby("leaderboard", 1000, "player1");
  List<String> players2 = jedis.zrange("leaderboard", 0, 1);
  log.info("[redisTypeExample] players2:{}", players2); // player2(2000) ->player1(2500)
}

2. Redis 데이터 타입 활용 예제

  • 문자열 데이터를 사용한 캐싱

    public void redisStringExample() {
        //{userId} 실제 id 값
        jedis.set("user-{userId}-name", "꿀승");
    
        String value = jedis.get("user-{userId}-name");
        log.info("[redisStringExample] value:{}", value);
    
          //만료시간 설정 (1시간)
        jedis.expire("user-{userId}-name", 3600);
    
        //만료시간 확인
        long ttl = jedis.ttl("user-{userId}-name");
        log.info("[redisStringExample] ttl:{}", ttl); //ttl:3600
    }
  • 리스트와 큐 구현

      public void redisListExample() {
        jedis.lpush("tasks123","Task1","Task2","Task3"); //Task3->Task2->Task1
    
        long queueSize = jedis.llen("tasks123"); //사이즈
        log.info("[redisListExample] queueSize:{}", queueSize);
    
        //선입선출 FIFO
        String task = jedis.rpop("tasks123"); //rpop이니깐 Task1 꺼내기
        log.info("[redisListExample] task:{}", task);
        //만약 rpush로 넣고 rpop으로 가져오면  Task1->Task2->Task3 으로 들어가고 그중 오른쪽꺼를 꺼내니 LIFO
    
        //llen으로 구한 사이즈만큼 반복문 돌면서 꺼내기 가능
        //  for (int i =0; i< queueSize; i++) {
        //    String taskValue = jedis.rpop("tasks123"); //rpop이니깐 Task1 꺼내기
        //    log.info("[redisListExample] task:{}", taskValue);
        //  }
    
          //잔여 전체 가져오기
          log.info("[redisListExample] task:{}", jedis.lrange("tasks123", 0, -1)); //[Task3, Task2]
      }
    
  • 해시를 활용한 키-값 관리

    public void redisHashExample() {
      //단건으로 가져올지 map으로 가져올지 판단 후 사용
      jedis.hset("user:34534", "name", "꿀승");
      jedis.hset("user:34534", "email", "email@email.com");
      jedis.hset("user:34534", "age", "30");
    
      String value = jedis.hget("user:34534", "name"); //꿀승
      log.info("[redisHashExample] value:{}", value);
    
      log.info("info : {}",jedis.hgetAll("user:34534"));
      Map<String, String> userProfile = jedis.hgetAll("user:34534");
      log.info("[redisHashExample] userProfileName:{}", userProfile.get("name"));
    }
  • 정렬된 집합을 활용한 리더보드 관리

    public void redisSortedSetExample() {
      jedis.zadd("leaderboard1", 1500, "player1");
      jedis.zadd("leaderboard1", 2000, "player2");
      jedis.zadd("leaderboard1", 1200, "player3");
    
      //상위 2명
      List<String> topPlayer = jedis.zrevrange("leaderboard1", 0, 1);
      log.info("[redisSortedSetExample] topPlayer:{}", topPlayer); //[player2,player1]
      // 하위 2명의 순위 조회 (점수 오름차순)
      List<String> topPlayersAsc = jedis.zrange("leaderboard1", 0, 1);
      log.info("RedisSortedSetExample topPlayers Asc: {}", topPlayersAsc); //[player3,player1]
    
      //스코어 1000 add
      jedis.zincrby("leaderboard1",1000,"player1");
      // 특정 플레이어 점수 조회
      Double score = jedis.zscore("leaderboard1", "player1");
      log.info("RedisSortedSetExample score : {}", score); //2500
    }
    

3. Redis cli 명령어

  • 만료시간 설정 : EXPIRE [KEY] [시간] : EXPIRE user 3600.
  • 남은 만료시간 확인 : TTL [KEY] : TTL user
  • 데이터 삭제 : DEL [KEY] : DEL user
  • 모든 Key 조회 : KEYS *
  • 모든 Key 개수확인 : DBSIZE
  • 모든 데이터 삭제 : FLUSHALL

참고자료

  • Redis CLI 기본 명령어 : Redis
728x90
반응형
LIST