一,为什么要使用分布式session?

HpptSession默认使用内存来管理Session,如果将应用横向扩展将会出现Session共享问题,

所以我们在创建web集群时,把session保存到redis中,

这样用户访问到web集群中的任一台服务器,都可以读取到自己的session信息

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,演示项目相关信息

1,项目地址:

https://github.com/liuhongdi/redissession

2,项目原理

把session保存到redis中,从而实现分布式的session

为了防止单点问题,我们首先要创建一个redis cluster

3,redis cluster结构

redis1: 172.17.0.2
redis2: 172.17.0.3
redis3: 172.17.0.4 redis4: 172.17.0.5
redis5: 172.17.0.6
redis6: 172.17.0.7

4,项目结构:

如图:

三,创建redis cluster

1,每台机器:生成安装用目录:

[root@redis /]# mkdir /usr/local/soft
[root@redis /]# mkdir /usr/local/source
[root@redis /]# mkdir /usr/local/source/redis

2,每台机器:安装必需的rpm包

[root@redis redis]# dnf install wget
[root@redis redis]# dnf install gcc
[root@redis redis]# dnf install tcl
[root@redis redis]# dnf install make
[root@redis redis]# dnf install which

3,每台机器:下载/编译/安装:

下载:
[root@redis /]# cd /usr/local/source/redis/
[root@redis redis]# wget http://download.redis.io/releases/redis-6.0.5.tar.gz
解压:
[root@redis redis]# tar -zxvf redis-6.0.5.tar.gz

编译、安装

[root@redis redis]# cd redis-6.0.5
[root@redis redis-6.0.5]# make PREFIX=/usr/local/soft/redis-6.0.5 install
测试安装的效果:
[root@redis redis-6.0.5]# make test
看到以下信息,表示测试无误
\o/ All tests passed without errors! 

4,每台机器:配置

生成配置文件
[root@redis redis-6.0.5]# mkdir /usr/local/soft/redis-6.0.5/conf
[root@redis redis-6.0.5]# cp redis.conf /usr/local/soft/redis-6.0.5/conf/

生成日志/数据目录

[root@redis redis-6.0.5]# mkdir -p /data/redis-6.0.5/logs
[root@redis redis-6.0.5]# mkdir -p /data/redis-6.0.5/data
[root@redis redis-6.0.5]# mkdir -p /data/redis-6.0.5/cluster
设置配置
[root@redis redis-6.0.5]# cd /usr/local/soft/redis-6.0.5/conf/
[root@redis conf]# vi redis.conf

配置项内容:

daemonize yes
logfile "/data/redis-6.0.5/logs/redis.log"
maxmemory 128MB
dir /data/redis-6.0.5/data/
protected-mode no
requirepass lhddemo
#bind 127.0.0.1(此行注释掉)
io-threads 2 cluster-enabled yes(此行取消注释)
cluster-config-file /data/redis-6.0.5/cluster/nodes-6379.conf
cluster-node-timeout 15000(此行取消注释)
masterauth lhddemo

5,每台机器:用systemd管理redis服务

生成服务文件

