七、案例实战:SpringSession+redis解决分布式session不一致性问题

步骤1:加入SpringSession、redis的依赖包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.4.7.RELEASE</version>
</dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>

步骤2:修改配置文件


# 为某个包目录下 设置日志
logging.level.com.agan=debug# 设置session的存储方式,采用redis存储
spring.session.store-type=redis# session有效时长为10分钟
server.servlet.session.timeout=PT10M## Redis 配置
## Redis数据库索引(默认为0)
spring.redis.database=0
## Redis服务器地址
spring.redis.host=192.168.1.138
## Redis服务器连接端口
spring.redis.port=6379
## Redis服务器连接密码(默认为空)
spring.redis.password=

八、剖析SpringSession的redis原理

步骤1:分析SpringSession的redis数据结构

127.0.0.1:6379> keys *
1) "spring:session:expirations:1578227700000"
2) "spring:session:sessions:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"
3) "spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"

共同点:3个key都是以spring:session:开头的,代表了SpringSession的redis数据。
“spring:session:sessions:5eddb9a3-5b1e-4bdd-a289-394b6d42388e”

127.0.0.1:6379> type "spring:session:sessions:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"
hash

127.0.0.1:6379> hgetall “spring:session:sessions:5eddb9a3-5b1e-4bdd-a289-394b6d42388e”

//失效时间 100分钟

  1. “maxInactiveInterval”
  2. “\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\x17p”

// sesson的属性,存储了user对象
3) “sessionAttr:5eddb9a3-5b1e-4bdd-a289-394b6d42388e”
4) “\xac\xed\x00\x05sr\x00\x1ecom.agan.redis.controller.User\x16”_m\x1b\xa0W\x7f\x02\x00\x03I\x00\x02idL\x00\bpasswordt\x00\x12Ljava/lang/String;L\x00\busernameq\x00\x00\x01xp\x00\x00\x00\x01t\x00\x05agan1q\x00\x00\x03"

// session的创建时间
5) “creationTime”
6) “\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\x01ouW<K”

//最后的访问时间
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\x01ouW<L”

步骤2:分析SpringSession的redis过期策略

对于过期数据,一般有三种删除策略:

  1. 定时删除,即在设置键的过期时间的同时,创建一个定时器, 当键的过期时间到来时,立即删除。
  2. 惰性删除,即在访问键的时候,判断键是否过期,过期则删除,否则返回该键值。
  3. 定期删除,即每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
    ​redis 删除过期数据采用的是懒性删除+定期删除组合策略,也就是数据过期了并不会及时被删除。
    但由于redis是单线程,并且redis对删除过期的key优先级很低;如果有大量的过期key,就会出现key已经过期但是未删除。

为了实现 session 过期的及时性,spring session 采用了定时删除+惰性删除的策略。

定时删除

“spring:session:expirations:1578227700000”

127.0.0.1:6379> type "spring:session:expirations:1578228240000"
set
127.0.0.1:6379> smembers "spring:session:expirations:1578228240000"
1) "\xac\xed\x00\x05t\x00,expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"

springsession 定时(1分钟)轮询,删除spring:session:expirations:[?] 的过期members
例如:spring:session:expirations:1578228240000 的1578228240000=2020-01-05 20:44:00:000 即在2020-01-05 20:44:00:000过期。
springsesion 定时检测超过2020-01-05 20:44:00:000 就删除spring:session:expirations:1578228240000的members的值
sessionId=5eddb9a3-5b1e-4bdd-a289-394b6d42388e
即删除

1) "spring:session:expirations:1578228240000"
2) "spring:session:sessions:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"
3) "spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"
惰性删除

spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e

127.0.0.1:6379> type spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e
string
127.0.0.1:6379> get spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e
""
127.0.0.1:6379> ttl spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e
(integer) 4719

