[Redis] Sorted Set 데이터 운영 - (Jedis)

2024. 4. 15. 16:31기술 창고/DataBase

728x90
SMALL

Redis의 Sorted Set은 말 그대로 정렬된 Set 데이터를 말합니다.

기존의 일반 Set은 정렬되지 않는 특징을 갖고 있지만 Sorted Set은 정렬된 데이터를 말합니다.

 

주요 명령어

- ZADD

- ZREM

- ZRANGE

- ZCARD

- ZRANK

- ZREVRANK

- ZINCRBY

 

 


Command 실습

ZADD

zadd는 Sorted Set에 데이터를 넣어줄 때 사용되는 명령어입니다.

다중으로 데이터를 넣어줄 수 있습니다.

Set과 마찬가지로 중복을 허용하지 않기 때문에 새로운 데이터로 업데이트 됩니다.

- 형식 : zadd {Sorted Set 명} {정렬될 필드 값} {데이터 값} {정렬될 필드 값2} {데이터 값2} ...

 

 

 

ZRANGE

zrange는 Sorted Set의 특정 구간 까지의 데이터들을 정렬하여 출력하는 명령어입니다.

- 오름차순 형식 : zrange {Sorted Set 명} 0 +inf byscore limit {시작 인덱스} {끝 인덱스}

- 내림차순 형식 : zrange {Sorted Set 명} +inf 0 byscore rev limit {시작 인덱스} {끝 인덱스}

 

내림차순 정렬을 수행할 때는 반드시 rev 옵션이 붙어있어야 하며, 마지막에 withscores 옵션을 붙이게 되면 정렬된 필드와 데이터값을 같이 보여주게 됩니다.

그리고 byscores 이외에 bylex 옵션도 존재하는데, 이는 String 타입의 문자 데이터에 한해 정렬을 수행하게 해주는 옵션입니다.

 

 

ZREM

zrem은 Sorted Set의 특정 데이터를 삭제하는 명령어입니다.

- 형식 : zrem {Sorted Set 명} {데이터 값}

 

 

 

ZCARD

zcard는 Sorted Set에 존재하는 데이터 수를 출력하는 명령어입니다.

- 형식 : zcard {Sorted Set 명}

 

 

 

ZRANK

zrank는 현재 Sorted Set 에 존재하는 특정 데이터가 몇 순위(인덱스) 에 위치하고 있는지 나타내주는 명령어입니다.

- 형식 : zrank {Sorted Set 명} {데이터 값}

 

현재 user1이 가장 첫 번째에 위치하고 있으므로 0이 조회되고, user3는 두 번째에 위치하고 있으므로 1이 조회됩니다.

 

 

ZREVRANK

zrevrank는 현재 위치하고 있는 데이터들을 역순으로 조회하여 순위를 나타내주는 명령어입니다.

- 형식 : zrevrank {Sorted Set 명} {데이터 값}

 

원래 user1이 가장 첫 번째에 위치하고 있으나 reverse 됨으로써 user3가 첫 순위로 올라가 0이 조회되고, user1이 두 번째 순위로 내려가서 1이 조회됩니다.

 

 

ZINCRBY

zincrby는 Sorted Set에 존재하는 특정 데이터의 정렬 기준 데이터를 원자적으로 증가시켜주는 명령어입니다.

만약 특정 데이터가 존재하지 않으면 생성 후 데이터를 넣어줍니다.

- 형식 : zincrby {Sorted Set 명} {증가 수량} {데이터 값}

 

 

 


Spring Boot 사전 연동 필요

https://jindevelopetravel0919.tistory.com/395

 

[Redis] Spring Boot 와 Redis 연동 설정 - (Jedis)

Spring Boot 환경에서 Redis 를 사용하기 위한 방법 중 하나인 Jedis 설정 과정과 연동 과정에 대해 정리해보겠습니다. 또한 제가 진행하고자 하는 Spring Boot는 gradle 환경입니다. (1) Dependency 추가 Build.gra

jindevelopetravel0919.tistory.com

 

Spring Boot 활용 실습

// Redis - Sorted Set
public void jedisOfSortedSet() {
    try (JedisPool pool = jedisPoolSetting()) {
        try (Jedis jedis = pool.getResource()) {
            // [ ZADD ]
            HashMap<String, Double> scores = new HashMap<>();
            scores.put("user1", 100d);
            scores.put("user2", 30d);
            scores.put("user3", 50d);
            scores.put("user4", 80d);
            scores.put("user5", 15d);

            // zadd를 통한 정렬된 set에 데이터 저장 (HashMap을 통해 다수의 데이터를 한번에 저장 가능)
            jedis.zadd("game2:scores", scores);

            // [ ZRANGE ]
            // zrange를 통한 특정 set의 정렬된 값들 조회
            List<String> zrange = jedis.zrange("game2:scores", 0, Long.MAX_VALUE);
            zrange.forEach(System.out::println);

            // zrangeWithScores를 통한 특정 Set의 필드값과 스코어(값)들을 함께 조회
            List<Tuple> tuples = jedis.zrangeWithScores("game2:scores", 0, Long.MAX_VALUE);
            tuples.forEach(tuple -> System.out.println(tuple.getElement() + " : " + tuple.getScore()));

            // [ ZCARD ]
            // zcard를 통한 특정 set의 필드 데이터 수
            System.out.println(jedis.zcard("game2:scores"));

            // [ ZINCRBY ]
            // zincrby를 통한 특정 Set의 특정 필드의 데이터를 증량
            jedis.zincrby("game2:scores", 100d, "user5");
            List<Tuple> tuples2 = jedis.zrangeWithScores("game2:scores", 0, Long.MAX_VALUE);
            tuples2.forEach(tuple -> System.out.println(tuple.getElement() + " : " + tuple.getScore()));
        }
    }
}

 

결과

 

728x90
반응형
LIST