Explication détaillée de la mise en œuvre Redis du partage de session
Redis implémente le partage de session
Ces derniers jours, j'ai travaillé sur un tel petit module de partage de session. Après avoir vérifié beaucoup d'informations, j'ai l'impression que c'est trop déroutant et je n'ai jamais réussi à trouver ce que je voulais. Presque toutes les méthodes de mise en œuvre sont différentes de mes idées. Ici, je vais résumer comment je le fais. utilisez Redis pour mettre en œuvre des sessions partagées afin de faciliter les demandes futures, j'espère également que cela pourra aider les amis qui ont des besoins à cet égard.
Recommandations de sujets connexes : session php (y compris des photos, des vidéos, des cas)
Parlons d'abord Jetons un coup d'œil à mon environnement de développement : nginx, redis, tomcat, utilisez moven pour construire le projet et exécutez le serveur jetty. Donc, ici, je vais également expliquer comment utiliser maven pour créer un package war et le déployer pour l'exécuter. matou.
Redis est une base de données clé-valeur Le stockage et la récupération des valeurs dépendent tous de cette clé, je vais dire quelque chose de long ici car c'est original. et professionnel, je ne le collerai pas. Je veux en savoir plus. Vous pouvez rechercher l'introduction officielle
Configuration dans pom.xml :
<!-- redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency>
Configurer
<!-- redis 客户端配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${jedisPoolConfig.maxTotal}"/> <property name="maxIdle" value="${jedisPoolConfig.maxIdle}"/> <property name="maxWaitMillis" value="${jedisPoolConfig.maxWaitMillis}"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> </bean> <bean id="readJedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${jedis.read.host}" /> <property name="port" value="${jedis.read.port}" /> <property name="password" value="${jedis.read.password}" /> <property name="timeout" value="${jedis.read.timeout}" /> <property name="database" value="${jedis.read.database}" /> <property name="poolConfig" ref="jedisPoolConfig" /> </bean> <bean id="writeJedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${jedis.write.host}" /> <property name="port" value="${jedis.write.port}" /> <property name="password" value="${jedis.write.password}" /> <property name="timeout" value="${jedis.write.timeout}" /> <property name="database" value="${jedis.write.database}" /> <property name="poolConfig" ref="jedisPoolConfig" /> </bean> <bean id="readRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="readJedisConnectionFactory" /> </bean> <bean id="writeRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="writeJedisConnectionFactory" /> </bean>
Dans LoginController :
La première étape, introduisez RedisTemplate
@Autowired @Qualifier("writeRedisTemplate") private StringRedisTemplate writeTemplate;
Il vous suffit d'introduire writeRedisTemplate ici lors de la connexion, il n'est responsable de l'écriture que lors de l'actualisation. , après avoir passé le filtre, devez-vous lire
La deuxième étape est le processus de connexion normal. Après une connexion réussie, la demande. doit également enregistrer les informations de la session
La troisième étape, définissez la valeur du cookie, stockez la valeur clé dans redis comme valeur clé pour enregistrer les informations de session utilisateur dans le cookie, et lors de l'actualisation du navigateur, le filtre Vous pouvez obtenir la valeur du cookie, puis accéder à redis pour obtenir la valeur correspondante, c'est-à-dire key
userSession
String domain = request.getServerName(); String cookieId=MD5Util.MD5Encode("uasLoginer", "UTF-8"); //生成token,用作session在redis存储中的key值 StringredisSessionKey= UUID.randomUUID().toString(); Cookie uasLoginer = new Cookie(cookieId, redisSessionKey); if (domain.startsWith("uas.")) { uasLoginer.setDomain(domain.substring(4,domain.length())); }else { uasLoginer.setDomain(domain); } uasLoginer.setMaxAge(60000); uasLoginer.setPath("/"); response.addCookie(uasLoginer);
Ici, le cookie est défini sur le domaine setDomain et setPath
Le quatrième étape, enregistrez les informations dans redis userSession
Écrivez redis dans RedisTemplate La valeur doit être de type String et l'objet userSession doit être converti en chaîne Json
userSessionString = JSON.toJSONString(userSession);
在转Json的时候,遇到问题,导入import com.alibaba.fastjson.JSON;一直失败,发现pom中没有依赖Json的关系,如果有遇到相同的问题,可以检查下在pom.xml中是否有关于json的依赖关系,没的话,在pom.xml中导入json的依赖关系,如下:
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.3</version> <classifier>jdk15</classifier> </dependency>
写入redis的代码如下:
writeTemplate.opsForHash().put(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey,redisSessionKey, userSessionString); writeTemplate.expire(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey, 1800L, TimeUnit.SECONDS);//设置redis中值的有效期
完成这一操作,用户的session信息已经存入到redis中,可在redis中查看是否存入。
第五步:进入页面后,刷新页面,请求会经过过滤器,在Filter.Java中读取redis的值并进行一些处理
在过滤器这里,就无法通过注解的方式引入redisTemplate,可以通过如下的方式引入:
BeanFactory beans = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); StringRedisTemplate readTemplate = (StringRedisTemplate) beans.getBean("readRedisTemplate"); StringRedisTemplate writeTemplate = (StringRedisTemplate) beans.getBean("writeRedisTemplate");
过滤器从cookie中取出redis的key值,用readTemplate读出value值
String cookid=MD5Util.MD5Encode("uasLoginer", "UTF-8"); Cookie[] cookies = req.getCookies(); String redisSessionKey = ""; if(cookies != null){ for (Cookie cookie : cookies) { if(cookie.getName().equals(cookid)){ redisSessionKey = cookie.getValue() ; } } } UserSession userSession = null; String userSessionString = (String) readTemplate.boundHashOps(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey).get(redisSessionKey); if(null != userSessionString ){ @SuppressWarnings("static-access") JSONObject obj = new JSONObject().fromObject(userSessionString);//将json字符串转换为json对象 userSession = (UserSession)JSONObject.toBean(obj,UserSession.class); writeTemplate.expire(UasContants.REDIS_USER_SESSION_KEY+"_"+redisSessionKey, 1800L, TimeUnit.SECONDS); request.getSession().setAttribute(UasContants.USER_SESSION, userSession); } if (userSession != null) { chain.doFilter(req, res); return; }else { res.sendRedirect(UasContants.LOGIN_URL); return; }
在这里,另外附上关于web.xml关于LoginFilter的配置,有需要的可以参考下:
<!-- Spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>loginFilter</filter-name> <filter-class>com.sfbest.uas.filter.LoginFilter</filter-class> <init-param> <param-name>excludePaths</param-name> <param-value>/login,/user/login,/user/auth</param-value> </init-param> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
按照上面的配置,就可以用redis实现session共享的功能,但我在开发的时候,遇到一个蛋疼的问题,在测试环境上,
把项目部署在两台tomcat
服务器上的时候,cookie里一直存不进去redis的key值,单台可以存进去,经过长期的检测,
终于发现是nginx配置出的问题,引以为戒,深深的阴影。下面我贴出我正常运行时nginx的配置代码
upstream uassessiontest.d.com { server 10.103.16.226:8088; server 10.103.16.226:8089; } server { log_format sf_uastest '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_cookie'; listen 80; server_name uassessiontest.d.com; access_log /var/log/nginx/uassessiontest.log sf_uastest; location / { rewrite ^/$ /uas/ break; proxy_pass http://uassessiontest.d.com; } }
红色的为当初少配的部分,这些部分是的作用是往浏览器端写入cookie值。
相关学习推荐:redis视频教程
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le mode Redis Cluster déploie les instances Redis sur plusieurs serveurs grâce à la rupture, à l'amélioration de l'évolutivité et de la disponibilité. Les étapes de construction sont les suivantes: Créez des instances de redis étranges avec différents ports; Créer 3 instances Sentinel, Moniteur Redis Instances et basculement; Configurer les fichiers de configuration Sentinel, ajouter des informations d'instance Redis de surveillance et des paramètres de basculement; Configurer les fichiers de configuration d'instance Redis, activer le mode de cluster et spécifier le chemin du fichier d'informations de cluster; Créer un fichier nœuds.conf, contenant des informations de chaque instance redis; Démarrez le cluster, exécutez la commande CREATE pour créer un cluster et spécifiez le nombre de répliques; Connectez-vous au cluster pour exécuter la commande d'informations de cluster pour vérifier l'état du cluster; faire

Redis utilise des tables de hachage pour stocker les données et prend en charge les structures de données telles que les chaînes, les listes, les tables de hachage, les collections et les collections ordonnées. Redis persiste les données via des instantanés (RDB) et ajoutez les mécanismes d'écriture uniquement (AOF). Redis utilise la réplication maître-esclave pour améliorer la disponibilité des données. Redis utilise une boucle d'événement unique pour gérer les connexions et les commandes pour assurer l'atomicité et la cohérence des données. Redis définit le temps d'expiration de la clé et utilise le mécanisme de suppression paresseux pour supprimer la clé d'expiration.

Étapes pour résoudre le problème que Redis-Server ne peut pas trouver: Vérifiez l'installation pour vous assurer que Redis est installé correctement; Définissez les variables d'environnement redis_host et redis_port; Démarrer le serveur Redis Redis-Server; Vérifiez si le serveur exécute Redis-Cli Ping.

Le cluster Redis est un modèle de déploiement distribué qui permet une expansion horizontale des instances Redis, et est implémentée via la communication inter-nœuds, l'espace clé de la division des emplacements de hachage, l'élection du nœud, la réplication maître-esclave et la redirection de commande: communication inter-nœuds: la communication du réseau virtuel est réalisée via le bus de cluster. Slot de hachage: divise l'espace clé en emplacements de hachage pour déterminer le nœud responsable de la clé. Élection du nœud: au moins trois nœuds maîtres sont nécessaires et un seul nœud maître actif est assuré par le mécanisme électoral. Réplication maître-esclave: le nœud maître est responsable de la rédaction de demandes, et le nœud esclave est responsable des demandes de lecture et de la réplication des données. Redirection de commande: le client se connecte au nœud responsable de la clé et le nœud redirige les demandes incorrectes. Dépannage: détection des défauts, marquer la ligne et re

Pour afficher le numéro de version redis, vous pouvez utiliser les trois méthodes suivantes: (1) Entrez la commande Info, (2) Démarrez le serveur avec l'option - Version et (3) afficher le fichier de configuration.

Pour afficher toutes les touches dans Redis, il existe trois façons: utilisez la commande Keys pour retourner toutes les clés qui correspondent au modèle spécifié; Utilisez la commande SCAN pour itérer les touches et renvoyez un ensemble de clés; Utilisez la commande info pour obtenir le nombre total de clés.

Les ensembles commandés par Redis (ZSETS) sont utilisés pour stocker des éléments commandés et trier par des scores associés. Les étapes à utiliser ZSET incluent: 1. Créer un ZSET; 2. Ajouter un membre; 3. Obtenez un score de membre; 4. Obtenez un classement; 5. Obtenez un membre dans la gamme de classement; 6. Supprimer un membre; 7. Obtenez le nombre d'éléments; 8. Obtenez le nombre de membres dans la plage de score.

Redis utilise cinq stratégies pour assurer le caractère unique des clés: 1. Séparation des espaces de noms; 2. Structure de données de hachage; 3. Définir la structure des données; 4. Caractères spéciaux des touches de chaîne; 5. Vérification du script LUA. Le choix de stratégies spécifiques dépend de l'organisation des données, des performances et des exigences d'évolutivité.
