1. 程式人生 > >springboot整合redis和springsession做session伺服器

springboot整合redis和springsession做session伺服器

一. 簡介

         springboot2.0整合redis可以參照博主的另一篇文章: springboot2.0整合redis

          在分散式專案中,為了保持無狀態的應用,用redis做session伺服器。springsession可以和redis很好的配合。

二. 程式碼

2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

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

        <!-- jackson序列化 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

        <!-- spring session -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

2.2 application.yml

server:
  port: 8080


# redis相關配置
spring:
  redis:
    database: 0
    host: redis伺服器IP
    port: 6379
    password: 密碼

2.3 RedisConfig

package com.example.demo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * @author yuanshushu
 * @date 2018/9/1
 * @description REDIS配置類
 */
@Configuration
@EnableRedisHttpSession
public class RedisConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替換預設的jdkSerializeable序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 設定value的序列化規則和 key的序列化規則
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }


}

2.4 SessionController

2.4.1 8080埠的Controller

列印session資訊和向session中儲存使用者資訊

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yuanshushu
 * @date 2018/9/1
 * @description SESSION控制類
 */
@RestController
public class SessionController {

    @GetMapping("/test")
    public Map<String, Object> testSessionId(HttpServletRequest request) {

        Map<String, Object> sessionIdPortMap = new HashMap<String, Object>();

        // 獲取session資訊
        sessionIdPortMap.put("sessionId:", request.getSession().getId());
        sessionIdPortMap.put("伺服器埠:", request.getServerPort());

        // 向session中儲存使用者資訊 key規則: user + "_" + uid
        request.getSession().setAttribute("user_1", "{uid:1,username:
[email protected]
}"); return sessionIdPortMap; } }

2.4.2 8081埠的controller

 列印session資訊和獲取session中使用者資訊

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yuanshushu
 * @date 2018/9/1
 * @description SESSION控制類
 */
@RestController
public class SessionController {

    @GetMapping("/test")
    public Map<String, Object> testSessionId(HttpServletRequest request) {

        Map<String, Object> sessionIdPortMap = new HashMap<String, Object>();

        // 獲取session資訊
        sessionIdPortMap.put("sessionId:", request.getSession().getId());
        sessionIdPortMap.put("伺服器埠:", request.getServerPort());

        // 獲取session中uid為1的使用者的資訊
        String user_1 = (String) request.getSession().getAttribute("user_1");
        sessionIdPortMap.put("user_1", user_1);

        return sessionIdPortMap;
    }


}

2.5 啟動類

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

三. 測試

此時,可以通過redis desktop manager檢視,有一個session生成,時間預設為半小時。

此時,將專案複製一份,埠改為8081,訪問http://localhost:8081/test,仍然得到相同的sessionId,並可以得到session中儲存的使用者資訊:

說明session已經被redis共享了。

此時,如果將專案關閉,再啟動,仍然會是這個sessionId(預設半小時失效)。

在專案中,可以通過一個工具類,封裝獲取session的方法,然後對該session做操作。

相關推薦

springboot整合redisspringsessionsession伺服器

一. 簡介          springboot2.0整合redis可以參照博主的另一篇文章: springboot2.0整合redis           在分散式專案中,為了保持無狀態的應用,用redis做session伺服器。springsession可以和r

springboot整合redisspringCache

1.在配置檔案中添加註解@EnableCaching (RedisConfig.class) /** * Created by zhuzhengping on 2017/2/19. * redis配置 */ @Configuration @Enable

springboot使用redisThreadLocal單點登入

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

springboot-整合redis快取,分散式共享session

springboot-整合redis:做快取,做分散式共享session 文章目錄 springboot-整合redis:做快取,做分散式共享session 1.redis應用場景 2配置 3.測試 完整

Redis詳解 - SpringBoot整合Redis,RedisTemplate註解兩種方式的使用

本文主要講 Redis 的使用,如何與 SpringBoot 專案整合,如何使用註解方式和 RedisTemplate 方式實現快取。最後會給一個用 Redis 實現分散式鎖,用在秒殺系統中的案例。 更多 Redis 的實際運用場景請關注開源專案 coderiver 專案地址:github.com/cac

springboot 整合redis 快取

  一、新增依賴jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-re

springboot整合redis,實現session共享

   一直對serssion的共享有著很大的疑惑,對於我現在的工作的地方,所在的部門,因為沒有前臺頁面,純屬後臺。所以,不會存在session的共享問題。但是出於好奇,也是心裡的疑惑,今天也動手實驗了下。      

SpringBoot 2.0 | SpringBoot 整合 Redis + Cache + 分散式 Session

簡介 1.Redis redis是一個key-value儲存系統。它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合) 和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,

SpringBoot整合RedisRedis叢集

一、SpringBoot整合Redis 步驟:1.新增依賴: <!--redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId

springBoot整合Redis(單機版叢集版)

