Python으로 Redis 데이터베이스의 모든 키 가져오기

Olorunfemi Akinlua 2023년6월21일
  1. keys()를 사용하여 Redis 데이터베이스의 모든 키 가져오기
  2. scan_iter()를 사용하여 Redis 데이터베이스의 모든 키 가져오기
  3. zip_longest를 사용하여 Redis 데이터베이스의 모든 키 가져오기
Python으로 Redis 데이터베이스의 모든 키 가져오기

Redis 디자인 시스템은 JSON을 알고 있다면 익숙할 것입니다. 탄력적인 데이터베이스를 달성하기 위해 키-값 구조와 분산 및 메모리 내 접근 방식을 사용합니다.

해시, 목록, 세트, 정렬된 세트, 문자열, JSON 및 스트림은 Redis가 지원하는 많은 데이터 구조 중 하나입니다. 이 오픈 소스 데이터베이스는 Python을 비롯한 다양한 언어를 지원하며 이를 사용하여 백엔드 시스템을 개발하는 경우 일부 모듈과 패키지가 도움이 됩니다.

데이터베이스로 자주 수행하는 많은 작업 중 하나는 데이터 검색이며 Redis와 같은 데이터베이스에서 키는 이러한 작업을 수행하는 데 중요합니다.

이 기사에서는 Redis 데이터베이스의 모든 키를 가져오는 방법에 대해 설명합니다.

keys()를 사용하여 Redis 데이터베이스의 모든 키 가져오기

redis를 사용하려면 이를 설치해야 합니다. 방법은 Redis 다운로드 페이지를 통해 확인하실 수 있습니다. Linux 및 macOS 사용자의 경우 훨씬 쉽습니다. 그러나 Windows 사용자의 경우 Linux용 Windows 하위 시스템(WSL2)을 사용해야 할 수 있으며 해당 지침비디오 가이드을 따를 수 있습니다.

Redis 데이터베이스가 설정되어 있다고 가정하고 Redis 데이터베이스에 대한 클라이언트 액세스를 제공하는 redis 패키지를 설치합니다. 설치하려면 pip 명령을 사용합니다.

pip install redis

출력:

Collecting redis
  Downloading redis-4.3.4-py3-none-any.whl (246 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 246.2/246.2 kB 794.4 kB/s eta 0:00:00
Collecting deprecated>=1.2.3
  Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)
Collecting async-timeout>=4.0.2
  Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)
