見出し画像

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の数を指定しています。

ここまでお読みいただきありがとうございました!

参考


この記事が気に入ったらサポートをしてみませんか?