Python で Redis データベースのすべてのキーを取得する

Olorunfemi Akinlua 2024年2月15日
  1. keys() を使用して、Redis データベースのすべてのキーを取得する
  2. scan_iter() を使用して、Redis データベースのすべてのキーを取得する
  3. zip_longest を使用して Redis データベースのすべてのキーを取得する
Python で Redis データベースのすべてのキーを取得する

JSON を知っていれば、Redis の設計システムになじみがあるでしょう。 key-value 構造と分散およびインメモリ アプローチを使用して、回復力のあるデータベースを実現します。

ハッシュ、リスト、セット、ソート済みセット、文字列、JSON、およびストリームは、Redis がサポートする多くのデータ構造の 1つです。 このオープンソース データベースは、Python を含むさまざまな言語をサポートしています。Python を使用してバックエンド システムを開発している場合は、いくつかのモジュールとパッケージが役立ちます。

データベースでよく行う多くの操作の 1つはデータの取得です。Redis のようなデータベースでは、そのような操作を行うためにキーが重要です。

この記事では、Redis データベース内のすべてのキーの取得について説明します。

keys() を使用して、Redis データベースのすべてのキーを取得する

redis を利用するには、それをインストールする必要があります。 Redis ダウンロード ページ でその方法を確認できます。 Linux および macOS ユーザーにとっては、非常に簡単です。 ただし、Windows ユーザーの場合は、Windows Subsystem for Linux (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 パッケージは wraptpyparsingasync-timeoutpackaging、および非推奨のモジュールを使用してそのモジュールを強化します。

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() メソッドは key-value ペアをデータベースに適用し、StrictRedis() メソッドはデータベースへのアクセスを提供する Redis 接続オブジェクトを作成します。

GUI を介してデータベース (別名 Temp) とそのキーを表示するには、画像に示すように RedisInsight アプリケーションを使用できます。

RedisInsight

key() メソッドをテストするために、合計 11 個のキーが手動でデータベースに追加されました。

次に、key() メソッドに対して、StrictRedis() メソッドを使用して、キーにアクセスするための Redis 接続オブジェクトを作成する必要があります。 hostport、および decode_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