八、剖析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原理相关推荐

  1. spring-session整合redis原理 排查失效原因

    根据网上配置了一个springsession整合redis作为session后,发现session获取失败,redis里面是有值.登录模块设置进去也能获取的到,但是其他的服务就获取不到.记录一下,跟着 ...

  2. 【49.Auth2.0认证与授权过程-微博开放平台认证授权过程-百度开放平台认证授权过程-社交登录实现(微博授权)-分布式Session问题与解决方案-SpringSession整合-Redis】

    一.知识回顾 [0.三高商城系统的专题专栏都帮你整理好了,请点击这里!] [1-系统架构演进过程] [2-微服务系统架构需求] [3-高性能.高并发.高可用的三高商城系统项目介绍] [4-Linux云 ...

  3. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  4. spring-session用redis实现session共享实践

    什么是spring session? Spring Session provides an API and implementations for managing a user's session ...

  5. redis缓存实现原理php,分析redis原理及实现

    下面由Redis教程栏目给大家介绍分析redis原理及实现,希望对需要的朋友有所帮助! 1 什么是redis redis是nosql(也是个巨大的map) 单线程,但是可处理1秒10w的并发(数据都在 ...

  6. 面试被吊打 - Redis原理

    小张兴冲冲去面试,结果被面试官吊打! 小张: 面试官,你好.我是来参加面试的. 面试官: 你好,小张.我看了你的简历,熟练掌握Redis,那么我就随便问你几个Redis相关的问题吧.首先我的问题是,R ...

  7. 打卡学习 | Redis原理应用-线程IO模型

    这是小小国庆节更新的第一篇,小小本篇将会更新Redis原理应用,线程IO模型.我是小小,我们这期见面了. 送书反馈 小小送的书到啦,一共三本书,晒图如下. 小小开始今天的文章,跟我学Redis系列之, ...

  8. 老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 1...

    老李推荐:第14章8节<MonkeyRunner源码剖析> HierarchyViewer实现原理-获取控件列表并建立控件树 poptest是国内唯一一家培养测试开发工程师的培训机构,以学 ...

  9. 深度剖析浏览器渲染性能原理,你到底知道多少?

    深度剖析浏览器渲染性能原理,你到底知道多少? 渲染卡顿是怎么回事? 网页不仅应该被快速加载,同时还应该流畅运行,比如快速响应的交互,如丝般顺滑的动画等. 大多数设备的刷新频率是60次/秒,也就说是浏览 ...

最新文章

  1. Java爬虫——B站弹幕爬取
  2. VR直播云服务解决方案
  3. php 模板引擎 优点,Smarty模板引擎的优点
  4. Linux云服务ModuleNotFoundError: No module named 'MySQLdb'
  5. 关于CoordinatorLayout的用法——复杂交互的克星
  6. 力扣剑指 Offer 17. 打印从1到最大的n位数
  7. CentOS 7 安装OpenOffice并实现WordToPDF(Java调用)
  8. pandas将数组写入csv新增一列
  9. 「创作之秋」| 参赛成员- 获奖名单(参与奖)
  10. ffmpeg -比特率,帧率和文件大小
  11. 【管理经验】管理的本质-激发善意
  12. 视频教程-2019年人工智能热门案例精讲之歌词生成器-机器学习
  13. 体系结构 记分牌实例
  14. QQ群无法下载视频和图片解决方案
  15. Win10子系统Ubuntu安装Thingworx8.5--1. WSL Ubuntu 安装
  16. window(win7)+linux(ubuntu)双系统的安装以及windows重装后的引导修复问题
  17. php中do..while的用法,do while语句的用法是什么
  18. meta分析是什么?临床护理中药本硕博生怎么用meta分析发表SCI
  19. opencv 将多帧图像合成为视频 cv2.VideoWriter()
  20. 【转载】局域网连接-笔记本的无线网通过网线共享给其他带网口设备

热门文章

  1. Confluence 6 修改日志文件的大小数量和级别
  2. 大数据怎样帮助运维工程师实现无死角监控?
  3. 支持统一码 10 的花园明朝字库终于更新出来了
  4. Selenium定位不到元素的解决方法—iframe挡住了去路
  5. 《SPSS 统计分析从入门到精通(第2版)》一6.3 二项式检验
  6. sniffer模拟arp***
  7. Ubuntu搭建Anki服务器
  8. Mybatis非mapper代理配置
  9. #ifdef __cplusplus extern C { #endif”的定义
  10. select非group by字段的方法