访问 spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e的时候,判断key是否过期,过期则删除,否则返回改进的值。
例如 访问spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e的时候
判断 ttl spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e是否过期,过期就直接删除

1) "spring:session:expirations:1578228240000"
2) "spring:session:sessions:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"
3) "spring:session:sessions:expires:5eddb9a3-5b1e-4bdd-a289-394b6d42388e"

SpringSession+redis解决分布式session不一致性问题相关推荐

  1. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  2. 使用Spring Session和Redis解决分布式Session跨域共享问题

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  3. 8.redis解决分布式session问题 、redis在项目中难点

    a.什么是session session是一种会话技术,我们知道http是无状态协议的,就是这次连接传输数据后,下次连接服务器是不知道这次的请求是谁的,因此我们要做一个标记,让服务器知道每次请求是哪个 ...

  4. 场景应用:利用Redis实现分布式Session

    文章目录 原理:Redis实现分布式Session web开发session 分布式session同步问题 分布式session解决方案 实战:Redis实现分布式Session 技术栈:Spring ...

  5. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloopimport tornado.webfrom myhash ...

  6. 程序员过关斩将--解决分布式session问题

    微信搜一搜 架构师修行之路 session 说到 session,我相信每个程序员都不陌生,或多或少在项目中使用过.session 这个词,其实是一个抽象的概念,它不像 Cookie 那样有着明确的定 ...

  7. 如何利用Redis实现分布式Session?

    在web开发中,我们会把用户的登录信息存储在「session」里.而session是依赖于「cookie」的,即服务器创建session时会给它分配一个唯一的ID,并且在响应时创建一个cookie用于 ...

  8. springboot+redis实现分布式session共享

    官方文档,它是spring session项目的redis相关的一个子文档:https://docs.spring.io/spring-session/docs/2.0.0.BUILD-SNAPSHO ...

  9. Spring Session + Redis实现分布式Session共享

    2019独角兽企业重金招聘Python工程师标准>>> 通常情况下,Tomcat.Jetty等Servlet容器,会默认将Session保存在内存中.如果是单个服务器实例的应用,将S ...

最新文章

  1. GPUtil是一个Python模块,使用nvidia-smi从NVIDA GPU获取GPU状态
  2. Objective-C单例
  3. 文件数据分析制作过程【1】
  4. python import出错_Python ImportError: cannot import name urlopen错误分析
  5. linux下编译与运行,Linux操作系统驱动编译与运行是怎样的?
  6. 【渝粤题库】国家开放大学2021春2219房屋构造与维护管理题目
  7. Fixjs——事件回调的this
  8. java枚举详解_Java枚举的使用详解
  9. 图解机器学习:人人都能懂的算法原理
  10. java 斑马_java调用斑马GK888t打印机(ZPL指令)
  11. yaml使用方法_通过网络使用YAML
  12. 计算机学院条幅内容,学院迎新活动标语横幅
  13. nload0.7.2编译及使用说明
  14. position:sticky新特性
  15. C++STL之stack栈容器
  16. 全球工业半导体市场占有率十大排名出炉
  17. 城市交通的5D模式 | 不同尺度下研究的城市交通
  18. DDR4 基本管脚和概念--第一章
  19. 【博学谷学习记录】超强总结,用心分享| 大数据之数仓及Hive介绍
  20. 他打算上计算机课程 英文翻译,计算机专业课程名称英文翻译

热门文章

  1. 信息系统安全等级保护备案任务详单
  2. [译]Windows 登录时间太长的案例
  3. Android之AlterDialog介绍
  4. 【权限设计】一个案例,三个角色,简单说下B端产品的权限设计
  5. SqlServer分区表概述(转载)
  6. 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。...
  7. [独库骑行之奇山异石]丹霞地貌和雅丹地貌
  8. 程序常用配置文件格式介绍
  9. C++ cin 详解之终极无惑
  10. oracle大数据量迁移,分批量导入样例(fetch...bulk collect)以及forall结合使用