この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンサル部のとばち(@toda_kk)です。
2022年5月のアップデートで、Amazon ElastiCache for RedisとAmazon MemoryDB for RedisでJSON形式のデータをサポート開始しました。
Redisのエンジンバージョンが 6.2 以上である必要がありますが、追加コストなくJSON形式によるデータ保存が利用できます。
JSON形式のデータといえば、AWSのマネージドサービスでも既にドキュメント指向のデータベースとしてMongoDB互換のAmazon DocumentDBがありますが、今回のアップデートにより例えばDocumentDBの前段にElastiCache for Redisを挟むことでJSONデータのキャッシュストアとして利用する、といった用途が考えられます。
JSON形式に関連するElastiCacheとMemoryDBでの対応の違い
JSON形式のサポート開始に際して、ElastiCacheとMemoryDBとでそれぞれ公式ドキュメントが公開されています。
JSON形式のデータを操作する際のコマンドや必要な権限について記載されています。
公式ドキュメントを参照する限りでは、ElastiCacheとMemoryDBとで基本的な違いはないのですが、1点だけ、CloudWatchで取得できるメトリクスに違いがありました。
ElastiCacheの場合、JsonBasedCmds
とJsonBasedCmdsLatency
がメトリクスとして新たに追加されていますが、MemoryDBの場合はJsonBasedCmds
のみとなっています。
ただ、これは2022年5月現在の情報であり、今後のアップデートによってMemoryDBでも対応されるかと考えられます。
ElastiCache for RedisでJSON形式のデータを操作してみる
それでは、実際にElastiCache for Redisを使ってJSON形式のデータを保存したり参照したりといった操作を試してみます。
AWS公式ブログで今回のアップデートに関する詳細情報が記載されています。以降、こちらの記事を参考にしながら操作を実行します。
まずは、ふつうにElastiCache for Redisのノードを作成します。バージョン 6.2 以上が必要であることにご注意ください。
作成したクラスターやノードに接続できる環境から、redis-cli
を利用してデータの操作を実行します。例えば、Amazon Linux 2環境から操作する場合は、yum install
でインストールしておきます。
Amazon Linux 2環境でのredis-cliインストール
$ sudo amazon-linux-extras install -y redis6
$ which redis-cli
/usr/bin/redis-cli
redis-cli
コマンドでRedisと接続します。
ElastiCache for Redisクラスター/ノードへの接続
$ redis-cli -h ${エンドポイント} -p ${ポート}
${エンドポイント}:${ポート}> ping
PONG
上述のAWS公式ブログを参考に、下記のコマンドでJSONデータを保存してみます。
JSONデータの保存
redis-cli -h ${エンドポイント} -p ${ポート} --raw -x json.set key . << EOF
[
{
"ID" : 21,
"Name" : "Audrey",
"Gender" : "Female",
"HireDate" : "2020.07.31",
"Building" : "F1"
},
{
"ID" : 15,
"Name" : "Bette",
"Gender" : "Female",
"HireDate" : "2021.01.31",
"Building" : "F1"
},
{
"ID" : 75,
"Name" : "Craig",
"Gender" : "Male",
"HireDate" : "2022.02.15",
"Building" : "F2"
},
{
"ID" : 9,
"Name" : "Dwayne",
"Gender" : "Male",
"HireDate" : "2020.10.02",
"Building" : "F2"
},
{
"ID" : 3,
"Name" : "Edith",
"Gender" : "Female",
"HireDate" : "2018.08.22",
"Building" : "F21"
}
]
EOF
redis-cli
からJSONデータを操作する際は、json.hoge
といった形式のコマンドが用意されています。単純にキーで取得するだけでなく、JSONデータのさまざまな要素で参照することができるようになっています。
JSONデータの参照
> json.get key
"[{\"ID\":21,\"Name\":\"Audrey\",\"Gender\":\"Female\",\"HireDate\":\"2020.07.31\",\"Building\":\"F1\"},{\"ID\":15,\"Name\":\"Bette\",\"Gender\":\"Female\",\"HireDate\":\"2021.01.31\",\"Building\":\"F1\"},{\"ID\":75,\"Name\":\"Craig\",\"Gender\":\
"Male\",\"HireDate\":\"2022.02.15\",\"Building\":\"F2\"},{\"ID\":9,\"Name\":\"Dwayne\",\"Gender\":\"Male\",\"HireDate\":\"2020.10.02\",\"Building\":\"F2\"},{\"ID\":3,\"Name\":\"Edith\",\"Gender\":\"Female\",\"HireDate\":\"2018.08.22\",\"Building\"
:\"F21\"}]"
> json.get key $[?(@.ID==21)]
"[{\"ID\":21,\"Name\":\"Audrey\",\"Gender\":\"Female\",\"HireDate\":\"2020.07.31\",\"Building\":\"F1\"}]"
> json.get key $[?(@.ID==21)].Building
"[\"F1\"]"
エスケープの処理が面倒ですが、ElastiCache for RedisでJSON形式のデータを扱えることが確認できました。
JSONデータを保存したいがドキュメント指向データベースを管理したいときに便利
アプリケーションの制約でJSONデータを何かしらのデータストアに保存する必要はあるが、そのためにDocumentDBといったドキュメント指向データベースを管理するのは運用負荷が高い、というケースはありうるかと思います。
そういった際に、ElastiCacheやMemoryDBからRedisを利用することで要件を満たせるのであれば、有用な選択肢になりうるのではないかと考えられます。
今後もさらなる機能改善に期待していきたいです。
以上、コンサル部のとばち(@toda_kk)でした。