
Python_zstdを使ってRedisのデータを圧縮する #357日目
zstd (zスタンダード) は2015年にFacebookから出た圧縮ライブラリで、高速な圧縮処理が可能です。今回はzstdのPythonライブラリを使用して、Redisに保存してあるデータを圧縮する手順を整理しておきます。
Redisに保存してあるデータは、以下のようにハッシュ型になっているものとします。
hash01 --- key01 --- value01
| ` key02 --- value02
| ` key03 --- value03
|
hash02 --- key01 --- value01
| ` key02 --- value02
| ` key03 --- value03
|
hash03 --- key01 --- value01
` key02 --- value02
` key03 --- value03
以下のように記述することでRedisの各データ(value部分)を圧縮していけます。
import redis
import zstd
redis_conn = redis.StrictRedis()
# カーソル。0からスタートする。
cr = 0
while True:
# カーソルとハッシュ名のリストが取得できる
res_scan = redis_conn.scan(cr, match=f"hash*")
cr = res_scan[0]
hashes: list = res_scan[1]
if res_scan[1]:
for hash in hashes:
# 各ハッシュに入っているkeyのリストを取得
hkeys = redis_conn.hkeys(hash)
for hkey in hkeys:
# 各キーのバリューを取得
hvalue = redis_conn.hget(key, hkey)
# バリューを圧縮して上書きする
redis_conn.hset(key, hkey, zstd.compress(hvalue, 1))
if cr == 0:
break
crはカーソルを意味していて、これは0からスタートして一巡すると0に戻ります。これを利用して、crが0になったら繰り返しを抜けるようにできます。
zstd.compress()が圧縮している箇所になります。対象のデータを渡すと圧縮した値で返してくれます。第二引数の1はworker threadの数を指定しています。
ここまでお読みいただきありがとうございました!