Open6

redisとdynamoDBとmemchacheとか

おすしおすし

Redis

オープンソースのインメモリーデータストラクチャストアで、DB、キャッシュ、メッセージブローカー、ストリーミングエンジンとして使われる。redisは、下記のようなデータ型を保存できる。

  • string
  • hashes
  • lists
  • sets
  • sorted sets
  • bitmaps
  • hyperloglogs
  • geospatial indexs
  • stream
    また、redisはビルドインのレプリケーション、Lua scriencepting、LRU eviction、トランザクション異なるレベルのon-disk persistを持っている。
    https://redis.io/docs/about/

原則として全てのデータをメモリ上に展開・保管するインメモリ型のシステムで、ストレージへの保存と読み出しを前提とする一般的なデータベースに比べ極めて高速に動作するが、大量のデータを扱うには見合う容量のRAM(Randam Access Memory)を用意しなければならず、高コストとなる。
RDBのように永続的なデータ保管い用いることは稀で、システムが頻繁に読み出すデータの複製を高速に配信するキャッシュサーバとして用いられることが多い。

データの永続化の仕組みも持っており、ある瞬間のメモリ上のデータを丸ごとストレージに写し取るスナップショット、データが更新されるたびに更新履歴を記録していくトランザクションログなどの機能が利用できる。
他のコンピュータに複製を作る機能があり、更新が可能な1台の「マスター」とその複製である読み出し専用の複数台の「スレーブ」という構成にすることで大規模化を墓あることができる。

https://e-words.jp/w/Redis.html

AWSの方の説明

AWSのデータベース、キャッシュ、メッセージブローカー、キューとして使用できる高速のオープンソースメインメモリデータストア。
リモートディクショナリーサーバーの略で、高速でオープンソースのメモリ内key-valueデータストア。リアルタイムアプリケーションでm秒未満の応答時間を実現し、1秒間に数百万件のリクエストを処理できる。

柔軟なデータ構造

他のkey-valueデータストアとは異なり、Redisにはさまざまなデータ構造が用意されている。

  • Strings - 最大512MBnoテキストまたはバイナリデータ
  • Lists - 追加された順に並べられた文字列の集合
  • Sets - 順序なしの文字列の集合で他のSet型と交差、話集合、差集合演算を行うことができる
  • Sorted Sets - 値ごとに並べられたSet
  • Hashes - フィールドと値のリストを保持するデータ構造
  • Bitmaps - ビットレベルの演算を実行できるデータタイプ
  • HyperLogLogs - データセット内の一意の項目を推定する確率的データ構造
  • Streams - ログデータ構造メッセージキュー
  • Geospatial - 経度/緯度メッセージキュー
  • Json - 数値、文字列、ブール値、配列、およびその他のオブジェクトをサポートする、名前つき値のネストされた半構造化オブジェクト

その他の特徴

  • シンプルで使いやすい
  • レプリケーションと永続性
  • 高可用性とスケーラビリティ
おすしおすし

DynamoDB

1桁ms単位で規模に応じたパフォーマンスを実現する高速で柔軟なNoSQLデータベース
フルマネージド、サーバーレスのkey-value NoSQLデータベース。
内蔵セキュリティ、継続的なバックアップ、自動化されたマルチリージョンでのレプリケーション、インメモリキャッシング、データエクスポートツルを提供する

  • RDB よりレイテンシ(通信の遅延)が低い(→遅延があんまりない)
  • DBのスキーマがない(RDBだったら一回 Table作ってしまったら変更効きづらい)
  • デフォルトでも接続数が多くなったり、短時間における大量のリクエストを捌ける
  • 自動でインスタンスを増やしたり、減らしたりしてくれる
  • DynamoDBアクセラレーターを利用すれば、キャッシュを利用し、よりレイテンシを抑えたりできる

ユースケース

  • ソフトウェアアプリケーションの開発

  • メディアメタデータストアを作成

    • リアルタイム動画ストリーミングやインタラクティブコンテンツなどのメディアやエンターテイメントのワークロードのスループットとコンカレンシーをスケールし、AWSリージョン間のマルチリージョンレプリケーションにより低レイテンシーを実現する。
  • 小売業のシームレスなエクスペリエンスの提供

    • ショッピングカート、ワークフローエンジン、在庫追跡、顧客プロファイルをデプロイするためのデザインパターンを使用する。dynamo DBは、大量トラフィックや極端にスケールしたイベントをサポートし、1秒間に数百万回のクエリを処理できる。
  • ゲームプラットフォームのスケーリング

    • 運用コストをかけずに、イノベーションの推進に集中できる、プレイヤーデータ、セッション履歴、リーダーボードを使って、数百万人の同時接続ユーザーに対応したゲームプラットフォームを構築できる。
おすしおすし

https://techblog.zozo.com/entry/dynamodb_feedback

redisにはユーザーごとのMySQLのお知らせidを直近100件分保持しています。 お知らせはユーザーの行動やアイテムのステータスの変化の分レコード数が存在するので、MySQLのレコード数が尋常ではない量になります。また、ユーザー分のindexをredisに保持しているので、これではユーザーの人数が増えれば増えるほどredisの容量を食う事になります。MySQLのデータが大きくなればなるほどレスポンスが遅くなっていきます。

APIのレスポンスが遅くなるってこと?

おすしおすし

memchched

オンメモリで動作するKVSとなっており、標識(key?)となるデータに格納したデータを一対一に対応つけて保管する。確保したメモリ容量がいっぱいになると、最終アクセス日時が古い順(LRU: Least Recently Used)に既存データを削除して新規データ用の容量を確保する。
複数のmemchachedサーバを整列に動作させることで分散キャッシュシステムを構築することができるが、memchached自身はデータの分散や統一的なアクセス手段を提供せず、キャッシュの読み書きを行うクライアント側(Webアプリケーション等)の責任で各サーバへ振り分けや読み込みを管理する必要がある。
データベースシステムと連携してデータベースへの検索や読み込みクエリの実行結果を一時的に保管する用途っとしてよく用いられる。オプションで任意のバイナリデータを格納することもでき、画像ファイルの配信高速化などに用いられることもある。

おすしおすし

memchacheとredisの比較記事

https://zenn.dev/marshmallon/articles/27e279e41a98d6

インメモリデータベースはデータベースへの問い合わせ結果をキャッシュするので、データベースへのアクセス回数を減らし、アプリケーションの高速化やスケーラビリティの向上ができる。

共通点

  • ていレイテンシ
  • 複数のーどにデータを分散可能
  • 古いデータを捨てるタイミングを指定できる

相違点

memchachedはデータ型を持たない。

データ変更時

  • memchached
    • 文字列ロード
    • デシリアライズ
    • オブジェクトフィールドを編集
    • シリアライズ
    • 保存
      というステップを経る
  • redis
    hash型が使えるため、その各フィールドに個別にアクセスし変更可能。

そのため、ネットワークI/O回数とデータサイズを減らすことでケースシナリオを高速化することができる。

key-valueの最大サイズ

memchachedはMAX250Bのkey、1MBのvalue
RedisはListとSet型に関してはkey,valueどちらもMAX512MBをサポート

スケーリング

  • Memchached
    マルチスレッドのため、スケーリングが簡単。スケールするのに必要なのは、より多くのコアより多くのメモリー。
  • Redis
    シングルスレッド。マスター/スレーブアーキテクチャで動作している。マスターに障害が発生すると、自動的にスレーブを新しいマスターとして昇格させる。

永続化

  • memcached
    そもそも永続化できる手段をもたない
  • Redis
    AOFログやスナップショットを撮ることができるため、データセットを復元できる。(≒永続化)