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

原文地址:https://www.cnblogs.com/davidwang456/p/10363365.html

时间: 2024-11-05 22:56:25

spring-session用redis实现session共享实践的相关文章

php分布式redis实现session共享

方法一:找到配置文件php.ini,修改为下面内容,保存并重启服务 session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379" 方法二:直接在代码中加入以下内容 ini_set("session.save_handler", "redis"); ini_set("session.save_path", "tcp://127.0.0.1

php负载中使用redis实现session会话保持

首先要明确session和cookie的区别.浏览器端存的是cookie每次浏览器发请求到服务端是http 报文头是会自动加上你的cookie信息的.服务端拿着用户的cookie作为key去存储里找对应的value(session).同一域名下的网站的cookie都是一样的.所以无论几台服务器,无论请求分配到哪一台服务器上同一用户的cookie是不变的.也就是说cookie对应的session也是唯一的.所以,这里只要保证多台业务服务器访问同一个redis服务器(或集群)就行了. 修改php会话

PHP分布式中Redis实现Session

方法一:找到配置文件php.ini,修改为下面内容,保存并重启服务 session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379" 方法二:直接在代码中加入以下内容: ini_set("session.save_handler", "redis"); ini_set("session.save_path", "tcp://127.0.0.

php用redis保存session

1.修改php.ini中session配置: ini_set('session.save_handler', 'redis');ini_set('session.save_path', 'tcp://192.168.1.10:6379');//redis有密码的话//ini_set('session.save_path', 'tcp://192.168.1.10:6379?auth=password'); 注意:php-fpm.conf中的配置会覆盖php.ini中的配置,所以要确保php-fp

使用redis存储session

1.安装httpd,epel,redis,  php的redis扩展 yum install -y epel* (先安装epel扩展YUM源) yum install -y httpd redis php*redis (安装了epel之后,再安装redis,与php的redis扩展) 2.启动httpd,redis service httpd restart service redis restart 3.vim /var/www/html/01.php <?php phpinfo(); ?>

session 加入redis的实现代码方式

session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们可以看到这样的话"在 一个浏览器会话期间,...",这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①.最混乱的是"用户(客户端)在一次会话期间"这样一句话,它可能指用户的一系列动作(般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的

php session之redis存储

前提:redis已安装好. php代码: <?php ini_set("session.save_handler", "redis"); ini_set("session.save_path", "tcp://127.0.0.1:6379"); session_start(); $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //$redis-&g

redis慢查询日志、php安装redis扩展、redis存储session、redis主从配置

一:redis慢查询日志 编辑配置文件/etc/redis.conf针对慢查询日志,可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢查询日志的长度.当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除. slowlog-log-slower-than 1000 //单位ms,表示慢于1000ms则记录日志slowlog-max-len 128 //定义日志长度,表示最多存128条slowlog get //列出所有的慢查询日志slowlog get 2 //只列出2条slowl

spring boot + redis 实现session共享

这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下: @Configuration @EnableRedisHttpSession public class RedisSessionConfig { } 而@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,所以