Redis

Azure Cache for Redisにセッションデータを格納してみた

Spring Sessionは、ユーザーのセッション情報を管理するための API と実装を提供するため、これを利用すると、セッションデータをAzure Cache for Redisや他のデータベースに格納することができる。

今回は、Spring Sessionを利用して、前回作成したAzure Cache for Redis内にセッションデータを格納してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

Azure App ServiceからAzure FunctionsにPost送信してみた(ソースコード編)今回も引き続き、Azure App ServiceからPost通信によってAzure Functionsを呼び出す処理の実装について述べ...

また、下記記事に従って、Azure Cache for Redisの作成が完了していること。

Azure Cache for Redisを作成してみたRedisとは、Key-Value型の非リレーショナルデータベース(NoSQL)で、そのRedisをAzure上で利用できるのがAzur...

サンプルプログラムの作成

作成したサンプルプログラム(App Service側)の構成は以下の通り。なお、Azure Functions側のソースコードは修正していない。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。

pom.xmlの内容は以下の通りで、Spring Session RedisとRedisストア(Lettuce)アダプタを追加している。

また、application.propertiesの設定は以下の通りで、「spring.session.store-type=redis」という定義と、Azure Cache for Redisへの接続先を追加している。

なお、上記接続先は、以下のAzure Portal上のプライマリ接続文字列から確認できる。
Redisプライマリ接続文字列

また、Spring Sessionの設定は、以下のクラスで設定している。



さらに、コントローラクラスの内容は以下の通りで、検索条件Formクラスをセッションとして保持するようにしている。

また、検索条件Formクラスの内容は以下の通りで、getSexItemsメソッドの内容をAzure Cache for Redisに格納しないようにするために、@JsonIgnoreアノテーションを付与している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/azure-cache-redis-session/demoAzureApp



サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) Azure Redisをコンソールで「keys *」コマンドを入力すると、何も登録されていないことが確認できる。
サンプルプログラムの実行結果_1

2) ローカル環境でdemoAzureFuncアプリを「mvn azure-functions:run」コマンドで起動する。
サンプルプログラムの実行結果_2_1

その後、Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下の画面が表示される。
サンプルプログラムの実行結果_2_2

このとき、 Azure Redisをコンソールで「keys *」コマンドを入力すると、Spring Sessionにより作成されたオブジェクトの一覧が表示される。
サンプルプログラムの実行結果_2_3

ここで、上記一覧のうち、「expires」を含まない、2)のオブジェクト名を選択し右クリックし、コピーする。なお、コピーした文字列の「spring:session:sessions:」の後の「64519af5-ca24-42f4-8717-657f4c726b7e」は、セッションIDを表している。
サンプルプログラムの実行結果_2_4

Azure Redisをコンソールで「hgetall (先ほどコピーしたオブジェクト名)」というコマンドを入力すると、以下のように、コピーしたオブジェクト名の中身が表示される。なお、このときのオブジェクト名の貼り付けは、「Ctrl+V」コマンドにより行う。
サンプルプログラムの実行結果_2_5

3) 検索条件に何も指定せず「検索」ボタンを押下すると、USER_DATAテーブルの全データが出力される。
サンプルプログラムの実行結果_3_1

サンプルプログラムの実行結果_3_2

このとき、 Azure Redisをコンソールで「keys *」コマンドを入力後、「hgetall (先ほどコピーしたオブジェクト名)」というコマンドを入力すると、以下のように、コピーしたオブジェクト名の中身が更新されて、userDataListに検索された3レコードが設定されて表示されることが確認できる。
サンプルプログラムの実行結果_3_3

4) 検索条件に「テスト プリン3」、性別に「女」を指定して「検索」ボタンを押下すると、以下のように、条件に合うデータが出力される。
サンプルプログラムの実行結果_4_1

サンプルプログラムの実行結果_4_2

このとき、 Azure Redisをコンソールで「keys *」コマンドを入力後、「hgetall (先ほどコピーしたオブジェクト名)」というコマンドを入力すると、以下のように、コピーしたオブジェクト名の中身が更新されて、searchName, searchSexに検索条件が、userDataListに検索された1レコードが設定されて表示されることが確認できる。
サンプルプログラムの実行結果_4_3

5) 以下のように、「flushdb」コマンドで、Azure Redisオブジェクトのデータが全てクリアされる。
サンプルプログラムの実行結果_5

6) ローカル環境でdemoAzureFuncアプリのapplication.propertiesの「demoAzureFunc.urlBase」を以下のように変更する。
サンプルプログラムの実行結果_6_1

その後、以下のように、Azure App Service上にサンプルプログラムをデプロイする。
サンプルプログラムの実行結果_6_2

なお、Azure App Serviceにデプロイする過程は、以下の記事の「App ServiceへのSpring Bootを利用したJavaアプリケーションのデプロイ」を参照のこと。

Azure App Service上でSpring Bootを利用したJavaアプリケーションを作成してみた前回は、Azure Potal上でApp Serviceを作成してみたが、今回は、前回作成したApp ServiceにSpring Bo...

7) その後、「https://azureappdemoservice.azurewebsites.net/」というAzure App ServiceのURLにアクセスすると、以下の画面が表示される。
サンプルプログラムの実行結果_7_1

なお、上記URLは、下記Azure App ServiceのURLから確認できる。
サンプルプログラムの実行結果_7_2

このとき、 Azure Redisをコンソールで「keys *」コマンドを入力後、「hgetall (先ほどコピーしたオブジェクト名)」というコマンドを入力すると、以下のように、コピーしたオブジェクト名の中身が確認できる。
サンプルプログラムの実行結果_7_3

8) 検索条件に何も指定せず「検索」ボタンを押下すると、USER_DATAテーブルの全データが出力される。
サンプルプログラムの実行結果_8_1

サンプルプログラムの実行結果_8_2

このとき、 Azure Redisをコンソールで「keys *」コマンドを入力後、「hgetall (先ほどコピーしたオブジェクト名)」というコマンドを入力すると、以下のように、コピーしたオブジェクト名の中身が更新されて、userDataListに検索された3レコードが設定されて表示されることが確認できる。
サンプルプログラムの実行結果_8_3

9) 検索条件に「テスト プリン3」、性別に「女」を指定して「検索」ボタンを押下すると、以下のように、条件に合うデータが出力される。
サンプルプログラムの実行結果_9_1

サンプルプログラムの実行結果_9_2

このとき、 Azure Redisをコンソールで「keys *」コマンドを入力後、「hgetall (先ほどコピーしたオブジェクト名)」というコマンドを入力すると、以下のように、コピーしたオブジェクト名の中身が更新されて、searchName, searchSexに検索条件が、userDataListに検索された1レコードが設定されて表示されることが確認できる。
サンプルプログラムの実行結果_9_3

要点まとめ

  • Spring Sessionは、ユーザーのセッション情報を管理するための API と実装を提供するため、これを利用すると、セッションデータをAzure Cache for Redisや他のデータベースに格納することができる。
  • Azure Cache for Redisにセッションデータを格納するには、Spring Session データ Redis(spring-session-data-redis)を利用し、application.propertiesに「spring.session.store-type=redis」の定義とAzure Cache for Redisへの接続先を追加すると共に、Spring Sessionの設定を行うクラスを追加する。