        Spring Boot中除了對常用的關係型資料庫提供了優秀的自動化支援之外,對於很多NoSQL資料庫一樣提供了自動化配置的支援,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra。        Redis是一個開

springboot整合mybatis,mysql資料庫儲存,redis快取

redis應用的場景通過快取來減少對關係型資料庫的查詢次數,減輕資料庫壓力。在執行DAO類的select***(), query***()方法時,先從Redis中查詢有沒有快取資料,如果有則直接從Redis拿到結果,如果沒有再向資料庫發起查詢請求取資料。springboot已

springboot 整合 redis 共享Session-spring-session-data-redis

ssi nco template idl end timeunit 超時 超時時間 database 參考:https://www.cnblogs.com/ityouknow/p/5748830.html 如何使用 1、引入 spring-boot-starte

springboot整合redis實現訊息釋出訂閱模式-雙通道(跨多伺服器)

  基礎配置參考https://blog.csdn.net/llll234/article/details/80966952   查看了基礎配置那麼會遇到一下幾個問題: 1.實際應用中可能會訂閱多個通道,而一下這種寫法不太通用container.addMessageListener

springboot整合redis——redisTemplate的使用

關系 img redis-cli redis 安裝 -i 進行 start 啟動 一、概述   相關redis的概述,參見Nosql章節   redisTemplate的介紹,參考:http://blog.csdn.net/ruby_one/article/detail

springboot整合redis緩存

springboot redis 使用springBoot添加redis緩存需要在POM文件裏引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

SpringBoot系列2】SpringBoot整合Redis

並且 nds key值 數據 配置數據源 eth ren core 成功 前言: 真的越來越喜歡SpringBoot了,這是SpringBoot學習系列之一。 正文: 1:首先在pom文件中添加依賴,記得是spring-boot-starter-data-redis,不是s

八、springboot整合redis

clu com figure pri alt pass oot wired 用戶登錄 整合Redis 一. 註解方式實現添加緩存   1.在pom.xml加入依賴 <!-- 配置使用redis啟動器 --> <dependency> <

SpringBoot整合KafkaStorm

name cat engine override interrupt length dep 發的 介紹 前言 本篇文章主要介紹的是SpringBoot整合kafka和storm以及在這過程遇到的一些問題和解決方案。 kafka和storm的相關知識 如果你對kafka和st

SpringBoot整合JspThymeleaf (附工程)

curd scrip implement osi 數據表 del setter esp myba 前言 本篇文章主要講述SpringBoot整合Jsp以及SpringBoot整合Thymeleaf,實現一個簡單的用戶增刪改查示例工程。事先說明,這兩個是單獨整合的,也就是兩個

SpringBoot整合Redis初實踐

取數據 redis服務器 公眾號 redis-cli 內存 將在 個數 img 代理   Redis是一個開源(BSD許可),內存存儲的數據結構服務器,可用作數據庫,高速緩存和消息隊列代理。   有時,為了提升整個網站的性能,在開發時會將經常訪問的數據進行緩存,這樣在調用這