[root@redis conf]# vi /lib/systemd/system/redis6.service
内容:
[Unit]
Description=Redis
After=network.target [Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/soft/redis-6.0.5/bin/redis-server /usr/local/soft/redis-6.0.5/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true [Install]
WantedBy=multi-user.target

启动

[root@redis conf]# systemctl daemon-reload
[root@redis conf]# systemctl start redis6

6,每台机器:测试访问redis服务

[root@redis logs]# /usr/local/soft/redis-6.0.5/bin/redis-cli
127.0.0.1:6379> auth lhddemo
OK
127.0.0.1:6379> set name lhd
(error) CLUSTERDOWN Hash slot not served

提示cluster未启动

7,集群中任一台机器上:创建集群:

#-a: 输入登录验证密码

#--cluster create :用来创建集群,指定集群中机器的ip和端口

#--cluster-replicas :指定集群中的每个主节点的从节点的数量,1表示每个主节点各有一个从节点

[root@redis1 /]# /usr/local/soft/redis-6.0.5/bin/redis-cli -a lhddemo \
--cluster create 172.17.0.2:6379 172.17.0.3:6379 172.17.0.4:6379 172.17.0.5:6379 172.17.0.6:6379 172.17.0.7:6379 \
--cluster-replicas 1

Can I set the above configuration? (type 'yes' to accept): yes

在这里输入yes 并回车

8, 集群中任一台机器上:查看创建集群的效果:查看集群信息:

#列出群集中的机器节点信息

[root@redis5 /]# /usr/local/soft/redis-6.0.5/bin/redis-cli -c -h 172.17.0.6
172.17.0.6:6379> auth lhddemo
OK
172.17.0.6:6379> cluster nodes
aa20aa58234477746468843269bc25b06bf1edd5 172.17.0.7:6379@16379 slave 8a66552f8869dc4c9ef81b473558cec6f55104dd 0 1593222901512 6 connected
6a8d2ccfed713a7d7023852686d24ef95520135d 172.17.0.4:6379@16379 master - 0 1593222898000 3 connected 10923-16383
a205c4ba5ba680381bfb8d349755a33c8c60f340 172.17.0.2:6379@16379 master - 0 1593222899496 1 connected 0-5460
52ca45c11d5d09207882ac9eb17bfccb81a6b713 172.17.0.6:6379@16379 myself,slave a205c4ba5ba680381bfb8d349755a33c8c60f340 0 1593222898000 5 connected
8a66552f8869dc4c9ef81b473558cec6f55104dd 172.17.0.3:6379@16379 master - 0 1593222900000 2 connected 5461-10922
dc271cb9bb59f163854ab16113e3d41234831ebe 172.17.0.5:6379@16379 slave 6a8d2ccfed713a7d7023852686d24ef95520135d 0 1593222900503 4 connected

四,配置文件说明:

1,application.properties:

spring.redis.cluster.nodes=172.17.0.2:6379,172.17.0.3:6379,172.17.0.4:6379,172.17.0.5:6379,172.17.0.6:6379,172.17.0.7:6379
spring.redis.password=lhddemo
spring.session.store-type=redis
#redis-lettuce
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

说明:

spring.redis.cluster.nodes:指定cluster中各redis节点

spring.redis.password:   登录密码

spring.session.store-type: 指定session的存储方式,这里使用redis

2,pom.xml

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

五,java代码说明

1, DemoApplication.java

@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

说明:

EnableRedisHttpSession:启用redis作为session

maxInactiveIntervalInSeconds = 60指定session的时长,秒数,

建议时长3600秒

2,SessionController.java

@RestController
@RequestMapping("/session")
public class SessionController {
/*
* read session
* */
@RequestMapping("/get")
public Object getSession(HttpServletRequest request){
Map<String, Object> map = new HashMap<>();
map.put("sessionId", request.getSession().getId());
map.put("user", request.getSession().getAttribute("user"));
map.put("maxInactiveInterval", request.getSession().getMaxInactiveInterval());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(new Date(request.getSession().getCreationTime()));
map.put("creationTime", time);
return map;
} /*
* write session
* */
@RequestMapping("/set/{name}")
public String setSession(@PathVariable String name, HttpServletRequest request) {
request.getSession().setAttribute("user", name);
return "ok";
}
}

六,  效果演示

1,设置session

2,读取session

3,从redis中查看session

172.17.0.4:6379> hgetall spring:session:sessions:e9f0e981-d3be-4f44-8783-7cbb3792bc23
1) "sessionAttr:user"
2) "\xac\xed\x00\x05t\x00\x0bgoodabcdefg"
3) "creationTime"
4) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01r\xf3\x8d?+"
5) "maxInactiveInterval"
6) "\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00<"
7) "lastAccessedTime"
8) "\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01r\xf3\x8d\\\x8a"

如果我们del这个session中,

session中记录的信息就会丢失

七,查看redis版本

[root@redis4 /]# /usr/local/soft/redis-6.0.5/bin/redis-server --version
Redis server v=6.0.5 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=3432450123f459c8

八,查看spring boot版本

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.1.RELEASE)

spring boot:使用redis cluster集群作为分布式session(redis 6.0.5/spring boot 2.3.1)的更多相关文章

  1. centos8平台redis cluster集群添加/删除node节点(redis5.0.7)

    一,当前redis cluster的node情况: 我们的添加删除等操作都是以这个cluster作为demo cluster采用六台redis,3主3从 redis1 : ip: 172.17.0.2 ...

  2. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...

  3. redis cluster 集群畅谈(二)

    上一篇http://www.cnblogs.com/qinyujie/p/9029482.html, 主要讲解 redis cluster 集群 搭建,本篇主要讲解实验多master写入.读写分离.实 ...

  4. python 连接 redis cluster 集群

    一. redis集群模式有多种, cluster模式只是其中的一种实现方式, 其原理请自行谷歌或者百度, 这里只举例如何使用Python操作 redis cluster 集群 二. python 连接 ...

  5. K8S部署Redis Cluster集群

    kubernetes部署单节点redis: https://www.cnblogs.com/zisefeizhu/p/14282299.html Redis 介绍 • Redis代表REmote DI ...

  6. K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

    一.Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理.它可以存储和操作高级数据类型,例如列表,地图,集合和排序 ...

  7. Redis Cluster 集群搭建与扩容、缩容

    说明:仍然是伪集群,所有的Redis节点,都在一个服务器上,采用不同配置文件,不同端口的形式实现 前提:已经安装好了Redis,本文的redis的版本是redis-6.2.3 Redis的下载.安装参 ...

  8. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  9. Redis Cluster集群主从方案

    本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...

随机推荐

  1. Solr专题(一)手把手教你搭建Solr服务

    一.Solr是什么,能解决什么问题? Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对 ...

  2. MYSQL中的where ‘1=1‘ 探讨

    在学习MySQL时候,关于MySQL注入的例子 首先针对以下代码,实现的是关于sql注入时,一个普通登录所产生的的问题 package com.java.lesson02; import com.ja ...

  3. 掌控安全sql注入靶场pass-05

    1.判断注入点 1 and 1=1 1 and 1=2 考虑存在布尔盲注 布尔盲注解释 当不能像前面那样直接在网页中显示我们要的数据时就需要用到盲注,来得到数据库之类的名字.基于布尔的盲注就是通过判断 ...

  4. matlab外部程序接口-excel

    在excel中使用matlab 内容: 1.Spreadsheet Link 程序 安装与启动 1 打开excle->文件->选项 2.加载项->转到 3.浏览(可用加载宏,本来没有 ...

  5. Oracle学习(十)Oracle定时任务

    一.Oracle定时任务基础 简介 oracle job 是应用在数据库层面,用来定时执行存储过程或者 SQL 语句的定时器. 查询 --当前库中运行的 job SELECT t.* FROM dba ...

  6. jfinal3连接sqlserver2012 使用generator生成model 将smallint默认为string

    修改MetaBuilder的buildColumnMetas方法增加对smallint的判断

  7. ip子网掩码计算及子网划分

    为什么要懂 子网掩码计算,及子网划分属于网络基础知识.一般在几个地方会用到: 公司避免产生网络风暴而划分子网,帮助路由器判断对应主机是否在同一个网段中 服务器相互隔离而划分子网,一般机房管理人员规划: ...

  8. 推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey

    写在前面的话 Autohotkey是一款轻量小众但高效免费开源的windows热键脚本语言,游戏操纵.鼠标操作.键盘快捷重定义,快捷短语等等,只有你想不到,没有它做不到,神器中的神器呀,相见恨晚. 安 ...

  9. Python-列表推导式、生成器、字典推导式

    列表推导式 [] + for + if 算子.循环.条件, 对相同的数据进行处理, 算子也可以是函数 number = [i for i in range(1, 101) if i % 2 == 0] ...

  10. 协同过滤 Collaborative Filtering

    协同过滤 collaborative filtering 人以类聚,物以群分 相似度 1. Jaccard 相似度 定义为两个集合的交并比: Jaccard 距离,定义为 1 - J(A, B),衡量 ...