Collecting packaging>=20.4
  Downloading packaging-21.3-py3-none-any.whl (40 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.8/40.8 kB 1.9 MB/s eta 0:00:00
Collecting wrapt<2,>=1.10
  Downloading wrapt-1.14.1-cp310-cp310-win_amd64.whl (35 kB)
Collecting pyparsing!=3.0.5,>=2.0.2
  Downloading pyparsing-3.0.9-py3-none-any.whl (98 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.3/98.3 kB 624.8 kB/s eta 0:00:00
Installing collected packages: wrapt, pyparsing, async-timeout, packaging, deprecated, redis
Successfully installed async-timeout-4.0.2 deprecated-1.2.13 packaging-21.3 pyparsing-3.0.9 redis-4.3.4 wrapt-1.14.1

따라서 redis 패키지는 wrapt, pyparsing, async-timeout, packaging 및 더 이상 사용되지 않는 모듈을 사용하여 해당 모듈에 전원을 공급합니다.

redis 패키지를 사용하려면 가져와야 합니다.

import redis

주요 문제로 이동하여 redis 모듈에서 제공하는 keys() 메서드를 사용하여 모든 키에 액세스하고 가져올 수 있습니다.

key() 메서드는 지정된 Redis 데이터베이스에서 인수 내에 전달된 패턴과 일치하는 키 목록을 반환합니다. 인수가 전달되지 않으면 기본 패턴이 있으며, 이는 모든 키를 의미하는 *입니다.

작업 중인 메서드를 보여주기 위해 +Key 버튼 또는 다음 코드를 사용하여 몇 가지 키로 redis 데이터베이스를 Temp라는 별칭으로 수동으로 미리 채웠습니다.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

r = redis.StrictRedis(host=redisHost, port=redisPort, decode_responses=redisDecodeRes)

r.set("ConnectionPool", "Ox1212af34w3141")

위의 코드는 ConnectionPool 키를 해당 값과 함께 Temp 데이터베이스에 추가합니다.

set() 메서드는 키-값 쌍을 데이터베이스에 적용하고 StrictRedis() 메서드는 데이터베이스에 대한 액세스를 제공하는 Redis 연결 개체를 생성합니다.

GUI를 통해 데이터베이스(별칭 Temp 사용)와 해당 키를 표시하려면 이미지에서 볼 수 있는 RedisInsight 애플리케이션을 사용할 수 있습니다.

RedisInsight

key() 메서드를 테스트하기 위해 총 11개의 키가 수동으로 데이터베이스에 추가되었습니다.

이제 key() 메소드로 StrictRedis() 메소드를 사용하여 키에 액세스하기 위한 Redis 연결 객체를 생성해야 합니다. 연결 매개변수를 정의하기 위해 host, portdecode_responses 인수가 전달됩니다.

hostport는 호스트 이름과 포트 번호를 정의하고 decode_responses는 전달된 데이터가 쉽게 작업할 수 있는 Python 문자열로 디코딩됨을 정의합니다. keys() 메서드는 인수가 전달되지 않았기 때문에 사용 가능한 모든 키에 액세스합니다.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

r = redis.StrictRedis(
    host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
)

print(r.keys())

출력:

['bar-two', 'information', 'bar-one', 'details', 'foo', 'jinku', 'bar', 'User-One', 'delft', 'bar-three', 'ConnectionPool']

작업할 수 있는 Temp 데이터베이스의 모든 키 목록이 있습니다.

필요한 키 패턴이 있으면 인수로 전달할 수 있습니다. bar로 시작하는 모든 키를 나열해 보겠습니다.

print(r.keys(pattern="bar*"))

출력:

['bar-two', 'bar-one', 'bar', 'bar-three']

scan_iter()를 사용하여 Redis 데이터베이스의 모든 키 가져오기

대규모 데이터베이스에서 scan_iter()를 사용하면 Python 애플리케이션 내에서 데이터를 더 잘 관리할 수 있습니다. 또한 key() 메서드는 서버를 차단하고 다른 사용 작업을 방지하며 scan_iter()를 사용하면 배치 기반 작업을 통해 다른 사용 작업을 허용합니다.

keys()가 더 빠를 수 있지만 다중 요청 기반 시스템에는 적합하지 않습니다.

이제 실제로 작동하는 것을 봅시다.

import redis

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

try:
    r = redis.StrictRedis(
        host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
    )
    for key in r.scan_iter(match="bar*"):
        print(key)
except Exception as e:
    print(e)

출력:

bar-three
bar-one
bar-two
bar

try/except를 사용하면 데이터베이스 작업을 시도할 때 연결 문제를 처리하는 데 도움이 됩니다. StrictRedis()를 사용하여 연결한 후 match 인수를 사용하여 찾고 있는 키 패턴을 정의하고 결과를 반복하여 키를 제공합니다.

zip_longest를 사용하여 Redis 데이터베이스의 모든 키 가져오기

우리가 말했듯이 키가 많은 더 큰 데이터베이스의 경우 scan_iter() 방법이 더 좋지만 결과를 더 잘 관리하기 위해 지정된 수의 배치로 키를 검색하여 더 개선할 수 있습니다.

batch를 생성하려면 다양한 경우에 사용할 수 있는 다양한 반복기(또는 메서드)를 제공하는 itertools 모듈이 필요합니다. itertools 모듈 내에는 .next() 메서드가 튜플을 반환하고 전달된 iterable에서 요소를 집계하는 zip_longest 객체를 반환하는 zip_longest 메서드가 있습니다.

zip_longest() 메소드를 사용하여 전달된 인수에 따라 지정된 수의 키 배치를 생성하는 함수를 만들 수 있습니다. 예를 들어 많은 경우에 사용할 수 있는 2개의 배치를 만듭니다.

import redis
from itertools import zip_longest

redisHost = "localhost"
redisPort = 6379
redisDecodeRes = True

try:
    r = redis.StrictRedis(
        host=redisHost, port=redisPort, decode_responses=redisDecodeRes, db=0
    )

    def batch(iterable, num):
        initIter = [iter(iterable)] * num
        return zip_longest(*initIter)

    for keyBatch in batch(r.scan_iter("bar*"), 2):
        print(keyBatch)
except Exception as e:
    print(e)

출력:

('bar-three', 'bar-one')
('bar-two', 'bar')
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn