spring-session集成redis问题
点击上方“技术支持联盟”,选择“置顶公众号”
第一时间了解程序员大小事儿
作者: 刘同学,爱折腾,钻牛角尖,spring的脑残粉,未参与过开源项目的开源热衷者。
简介:最近Spring-session集成redis遇到两个问题,在这里记录一下。
问题及处理
redis版本问题
异常:ERR Unsupported CONFIG parameter: notify-keyspace-events
原因:Spring-session 集成redis要求redis
解决方案:升级redis版本
生产环境禁用redis的CONFIG命令问题
异常:ERR unknown command 'CONFIG'
原因:生产环境的redis,出于安全考虑,会禁用CONFIG命令,Spring-session 集成redis使用的@EnableRedisHttpSession注解会默认通过CONFIG命令配置notify-keyspace-events,由于CONFIG命令被禁用,导致报错。
解决方案:分两步配置
1.代码中禁用config命令
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
2.redis配置notify-keyspace-events
由于生产环境config命令被禁用,可以通过运维人员修改redis的配置文件重启解决
notify-keyspace-events
以上,问题解决
02理论依据
1.redis版本问题
Redis版本问题在官方文档的minimum-requirements有说明
见文档:
https://docs.spring.io/spring-session/docs/current/reference/html5/#minimum-requirements
2.生产环境禁用redis的CONFIG命令问题
关于CONFIG命令的问题是源于一个BUG,见issues:
https://github.com/spring-projects/spring-session/issues/124
大概意思是@EnableRedisHttpSession集成redis,会默认通过redis的config命令开启redis的notify-keyspace-events事件通知。由于config命令被禁用,操作执行失败报错。
该BUG在1.0.1版本被修复,值得注意的是作者在修复BUG的时候,同时提到了默认开启notify-keyspace-events事件通知的原因:
原文连接:
https://github.com/spring-projects/spring-session/issues/124#issuecomment-71490616
文中提到两点:
1.测试环境无需额外操作即可正常运行(对开发友好)
2.由于使用websocket的应用需要通过SessionDestroyedEvent?事件通知来关闭已开启的连接,以生产环境需要手动关闭CONFIG命令配置的方式提示用户需要开启notify-keyspace-events事件通知。(基于快速失败原则,尽早发现问题)。
文中还提到了修复方案:
RedisHttpSessionConfiguration默认情况下应仅在启用springwebsocket支持时更新Redis配置。
RedisHttpSessionConfiguration应允许禁用更新Redis配置。
RedisHttpSessionConfiguration默认情况下只应在启用springwebsocket支持的情况下尝试订阅键空间通知。这将有助于提高仅使用springsessionforhttpsession的应用程序的性能,而HttpSession通常不需要接收sessiondestoryedevent
如果应用程序应该订阅密钥空间通知,RedisHttpSessionConfiguration应该允许显式配置
官方文档对禁用CONFIG命令做了说明:
https://docs.spring.io/spring-session/docs/current/reference/html5/#api-redisindexedsessionrepository-sessiondestroyedevent(2.2.x及以上版本)
(2.1.x及更早期版本见:#api-redisoperationssessionrepository-sessiondestroyedevent
如:https://docs.spring.io/spring-session/docs/2.1.x/reference/html5/#api-redisoperationssessionrepository-sessiondestroyedevent)
03收获
其实上面的两个问题有很多解决方案,但是通过追根溯源,查阅官方文档,能更好的理解作者的设计初衷,理解每种方案的影响。通过对不同方案的对比,选择最优的、最适合的方案,做到知其然、知其所以然,不断加深对开源软件理解,并将了解的新内容应用到日常开发工作中,不断提升自己软件设计水平,开发出高质量、高标准的软件产品。
历史文章
解决方案:
通过分析Nginx服务器日志统计用户流量并预警
加密与认证技术
【双十一钜惠:科技人的专属保障】移动端交互速度保证 ——影像上传优化
【双十一钜惠:科技人的专属保障】移动端认证保障 ——非对称加密及jwt应用
系统安全建设小经验
公共组件-需求自动录入TAPD
Python初体验
HTML5实现自定义键盘及使用
Sentinel限流
基于公有云实时音视频通道的构建音视频组件方法与实战经验
分布式定时任务调度探讨
阿里云OSS JavaAPI分享
Jmeter压测的使用
API接口安全优化浅谈
基于idea将传统应用maven化改造实践
安全漏洞预扫小工具
Nacos作为注册中心,配置中心部署方案
Rancher+K8S简化学习环境搭建方案
Excel大数据量解析优化方案
Sharding-JDBC个性化分表方案
基于JWT的接口权限认证
Spring Cloud Gateway实现限流
公网发布的通用技术解决方案
Nginx结合Lua实现限流
Mysql数据同步Canal方案
Weblogic部署基于Spring Cloud项目应用实例
智能验证码解析java语言实现
数据库的演绎与变迁-下架最后一台小型机
关于struts架构通过引入spring包实现dubbo调用测试的未来式
架构系列:
双十一钜惠:科技人的专属保障】如何保障移动端活动的稳定运转?——移动端基础平台建设的经验分享
【双十一钜惠:一个有温度的技术公众号】科技人需要什么样的保障
架构师入门系列:架构三板斧“缓存,消息,异步”
监控&运维
redis监控工具-redislive
微服务链路追踪工具 Apache SkyWalking部署与实践
快速发现生产环境SQL问题
Grafana-业务数据监控实践
自动化运维能力提升
服务器监控及问题定位排除
基于Spring Boot Admin告警之应用状态告警
Ansible在自动化运维中的使用
自助迁发分支工具
大数据
基于CDH集群的大数据项目的优化总结
Oracle实时同步大数据平台解决方案
实时流关联维表解决方案
中间件
浅谈Elasticsearch的资源分配
Apache Kafka使用规范Elasticsearch安装及使用
SSDB介绍及使用
RabbitMq使用简单介绍
Spring Cloud常用组件介绍
前端
ESLint + Prettier 规范前端代码
Vue.js对WinXP系统对兼容性
关于采集操作系统、浏览器版本的设计方案及一些浏览器兼容性问题处理
安卓动态加载SO文件
对浏览器的理解及兼容移动端H5本地化方案调研和实践
自适应网页设计
短信/浏览器唤起APP方案
基础知识
Sonar简介
JVM基础系列1:JVM内存模型介绍
JVM基础系列2:JVM配置参数和Java内存模型
JVM基础系列3 虚拟机字节码执行引擎
开发规范
Java异常处理规范
战略方向
金融保险系统开源浪潮下机遇与挑战
项目实战
运维工作要学会“偷懒”
“用户思维+中台架构”快速搭建金融宝app
多维分保的应用探索
用文化指引自身的成长之路 -2020年技术成长心得分享
从工作中探寻自身的成长之路
从《平凡的荣耀》到记一次兼容性改造优化后的技术感悟
客户为中心,统筹协调,把控风险
让我们的管理看的见
![32cce81ba1924b95de838bbd94de5f83.png](https://i-blog.csdnimg.cn/blog_migrate/750270afc116f2742805c2e9a5b3fe8b.png)
请识别下方二维码,关注 技术支持联盟
热衷于开源项目,请扫码进群