
Sa-Token 默认把数据放内存,这个设计本身没问题。 它的优点很实在:快,而且没有序列化/反序列化损耗。
但到了真实工程环境,两个问题会非常致命:
所以你会看到一个很典型的现象:
我后来把会话层切到 Redis,本质上就是把会话从“进程内状态”变成“共享状态”。 这一步做完,重启丢失和多节点不一致才算真正收敛。
如果你只想快速落地,不想折腾太多实现细节,直接上官方推荐方案就行。
<!-- Sa-Token 整合 RedisTemplate -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-template</artifactId>
<version>${sa.top.version}</version>
</dependency>
<!-- 提供 Redis 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>// Sa-Token 整合 RedisTemplate
implementation 'cn.dev33:sa-token-redis-template:${sa.top.version}'
// 提供 Redis 连接池
implementation 'org.apache.commons:commons-pool2'这块我个人建议是:先跑通,再优化。 别一上来就追求“最优序列化格式”,先把会话一致性问题解决掉。
我踩过的坑是:依赖加了,但环境变量没配全。 结果项目看起来启动正常,实际会话并没有落到 Redis。
spring:
# redis配置
redis:
# Redis数据库索引(默认为0)
database: 1
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
# password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0# Redis数据库索引(默认为0)
spring.redis.database=1
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
# spring.redis.password=
# 连接超时时间
spring.redis.timeout=10s
# 连接池最大连接数
spring.redis.lettuce.pool.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0⚠️ 小提示:如果你是 SpringBoot3.x,前缀要从 spring.redis 改成 spring.data.redis。
默认情况下,Redis 里看到的是 JSON 格式。 这没什么问题,但你要知道它背后是两层序列化:
String 序列化JSON 序列化如果你需要换 JSON 框架,可以用这些依赖。
<!-- Sa-Token 整合 Fastjson -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson</artifactId>
<version>${sa.top.version}</version>
</dependency>Gradle 参考:implementation 'cn.dev33:sa-token-fastjson:${sa.top.version}'
<!-- Sa-Token 整合 Fastjson2 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson2</artifactId>
<version>${sa.top.version}</version>
</dependency>Gradle 参考:implementation 'cn.dev33:sa-token-fastjson2:${sa.top.version}'
<!-- Sa-Token 整合 Snack3 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-snack3</artifactId>
<version>${sa.top.version}</version>
</dependency>Gradle 参考:implementation 'cn.dev33:sa-token-snack3:${sa.top.version}'
这个场景我也遇到过。 有些老系统有固定编码约束,不想引入 JSON 序列化,就直接切 String 层。
// 设置序列化方案: jdk序列化 (base64编码)
@PostConstruct
public void rewriteComponent() {
SaManager.setSaSerializerTemplate(new SaSerializerTemplateForJdkUseBase64());
}// 设置序列化方案: jdk序列化 (16进制编码)
@PostConstruct
public void rewriteComponent() {
SaManager.setSaSerializerTemplate(new SaSerializerTemplateForJdkUseHex());
}// 设置序列化方案: jdk序列化 (ISO-8859-1编码)
@PostConstruct
public void rewriteComponent() {
SaManager.setSaSerializerTemplate(new SaSerializerTemplateForJdkUseISO_8859_1());
}💡 实战建议:
1. 集成 Redis 后,需要手动保存数据吗? 不需要,框架自动保存。你上层 API 基本不用改。
2. 只加依赖,不配 Redis 连接可以吗? 不行。必须保证项目初始化出可用 Redis 实例。
3. 版本怎么选?
Sa-Token-Redis 集成包版本,尽量和 Sa-Token-Starter 保持一致,不然兼容性问题很隐蔽。
Sa-Token 也给了 MongoDB 的集成参考:
🚀 真要在项目里稳落地,我建议按这个顺序:
sa-token-redis-template 跑通全链路。工程里最危险的,不是“不会配 Redis”,而是“以为自己已经配好了 Redis”。
你们项目里,Sa-Token 会话层是直接内存模式,还是已经切到 Redis 了? 如果切过,你踩过最难排查的坑是哪一个?评论区聊聊
本章源码(GitHub): https://github.com/BNTang/Sa-Token-Demo/tree/main/sa-token-demo-redis
[1] 集成 MongoDB 参考一: /up/integ-spring-mongod-1
[2] 集成 MongoDB 参考二: /up/integ-spring-mongod-2
如果这篇文章帮到了你,不妨点个分享给同样需要的朋友吧! 你的每一次支持,都是我持续创作的动力!💪