2023-05-01
【Redisメモ・1】インストール、CLI、C言語からのアクセス
【メモリの設定】
Redisはオンメモリで動作するため、使用するメモリ量の設定をする。
/etc/redis/redis.conf
# 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes # maxmemory <bytes> </bytes>
デフォルトではコメントアウトされている=物理メモリ最大まで使おうとすると思われる?ので、とりあえず物理メモリの半分ほど使う設定にする。
マシンのメモリ量確認 dmesg | grep Memory [ 0.126563] Memory: 3340408K/3605636K available (10252K kernel code, 1241K rwdata, 3320K rodata, 1592K init, 2276K bss, 265228K reserved, 0K cma-reserved) [ 0.609431] x86/mm: Memory block size: 128MB
↑3Gほどあるとのことなので、
maxmemory 1500mb
と、1.5GB使う設定。
続いて、データがこのメモリ量の上限に達した場合の振る舞いを決める。
# volatile-lru -> Evict using approximated LRU among the keys with an expire set. # allkeys-lru -> Evict any key using approximated LRU. # volatile-lfu -> Evict using approximated LFU among the keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU. # volatile-random -> Remove a random key among the ones with an expire set. # allkeys-random -> Remove a random key, any key. # volatile-ttl -> Remove the key with the nearest expire time (minor TTL) # noeviction -> Don't evict anything, just return an error on write operations. # maxmemory-policy noeviction
デフォルトはnoenviction=上限に達したら書き込みエラーを返して登録しない設定。
allkeys-lru は、未使用の時間が最も長いキーを削除して新しいものを登録する設定。
しかしこれは、「最近たまたま1回アクセスされたが通常ほとんど使用されないキーは生き残る」という紛れがある。対して、
allkeys-lfu は、使用頻度の統計を取った上で、最も不要と判断されたキーが削除される(らしい)。このアルゴリズムのデフォルトチューニング。
# lfu-log-factor 10 # lfu-decay-time 1
【データのファイルバックアップとリストア】
Redisはオンメモリのため、終了すると当然ながら、データはすべて消える。
それだと困るので、デフォルトではメモリの内容を定期的にファイルに保存する設定となっている。
save 900 1 # 900秒間に1回変更があったらバックアップ save 300 10 # 300秒間に10回変更があったらバックアップ save 60 10000 # 60秒間に10000回変更があったらバックアップ
このようなオートバックアップは不要もしくはredis-cliから手動で行いたい場合、
# save 900 1 # save 300 10 # save 60 10000 save ""
とする。
バックアップファイルはデフォルトで以下の場所設定になっている。必要なら適宜変更する。
# Note that you must specify a directory here, not a file name. dir /var/lib/redis # The filename where to dump the DB dbfilename dump.rdb
Redisは起動時、上記場所にバックアップファイル(/var/lib/redis/dump.rdb)が存在したら、自動でロードして(自動リストア)、スタートする。このため、メモリに何もない状態からスタートさせたい=自動リストア不要=場合、このファイルを退避しておく。以下は、その動作を確認するオペレーション。
1、バックアップファイルの存在を確認
ls -ltr /var/lib/redis/ total 4 -rw-rw---- 1 redis redis 182 Apr 30 15:57 dump.rdb
2、現在起動中のRedisのオンメモリデータ数の確認
redis-cli dbsize (integer) 7
3、7つあるのが確認できたので、Redisを終了する。
/etc/init.d/redis-server stop
4、バックアップファイルを退避する(名前を変える)
cd /var/lib/redis mv dump.rdb dump.rdb.org
5、この状態でRedisを起動する
/etc/init.d/redis-server start
6、ふたたびRedisのオンメモリデータ数の確認
redis-cli dbsize (integer) 0
0(データ無し)が確認できた。4、でバックアップファイルを退避したため、起動時に読み込まれなかったことを確認。
7、今度は正常にバックアップを読み込む動作を確認するため、一旦終了させる。
/etc/init.d/redis-server stop
8、退避したバックアップファイルを元に戻す
cd /var/lib/redis mv dump.rdb.org dump.rdb
9、Redisを起動する
/etc/init.d/redis-server start
10、Redisのオンメモリデータ数の確認
redis-cli dbsize (integer) 7
データが7つに復帰している=dump.rdbから自動でリストアしたのを確認できた。
【手動バックアップ】
save ""
と設定している(オートバックアップoff)ときは適時、自分でバックアップする。
redis-cli 127.0.0.1:6379> save OK
saveコマンドはその場で他の処理をすべて止めてdump.rdbを作るコマンド。終わるまで他のことはできない。
redis-cli bgsave Background saving started ...しばらく待って... lastsave (integer) 1588229824
bgsaveコマンドはバックグラウンドでdump.rdbの作成を開始し、他の処理ができる。
終わったかどうかはlastsaveコマンドで確認する。タイムスタンプが出力されれば完了している。
なお、手動リストアというのは無い模様。代わりに/etc/init.d/redis-server restart = 再起動が、リストアと等価である。
【AOF(Append Only file)方式を使用したバックアップ】
RDBスナップショットのほかにもう1つ、更新内容をファイルに蓄積していって、起動時リストアという方法=AOF方式もある。こちらのほうが、パフォーマンスは落ちるがリストアデータの信頼性は高くなる。
これを使用するredis.confの設定は以下。
appendonly yes appendfilename "appendonly.aof" # appendfsync always appendfsync everysec # appendfsync no
appendonlyをyesとすることでこのバックアップが開始され、/var/lib/redis/appendonly.aofというファイルに変更内容が書き込まれていき、次回再起動時ここから復帰する。
appendfsyncは変更内容書き込みのファイル反映=Cで言うfflush関数=をいつ行うか、という設定。alwaysは毎更新ごとにfflush関数を呼ぶためパフォーマンスは著しく低くなる。everysecは1秒ごとにfflushを呼ぶ(デフォルト)。noはredisでfflushを呼ばずOSの気分に任せるという設定。
なお、redis起動時、dump.rdbとappendonly.aofのどちらも存在した場合appendonly.aofが優先されRDBは無視される。ただこれは起動時そうだというだけで、AOFモード時にRDBバックアップができない、という訳ではない。よって安全を取り、パフォーマンスはともあれ以下のように両方を有効にする設定もあり。
save 900 1 save 300 10 save 60 10000 appendonly yes
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
HomeBrewでApache2を入れて自動起動つきで動かしPHPモジュールと連携する
macOSに標準付属のApacheを自動起動つきで動かす
HomeBrewでPostgreSQLを入れて自動起動つきで動かす
Windows版Google Driveが使用中と言われアンインストールできない場合
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
進研ゼミチャレンジタッチをAndroid端末化する
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
Googleスプレッドシートで図形をコピーして使いまわすには
【Linux】iconv/libiconvをソースコードからインストール
【Apache】サーバーに同時接続可能なクライアント数を調整する
Pythonで処理にかかった時間を計測するには
Windows11のコマンドプロンプトでテキストをコピーする