zoukankan      html  css  js  c++  java
  • spring-session用redis实现session共享实践

    什么是spring session?

    Spring Session provides an API and implementations for managing a user’s session information.

    简单一句话,spring session帮你管理用户的session信息。

    为什么使用spring session?

    通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。

    目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?

    实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat、Jetty等服务器提供的Session共享功能,将Session的内容统一存储在一个数据库(如MySQL)或缓存(如Redis)中。

    使用spring session有以下好处:

      spring session是开源的用户session管理软件,免费,易控且容易扩展;

      spring session可以使服务器无状态;

      服务器宕机或者重启不会丢失用户session信息,对用户更友好。

      不需要负载均衡器保持粘性

      满足应用和数据隔离原则

    为什么使用spring session data redis呢?

      spring session提供了三种主要实现方式REDIS,JDBC,Hazelcast 

    上一篇文章已经介绍了jdbc的实现  那为什么很多人更喜欢使用Redis实现呢?

      1.应用要求请求响应流畅,快捷,redis是内存服务器,响应很快

         2. 使用redis做外部存储,降低了对数据库或者服务器本身的依赖,更稳定

      3. redis的过期机制更友好

            4. redis的分片和集群机制,扩展性更好

             5. 简单应用且容易监控

             6. 和spring boot集成更紧密。

    spring-session-data-redis实战

    前段时间,写了篇<spring-session-data-redis解决session共享的问题>文章,介绍了spring-session使用redis存储实现session共享的内部机制,

    有读者提问为什么只有理论没有实践?索性就实践一下。

    1.使用sts创建spring-boot项目,项目名称session-jdbc,使用redis,web(方便测试)的start,创建完项目如下:

    2.增加spring-session-redis依赖

            <dependency> 
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-starter-security</artifactId> 
              </dependency>
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
          </dependency>

    3.配置属性

    spring.session.store-type=redis
    spring.redis.host=localhost
    spring.redis.password=
    spring.redis.port=6379
    spring.session.redis.namespace=spring:session
    spring.security.user.name=admin
    spring.security.user.password=admin
    spring.session.redis.cleanup-cron=0 * * * * *

    4.增加测试类

    package com.example.demo;
    
    import javax.servlet.http.HttpSession;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/redis")
    public class TestController {
        @RequestMapping("/welcome")
        public String welcome(HttpSession httpSession) {
            httpSession.setAttribute("hello", "world");
            return "hello world !";
    
        }
    }

    5.启动spring boot项目

    6.访问http://localhost:8080/redis/welcome

     访问前查看redis情况

    输入用户名密码 admin/admin

    访问后

     

    总结:

      spring-session-data-redis 使用redis做用户管理的存储,主要有以下优点:

    1.简单易用,用户友好

    2.响应快

    3.扩展性强

    4.稳定性高

    5.可监控

    参考文献:

    【1】https://www.cnblogs.com/jiafuwei/p/6425604.html

  • 相关阅读:
    Models(Pascal)
    Summer Plan(挖坑待填)
    C++之指针
    QuickPower快速幂
    codevs 1231最优布线问题
    颓废了1年+,今天开始勤(tui)奋(fei)啦
    l'Hopital法则
    相律
    小意外
    一种改进的动力学处理方法
  • 原文地址:https://www.cnblogs.com/davidwang456/p/10363365.html
Copyright © 2011-2022 走看看