Redis入門:大量データを削除する方法

スポンサーリンク
Redis入門:大量データを削除する方法 ノウハウ
Redis入門:大量データを削除する方法
この記事は約5分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Redisで大量のテストデータを削除する方法についてご紹介します。

スポンサーリンク

背景

Redisで大量のテストデータを削除する機会があったので、そのときの内容を備忘としてのこしました。

下記のサイトを参考にしました。

環境作成

ローカルにdockerでRedisの環境を作成しました。

作成ファイル一覧

下記のファイルを作成しました。

├── compose.yml
└── redis
    └── Dockerfile

compose.yml

version: '3.7'

services:

  redis:
    build: ./redis
    container_name: redis
    hostname: redis-source
    networks:
      - net

  redis-commander:
    image: rediscommander/redis-commander
    container_name: redis-commander
    environment:
      - REDIS_HOSTS=source:redis:6379
    ports:
      - "8081:8081"
    networks:
      - net

networks:
  net:

redis/Dockerfile

FROM redis:7.2.0-alpine

コンテナ起動

下記のコマンドでコンテナを起動させます。

docker compose build

docker compose up -d

データ投入

下記のコマンでデータを投入します。

docker compose exec -it redis sh

rm test.data

seq 1 100000 | xargs -P $(nproc) -i sh -c "echo SET test_key_{} test_value_{} EX 60" >> test.data

cat test.data | redis-cli --pipe

ブラウザで「http://localhost:8081/」にアクセスして、データが登録されていることを確認する。

データ削除

下記の内容で scan_del.sh をコンテナ内に作成します。

#!/bin/sh

cursor=-1
pattern=test_key_1*
while [ $cursor -ne 0 ]; do
    [ $cursor -eq -1 ] && cursor=0
    reply=$(redis-cli SCAN $cursor MATCH $pattern)
    cursor=$(echo "${reply}" | head -n 1)
    keys=$(echo "${reply}" | tail -n +2)
    [ -z "${keys}" ] && continue
    redis-cli DEL $keys &
done

wait

下記のコマンドを実行します。

sh scan_del.sh

終了後、ブラウザで「http://localhost:8081/」にアクセスして、データが削除されていることを確認します。

解説

このシェルスクリプトは、Redisデータベース内のキーをスキャンして特定のパターンに一致するキーを削除するためのものです。以下にコードの主な部分を解説します。

  1. cursor=-1:
  • スキャンの開始位置を示す変数。初期値は-1に設定されています。
  1. pattern=test_key_1*:
  • RedisのSCANコマンドで使用される、キーの検索パターンを指定する変数。この例では、”test_key_1″で始まるキーに一致するものを検索します。
  1. while [ $cursor -ne 0 ]; do:
  • whileループで、$cursorが0でない限り続きます。スキャンの終了条件として使用されます。
  1. [ $cursor -eq -1 ] && cursor=0:
  • ループの最初のイテレーションでは、$cursorが-1の場合、0に設定します。これにより、最初のSCANから始まります。
  1. reply=$(redis-cli SCAN $cursor MATCH $pattern):
  • redis-cliを使用してRedisデータベースをスキャンし、指定されたパターンに一致するキーの情報を取得します。SCANコマンドは、スキャンの現在の位置と一致するキーの一覧を返します。
  1. cursor=$(echo "${reply}" | head -n 1):
  • SCANコマンドの結果から現在のカーソル位置を取得します。
  1. keys=$(echo "${reply}" | tail -n +2):
  • SCANコマンドの結果から一致するキーの一覧を取得します。2行目から最後までの行が対象です。
  1. [ -z "${keys}" ] && continue:
  • キーが見つからなかった場合はスキップし、次のイテレーションに進みます。
  1. redis-cli DEL $keys &:
  • DELコマンドを使用して、一致したキーを削除します。&はバックグラウンドで実行するためのものです。
  1. wait:
  • バックグラウンドで実行した削除コマンドが終了するのを待ちます。これにより、全ての削除が完了するまで待機します。

このスクリプトは、指定されたパターンに一致するRedisキーをスキャンして削除する単純なタスクを実行します。

おわりに

今日は、Redisで大量のテストデータを削除する方法についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました