Redis がセッション共有を実装する方法は何ですか?

PHPz
リリース: 2023-05-30 13:28:06
転載
2105 人が閲覧しました

はじめに

大昌の多くのプロジェクトは複数のサーバーにデプロイされています。これらのサーバーはさまざまな地域に存在します。サービスにアクセスすると、同じサービスが実行されているにもかかわらず、異なるサーバーで実行されている可能性があります。;

プロジェクトを検討しているときに、このようなログイン シナリオに遭遇しました。(図に示すように) 次の 3 つのサーバーがあると仮定し、セッションを使用してユーザーのログイン情報を保存します。この情報は、ユーザーのログイン情報を決定するために使用できます。ユーザーがログインしているかどうか:

Redis がセッション共有を実装する方法は何ですか?

このログインがサーバー 01 を介して実行されたと仮定すると、今回のログイン セッション情報はメモリ 01 に保存されますが、再度アクセスしたときは、 、サーバー02の操作で実行されますが、ログインセッション情報がメモリ01にあり、サーバー02はそれを取得できないため、ログインしていないと判断して間違った情報を返してしまいます...

私たちが達成したいのは、サーバーログインによって生成されたセッションは他のサーバーと共有できるということです。これを実現するにはどうすればよいでしょうか?

解決策 考え方は、これらのサーバーのメモリは共有できないため、これらのサーバーが一緒にアクセスできる共有スペースがある限り (図に示すように)、

Redis がセッション共有を実装する方法は何ですか?

最初に思い浮かぶのはデータベースです。これらのサーバー クラスターがデータベースを共有し、生成されたセッション情報をデータベースに保存している限り、誰もがデータベースにアクセスできます。 ; データベースにはリレーショナル データベースと非リレーショナル (NoSql) が含まれます:

  • リレーショナル データベース: Mysql など

  • 非リレーショナル データベース: Redis ( K /V データベース) など。

Redis はメモリに基づいており、読み取りおよび書き込みのパフォーマンスが高く、非常に優れているため、ここでは非リレーショナル データベースを選択するのが実際には最適です。ユーザー情報が頻繁に読み取られるこの状況に適しています。

ここでは紹介しませんが、ファイルサーバー経由での実装も可能です。

# 他にも実装可能な方法があります。 nginx の iphash を使用する この方法は非常に単純ですが、上の 2 つとは考え方が異なり、同じ IP に対するすべてのリクエストが nginx によって iphash 計算され、その結果が指定されたサーバーにバインドされます。その後、このリクエストはサーバーにアクセスします。
しかし、これにはいくつか問題があります。第一に、負荷分散はあまり意味がありません。バインドされたサーバーがハングアップすると、iphash は無効になります。あるいは、リクエストは nginx サービスではなく他のサービスによって分散されます。 . の場合、 iphash も有効になりません; したがって、注意して使用してください;

以下では、redis 構成を通じてセッション共有を簡単に実現する方法をコードを通じて簡単にシミュレートします

ケースの紹介

これは 1 つのユーザー管理プロジェクトです。ログインすると、ログイン ロジック コードがログイン ユーザーのセッション情報を記録します。

Redis がセッション共有を実装する方法は何ですか?

次に、プロジェクトの 2 つのサービス同時に開かれます: localhost:8080 と localhost:8082 (2 つの異なるサーバー上で実行されるプロジェクトとして使用できます)

Redis がセッション共有を実装する方法は何ですか?

サービスを開いた後、対応するインターフェイスドキュメント:

Redis がセッション共有を実装する方法は何ですか?

---------------------------- - - 分割線 - - - - - - - - - - - - - - - - - - - - - ##

Redis がセッション共有を実装する方法は何ですか?

# このサービスには次の 2 つのインターフェイスがあります: (次のテストは同じサービスでテストされます)

ログイン インターフェイス: ログイン ユーザー セッション情報を記録します

Redis がセッション共有を実装する方法は何ですか?

ログイン テスト:

Redis がセッション共有を実装する方法は何ですか?

#現在のユーザー情報インターフェイスの取得: ログイン セッションを通じて現在のユーザー情報を取得します

Redis がセッション共有を実装する方法は何ですか?

現在ログインしているユーザー情報の取得テスト:

Redis がセッション共有を実装する方法は何ですか?

#これらは現在 2 つのサービスであるため、共有することはできません。現在のユーザー情報を取得します (もう一度強調しますが、上記のテストは同じ環境でテストされているため、現在のユーザー情報を取得できます)。サービス。同じサービス セッションは独自のメモリに保存され、もちろん単独でアクセスできます)

特定の操作

次は、redis 構成を通じて共有セッションを実装する方法です:

まず、redis をダウンロードし、オンラインでチュートリアルを見つけます。ここでは、サーバー上の docker によって作成された Redis コンテナーを直接使用します (シンプルで使いやすく、強くお勧めします):

Redis がセッション共有を実装する方法は何ですか?

# #ビジュアル ツールを使用して接続できます:

Redis がセッション共有を実装する方法は何ですか?

このようにして、redis が構成されました。次に、プロジェクト コードで redis を構成します:

Introducing redis dependency intoプロジェクトは spring-session 構成に依存します (セッションが redis に自動的に保存されます):

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
	<version>2.6.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency>
	<groupId>org.springframework.session</groupId>
	<artifactId>spring-session-data-redis</artifactId>
	<version>2.6.3</version>
</dependency>
ログイン後にコピー

application.yml ファイルで接続 redis とセッション関連の構成を構成します:

spring:
  # session配置
  session:
    timeout: 86400 # 设置session失效时间
    store-type: redis # 修改spring-session存储配置,默认存储到服务器内存中,现在设置存到redis中(关键)
  # redis配置
  redis:
    port: 8081 # redis的端口号(这里是我的redis容器在docker中对应的端口号)
    host: xx.xxx.xxx.xxx # 我的云服务器ip
    database: 0 # 设置存入redis的哪一个库(默认是0)
ログイン後にコピー

実際には、キー構成は 1 つだけです:store-type: redis。これが構成されている限り、コード内のセッションは独自のメモリではなく redis に保存されます。

その後、テストできます:

ログイン インターフェイスを呼び出し、ユーザー セッション情報を生成し、redis を確認します。

Redis がセッション共有を実装する方法は何ですか?

#ユーザー ログイン セッションが redis に保存されていることがわかります。ポート 8080 でログインし、8082 で取得することもできます。 ログイン セッション情報:

ログイン:

Redis がセッション共有を実装する方法は何ですか?

情報の取得:

Redis がセッション共有を実装する方法は何ですか?#このようにして、redis を通じてセッション共有を実現します。

注: 導入された redis と spring-redis の依存関係のバージョンは近い必要があります。

以上がRedis がセッション共有を実装する方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!