服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - redis实现session共享的方法

redis实现session共享的方法

2023-04-16 17:40YXXYX Redis

本文主要介绍了redis实现session共享的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引言

大厂很多项目都是部署到多台服务器上,这些服务器在各个地区都存在,当我们访问服务时虽然执行的是同一个服务,但是可能是不同服务器运行的;

在我学习项目时遇到这样一个登录情景,假设有如下三台服务器(如图),就使用session存放用户的登录信息,通过该信息可以判断用户是否登录:

redis实现session共享的方法

假设本次登录是通过服务器01执行的,那么这次的登录session信息就存放到了内存01中;但是当我再次访问时却是服务器02执行操作,而登录session信息却在内存01中,服务器02无法获取,所以它就会判断我没有登录,返回错误的信息…

我们想要实现的就是通过一台服务器登录所生成的session可以和其他服务器共享,那么该如何实现?

解决方法 思路就是既然这几个服务器自己的内存不能共享,那么只要有一个共享空间供这几个服务器共同访问不就可以了(如图);

redis实现session共享的方法

首先想到的应该就是数据库,只要这些服务器集群共享一个数据库,并把生成的session信息存放到数据库中不就可以了,这样大家都可以访问;数据库有关系型和非关系型(NoSql):

  • 关系型数据库:Mysql等
  • 非关系型数据库:Redis(K/V数据库)等

这里其实选择非关系型数据库最好,因为Redis基于内存,读写性能高,很适合这种用户信息频繁读取的情况;

还可以通过文件服务器实现,这里就不介绍了;

还有一种方法,可以通过nginx的iphash实现,该方法非常简单,但是思路和上面两种不同,原理就是同一个ip的所有请求都会被nginx进行iphash进行计算,将结果绑定到指定服务器,之后这个请求都会访问到该服务器中。
但是这样就有一些问题,首先就算负载均衡就没有太大意义了,如果绑定的服务器挂了,那么iphash也就失效了;又或者你的请求被其他服务分发而未走nginx服务,那么iphash同样不生效;所以谨慎使用;

下面我就简单通过代码模拟一下如何通过redis配置轻松实现session共享

 

案例介绍

这里有一个用户管理项目,在登录时登录逻辑代码会记录下来登录用户的session信息:

redis实现session共享的方法

然后同时开启了该项目的两个服务:localhost:8080和localhost:8082(可以当作两台不同服务器上运行的项目)

redis实现session共享的方法

开启服务后可以访问对应的接口文档:

redis实现session共享的方法

-----------------------------------分割线-------------------------------------------

redis实现session共享的方法

该服务都有以下两个接口:(以下测试是在同一个服务中测试的)

登录接口:记录登录用户session信息

redis实现session共享的方法

登录测试:

redis实现session共享的方法

获取当前用户信息接口:通过登录session获取当前用户信息

redis实现session共享的方法

获取当前登录用户信息测试:

redis实现session共享的方法

因为现在这是两个服务,所以肯定实现不了共享session的,就算在8080端口的服务登录了,也无法在8082端口的服务获取到当前用户信息;(再次强调:上面测试可以获取到当前用户信息是因为在同一个服务中测试的,同一个服务session存放到他自己的内存中当然可以自己访问了)

 

具体操作

下面就通过redis配置实现共享session:

首先要下载redis,下载网上找教程;这里我直接用的在服务器上通过docker创建的redis容器(简单好用,强烈推荐):

redis实现session共享的方法

通过可视化工具可以连接一下:

redis实现session共享的方法

这样redis就配置好了,下面在项目代码中配置redis:

在项目中引入redis依赖和spring-session配置依赖(自动将 session 存储到 redis 中):

?
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 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和session相关配置:

?
1
2
3
4
5
6
7
8
9
10
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)

其实关键配置就一个: store-type: redis,只要配置了这个,那么代码中session就会存放到redis中而不是自己的内存中;

接下来就可以测试了:

调用登录接口,生成用户session信息,查看redis:

redis实现session共享的方法

可以看到用户登录session已经存放到redis中了,这样我在8080端口登录,在8082也可以获取到登录的session信息:

登录:

redis实现session共享的方法

获取信息:

redis实现session共享的方法

这样就通过redis实现session共享了;

需要注意:引入redis和spring-redis依赖版本需要接近;

到此这篇关于redis实现session共享的方法的文章就介绍到这了,更多相关redis session共享内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/YXXXYX/article/details/125342292

延伸 · 阅读

精彩推荐
  • RedisWindows下Redis x64的安装与使用教程详解

    Windows下Redis x64的安装与使用教程详解

    Redis是一款内存高速缓存数据库,可以满足我们对海量数据的读写需求,本文重点给大家介绍Windows下Redis x64的安装与使用教程,感兴趣的朋友一起看看吧...

    蓝多多的小仓库10442022-10-12
  • Redis浅谈Redis常见延迟问题定位与分析

    浅谈Redis常见延迟问题定位与分析

    大部分时候,redis延迟很低,但是在某些时刻,有些redis实例会出现很高的响应延时,本文主要介绍了浅谈Redis常见延迟问题定位与分析,具有一定的参考价值...

    知知之之6442022-10-21
  • RedisRedis 5.05 单独模式安装及配置方法

    Redis 5.05 单独模式安装及配置方法

    这篇文章主要介绍了Redis 5.05 单独模式安装,文中通过代码给大家介绍了Redis 5.0.5 单节点 安装配置方法,需要的朋友可以参考下 ...

    余-雷3472019-11-28
  • RedisRedis key-value乱码的解决

    Redis key-value乱码的解决

    本文主要介绍了Redis key-value乱码的解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    JavaEE_2020088262022-10-20
  • Redisredis操作学习记录

    redis操作学习记录

    这篇文章主要介绍了redis操作,记录总结了Redis客户端、服务器、string、hash、list、发布/订阅、事务等相关概念、原理与操作技巧,需要的朋友可以参考下 ...

    随风行云4932020-05-14
  • RedisRedis和springboot 整合redisUtil类的示例代码

    Redis和springboot 整合redisUtil类的示例代码

    这篇文章主要介绍了Redis和springboot 整合redisUtil类的示例代码,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价...

    yux334410202021-02-23
  • Redisredis禁止几个危险命令的方法

    redis禁止几个危险命令的方法

    今天小编就为大家分享一篇redis禁止几个危险命令的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    jjwen4102019-11-14
  • RedisRedis中5种数据结构的使用场景介绍

    Redis中5种数据结构的使用场景介绍

    这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String、Hash、List、Set、Sorted Set做了讲解,需要的朋友可以参考下 ...

    junjie4682019-10-21