Maison  >  Article  >  base de données  >  Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

PHPz
PHPzavant
2023-05-30 13:28:062073parcourir

Introduction

De nombreux projets à Dachang sont déployés sur plusieurs serveurs. Lorsque nous accédons au service, bien que le même service soit exécuté, il peut s'exécuter sur différents serveurs. ;

J'ai rencontré un tel scénario de connexion lorsque j'étudiais le projet. Supposons qu'il y ait trois serveurs comme suit (comme indiqué sur l'image) et utilisez la session pour stocker les informations de connexion de l'utilisateur. être utilisé pour déterminer si l'utilisateur est connecté :

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

En supposant que cette connexion est effectuée via le serveur 01, alors les informations de session de connexion cette fois sont stockées dans la mémoire 01 ; mais lorsque je visite à nouveau, le serveur 02 effectue l'opération, mais les informations de session de connexion sont dans la mémoire 01 et le serveur 02 ne peut pas les obtenir, il jugera donc que je ne suis pas connecté et renverra les mauvaises informations. .

Ce que nous voulons réaliser, c'est que la session générée en se connectant à un serveur puisse être partagée avec d'autres serveurs , alors comment y parvenir ?

Solution L'idée est que puisque la mémoire de ces serveurs ne peut pas être partagée, tant qu'il existe un espace partagé auquel ces serveurs peuvent accéder ensemble (comme Picture );

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

La première chose qui me vient à l'esprit devrait être la base de données tant que ces clusters de serveurs partagent une base de données et stockent les informations de session générées dans. la base de données, ça ne suffira pas. Bon, donc tout le monde peut y accéder ; la base de données a du relationnel et du non relationnel (NoSql) :

  • Base de données relationnelle : Mysql etc.

    #🎜🎜 #
  • Base de données non relationnelle : Redis (base de données K/V), etc.

In en fait, il est préférable de choisir ici une base de données non relationnelle, car Redis Basé sur la mémoire, il a des performances de lecture et d'écriture élevées, ce qui est très approprié pour cette situation où les informations utilisateur sont fréquemment lues

 ; peut également être implémenté via le serveur de fichiers, qui ne sera pas présenté ici ; Il existe une méthode qui peut être implémentée via l'iphash de nginx. Cette méthode est très simple, mais l'idée est différente des deux ci-dessus. pour la même IP sera calculé par nginx iphash, et les résultats seront liés au serveur spécifié. Après cela, toutes les demandes seront envoyées à ce serveur.

Mais cela pose quelques problèmes. Tout d'abord, l'équilibrage de charge n'a pas beaucoup de sens si le serveur lié raccroche, alors iphash sera invalide ou votre requête sera distribuée par d'autres services sans passer par nginx ; ., alors iphash ne prendra pas non plus effet ; utilisez-le donc avec prudence

Ci-dessous, je vais simplement simuler via le code comment réaliser facilement le partage de session via la configuration Redis ; introduction

Il y a un projet de gestion des utilisateurs ici. Lors de la connexion, le code logique de connexion enregistrera les informations de session de l'utilisateur connecté :

#🎜. 🎜#

puis ouvrez-le en même temps Les deux services de ce projet : localhost:8080 et localhost:8082 (peuvent être considérés comme des projets fonctionnant sur deux serveurs différents)

#🎜 🎜#

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?Après ouverture du service Vous pouvez accéder au document d'interface correspondant :

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?-------- --------------- ------------Ligne de séparation-------------------------- --------------- -------

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?Le service dispose des deux interfaces suivantes : (Les tests suivants sont testés dans le même service)#🎜 🎜#

Interface de connexion : enregistrer les informations de session utilisateur de connexion

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

Test de connexion :

# 🎜🎜#

Obtenir l'interface des informations utilisateur actuelles : Obtenez les informations actuelles de l'utilisateur en vous connectant à la session

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

Obtenez le test des informations de connexion actuelles de l'utilisateur : #🎜🎜 #

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

Parce qu'il s'agit de deux services maintenant, il n'est certainement pas possible de partager la session. Même si vous vous connectez au service sur le port 8080, vous ne pouvez pas l'obtenir sur le service sur le port 8082. aux informations utilisateur actuelles (j'insiste encore : le test ci-dessus peut obtenir les informations utilisateur actuelles car il est testé ; dans le même service. La même session de service est stockée dans sa propre mémoire et est bien sûr accessible par elle-même)

#🎜 🎜#Opération spécifique

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?Ce qui suit est de mettre en œuvre une session partagée via Configuration Redis :

Téléchargez d'abord redis et téléchargez les tutoriels en ligne ; ici j'utilise directement le conteneur redis créé via docker sur le serveur (simple et facile à utiliser, fortement recommandé) :

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

Vous pouvez le connecter via l'outil de visualisation :

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

De cette façon, redis est configuré. Configurez maintenant redis dans le code du projet :

Introduisez la dépendance redis et la dépendance de configuration spring-session dans le projet (stockez automatiquement la session dans 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>

Configurez dans le fichier application.yml. file Configurations associées pour connecter redis et session :

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)

En fait, il n'y a qu'une seule configuration clé : store-type : redis Tant que celle-ci est configurée, la session dans le code sera stockée dans redis au lieu de sa propre mémoire.

Ensuite, vous pouvez Testé :

Appelez l'interface de connexion, générez les informations de session utilisateur, vérifiez redis :

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

Vous pouvez voir que la session de connexion utilisateur a été stockée dans redis, je peux donc me connecter sur le port 8080. , et je peux également obtenir les informations de connexion sur 8082 Informations de session :

Connexion :

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

Obtenir des informations :

Quelle est la méthode utilisée par Redis pour implémenter le partage de session ?

De cette façon, le partage de session se fait via redis

Remarque : l'introduction de redis ; et les versions de dépendance spring-redis doivent être proches.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer