よっしー
こんにちは。よっしーです(^^)
今日は、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データベース内のキーをスキャンして特定のパターンに一致するキーを削除するためのものです。以下にコードの主な部分を解説します。
cursor=-1
:
- スキャンの開始位置を示す変数。初期値は-1に設定されています。
pattern=test_key_1*
:
- Redisの
SCAN
コマンドで使用される、キーの検索パターンを指定する変数。この例では、”test_key_1″で始まるキーに一致するものを検索します。
while [ $cursor -ne 0 ]; do
:
while
ループで、$cursor
が0でない限り続きます。スキャンの終了条件として使用されます。
[ $cursor -eq -1 ] && cursor=0
:
- ループの最初のイテレーションでは、
$cursor
が-1の場合、0に設定します。これにより、最初のSCANから始まります。
reply=$(redis-cli SCAN $cursor MATCH $pattern)
:
redis-cli
を使用してRedisデータベースをスキャンし、指定されたパターンに一致するキーの情報を取得します。SCAN
コマンドは、スキャンの現在の位置と一致するキーの一覧を返します。
cursor=$(echo "${reply}" | head -n 1)
:
SCAN
コマンドの結果から現在のカーソル位置を取得します。
keys=$(echo "${reply}" | tail -n +2)
:
SCAN
コマンドの結果から一致するキーの一覧を取得します。2行目から最後までの行が対象です。
[ -z "${keys}" ] && continue
:
- キーが見つからなかった場合はスキップし、次のイテレーションに進みます。
redis-cli DEL $keys &
:
DEL
コマンドを使用して、一致したキーを削除します。&
はバックグラウンドで実行するためのものです。
wait
:
- バックグラウンドで実行した削除コマンドが終了するのを待ちます。これにより、全ての削除が完了するまで待機します。
このスクリプトは、指定されたパターンに一致するRedisキーをスキャンして削除する単純なタスクを実行します。
おわりに
今日は、Redisで大量のテストデータを削除する方法についてご紹介しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント