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

  • 相关阅读:
    php多态
    ssl certificate problem: self signed certificate in certificate chain
    test plugin
    open specific port on ubuntu
    junit vs testng
    jersey rest service
    toast master
    use curl to test java webservice
    update folder access
    elk
  • 原文地址:https://www.cnblogs.com/davidwang456/p/10363365.html
Copyright © 2011-2022 走看看