ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Sa-Token 集成 Redisson:sa-token-redisson 插件的多生态配置、Dao 组装与 Codec 详解

Sa-Token 集成 Redisson:sa-token-redisson 插件的多生态配置、Dao 组装与 Codec 详解 Sa-Token 集成 Redissonsa-token-redisson 插件的多生态配置、Dao 组装与 Codec 详解【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token导读本文围绕 Sa-Token 官方扩展插件sa-token-redisson展开系统讲解如何在 Solon、SpringBoot 等不同生态下引入依赖、配置 Redis 连接并组装SaTokenDao深入剖析其默认StringCodec序列化机制与版本升级注意事项。读完本文你将掌握用 Redisson 作为 Sa-Token 分布式缓存层的完整落地步骤并理解其底层读写、过期与搜索的实现原理。一、插件定位不与生态绑定的 Redisson Dao 扩展sa-token-redisson是 Sa-Token 的持久层Dao扩展插件其核心目标只有一个把 Sa-Token 产生的 token、session 等数据存进 Redis且不与任何 Web 框架生态绑定。也就是说它并不依赖 Spring 或 Solon 的自动装配而是暴露一个最纯粹的SaTokenDao实现类由使用者自行在各自框架中组装。这一点可以从模块依赖关系得到印证在 sa-token-redisson 的 pom.xml 中除测试依赖外只声明了两个依赖——sa-token-core与org.redisson:redisson没有任何 Spring/Solon 相关依赖。sa-token-core提供SaTokenDao接口与框架核心逻辑redisson提供 Redisson 客户端 APIRBucket、RBatch、RBucketAsync 等。正因如此该插件可以平滑应用于 SpringBoot、Solon、JFinal 等任意生态由各生态自行管理RedissonClient的创建与注入。二、核心实现类 SaTokenDaoForRedisson 一览插件全部业务逻辑都集中在一个类中SaTokenDaoForRedisson自 1.34.0 版本提供。它的声明如下public class SaTokenDaoForRedisson implements SaTokenDaoByObjectFollowString, SaTokenDao其中SaTokenDao是 Sa-Token 定义的持久层顶层接口见 SaTokenDao.java定义了字符串读写get/set/update/delete/getTimeout/updateTimeout、对象读写、SaSession 读写、会话搜索searchData以及生命周期init/destroy等全部能力。而SaTokenDaoByObjectFollowString是核心包提供的一组自动实现接口见 SaTokenDaoByObjectFollowString.java它用默认方法把 Object 读写、SaSession 读写统一降级为 String 读写——即先把对象序列化为 JSON 字符串再走get/setSaSession 又通过SaTokenDaoBySessionFollowObject见 SaTokenDaoBySessionFollowObject.java跟随 Object 读写。因此插件类只需要实现最核心的 6 个 String 读写方法 searchData其余对象级能力全部自动获得这也是中间件型缓存实现推荐 implements 此接口的设计初衷。2.1 关键常量约定SaTokenDao接口定义了两个贯穿全局的超时语义常量见 SaTokenDao.java常量值含义NEVER_EXPIRE-1key 永不过期NOT_VALUE_EXPIRE-2系统中不存在该缓存对不存在的 key 查询剩余存活时间时返回set方法对 timeout 的处理规则为timeout 0时限时存储timeout -1永久存储timeout 0或 -2时不存储。这些规则在源码与测试中均有严格对应。2.2 读写实现的底层细节从源码SaTokenDaoForRedisson.java可以看到几个值得注意的实现细节set写入采用批处理保证原子性当 timeout 大于 0 时通过redissonClient.createBatch()创建 RBatch在同一批次内执行setAsync(value)与expireAsync(Duration.ofSeconds(timeout))再统一batch.execute()避免先写值再设过期之间出现窗口期。update使用setAndKeepTTL该方法对应 Redis 的SET KEEPTTL可以在原子覆写 value 的同时保留原 TTL适合刷新 token 值时保持原有有效期。源码注释明确要求Redis 版本 6.0并在类文件底部给出了 Redis 6.0 的兼容写法先读remainTimeToLive()再按永不过期/限时分支用set或set(value, Duration.ofMillis(expireMs))实现。updateTimeout处理改为永久语义当目标为NEVER_EXPIRE时若当前 key 已是永久则不做任何操作否则通过再次set实现其余情况直接expire(Duration.ofSeconds(timeout))。searchData使用 SCAN 式流式匹配通过getKeys().getKeysStreamByPattern(prefix * keyword *)流式获取 key再交由核心包的SaFoxUtil.searchList完成分页与排序避免阻塞式KEYS命令。2.3 测试佐证插件自带完整的单元测试 SaTokenDaoForRedissonTest.java它继承公共测试基类SaTokenDaoStringTestCommon见 sa-token-redis-dao-test-common启动内嵌 Redis 做真实往返验证。覆盖用例包括set/get 往返、缺失 key 返回 null、timeout0/-2/更小值时不写入、非法 timeout 保留旧值、timeout-1 永久存储、delete 与删除缺失 key、getTimeout 剩余秒数、update 改值保 TTL、updateTimeout 修改与转永久、searchData 前缀/关键字/分页/反序/空结果等可作为该 Dao 行为契约的权威参考。三、在 Solon 生态中集成 sa-token-redisson插件 README 给出的 Solon 集成方案分三步加依赖、配 dao、组装 Bean。仓库中的真实示例位于 sa-token-demo-solon-redisson其 pom 中即引入了sa-token-redisson与redisson-solon-plugin见 pom.xml。3.1 添加依赖dependencies dependency groupIdcn.dev33/groupId artifactIdsa-token-redisson/artifactId version${sa-token.version}/version /dependency dependency groupIdorg.noear/groupId artifactIdredisson-solon-plugin/artifactId version${solon.version}/version /dependency /dependencies3.2 添加 dao 配置在配置文件中声明 Redisson 的连接信息sa-token-dao: config: | singleServerConfig: password: 123456 address: redis://localhost:6379 database: 0说明sa-token-dao是 Solon 侧注入点config内为 Redisson 的标准singleServerConfig单节点配置如需集群可替换为clusterServersConfig等 Redisson 支持的其他配置结构该 key 名称与 3.3 节Inject(${sa-token-dao})中的占位符一一对应。3.3 组装 SaTokenDaoConfiguration public class SaTokenConfigure { /** * 构造 RedissonClient */ Bean public RedissonClient saTokenDaoInit(Inject(${sa-token-dao}) RedissonSupplier supplier) { return supplier.get(); } /** * 构建 SaTokenDao */ Bean public SaTokenDao saTokenDaoInit(RedissonClient redissonClient) { return new SaTokenDaoForRedisson(redissonClient); } }这里有两个 Bean第一个利用 Solon 提供的RedissonSupplier从sa-token-dao配置段构造出RedissonClient第二个把RedissonClient包装成 Sa-Token 认识的数据源SaTokenDao。仓库示例 SaTokenConfigure.java 中还额外注册了全局拦截器等鉴权配置可以对照参考。四、在 SpringBoot 生态中集成 sa-token-redissonSpringBoot 场景下的组装更为轻量因为RedissonClient由redisson-spring-boot-starter自动装配无需手动构造。4.1 添加依赖dependencies dependency groupIdcn.dev33/groupId artifactIdsa-token-redisson/artifactId version${sa-token.version}/version /dependency dependency groupIdorg.redisson/groupId artifactIdredisson-spring-boot-starter/artifactId version${redisson.version}/version /dependency /dependencies4.2 添加 dao 配置SpringBoot 场景通过标准 Redisson Starter 配置指定配置文件spring.redis: redisson: file: classpath:redisson.ymlredisson.yml中同样填写 Redisson 原生配置单节点、集群等均可由 Starter 加载并注入容器。4.3 组装 SaTokenDaoConfiguration public class SaTokenConfigure { /** * 构建 SaTokenDao */ Bean public SaTokenDao saTokenDaoInit(RedissonClient redissonClient) { return new SaTokenDaoForRedisson(redissonClient); } }与 Solon 版本相比这里省去了构造RedissonClient的一步直接从容器中取用 Starter 装配好的实例即可。五、Codec 机制默认 StringCodec 与业务隔离5.1 默认使用 StringCodecSaTokenDaoForRedisson在读写 Redis 的 Bucket 时默认使用StringCodec并且与业务侧RedissonClient的全局 codec 相互隔离。这一设计在源码中有明确体现/** * 使用默认 {link StringCodec} */ public SaTokenDaoForRedisson(RedissonClient redissonClient) { this(redissonClient, StringCodec.INSTANCE); } /** * 指定 codec与业务 RedissonClient 全局 codec 隔离 */ public SaTokenDaoForRedisson(RedissonClient redissonClient, Codec codec) { this.redissonClient redissonClient; this.codec codec; }内部取 Bucket 时显式传入 codecprivate RBucketString getBucket(String key) { return redissonClient.getBucket(key, codec); }也就是说无论业务方给RedissonClient配置了何种全局编解码器Kryo5、Jackson 等Sa-Token 的数据读写都固定走StringCodec不会与业务数据互相干扰。这一点也有对应测试佐证见 SaTokenDaoForRedissonTest.java默认构造应持有StringCodec.INSTANCE指定 codec 的构造则按传入 codec 读写成功。5.2 两种构造方式// 默认 StringCodec return new SaTokenDaoForRedisson(redissonClient); // 指定 codec例如兼容升级前的 Kryo5 缓存 return new SaTokenDaoForRedisson(redissonClient, new Kryo5Codec());指定 codec 的能力自 1.46.0 版本起提供主要用于解决下述升级兼容问题。5.3 升级注意事项重要官方文档对 Codec 行为变更给出了明确告警升级注意此前跟随 Redisson 全局 codec未自定义时为Kryo5Codec。升级后旧缓存无法用StringCodec读取。也就是说历史版本中SaTokenDaoForRedisson使用的是 Redisson 全局 codec默认即 Kryo5Codec 二进制序列化而新版本默认改为StringCodec纯文本序列化。两种 codec 写入 Redis 的字节形态不同升级后旧缓存中的历史数据将无法被新版本正确读取。官方给出的处理方式有两种清空 Redis 中所有 Sa-Token 数据让新版本以StringCodec重新写入推荐最简单彻底若旧数据仍需保留则在构造SaTokenDaoForRedisson时显式传入new Kryo5Codec()与旧格式保持一致。选择方式 2 时后续如需回归StringCodec仍需按方式 1 清理数据。六、深入理解Sa-Token 的 Dao 扩展点与本文的关系SaTokenDao是 Sa-Token 所有持久层方案的统一抽象见 SaTokenDao.java默认情况下 Sa-Token 使用内存 Map 存储数据一旦注册了自定义SaTokenDaoBean如本插件的SaTokenDaoForRedisson框架便会将 token、session 等全部数据转向 Redis 存储从而实现多实例共享、分布式会话等能力。本文介绍的sa-token-redisson正是这条扩展链路中的一环它以最小的代码面仅 6 个 String 方法 searchData实现了完整的数据层能力配合SaTokenDaoByObjectFollowString的自动降级机制让上层对象读写、Session 读写无需重复实现。如果你需要对比其他 Redis 集成方案如sa-token-redis-template、sa-token-alone-redis等可以参考 sa-token-plugin 目录下的对应模块想要了解 Sa-Token 数据结构的存取语义可查阅 sa-token-doc 文档目录中的相关章节。七、结语sa-token-redisson是一个小而精的集成插件不绑定生态、依赖面窄、实现集中于单文件配合StringCodec的默认隔离策略可以在各种框架中快速把 Sa-Token 数据层切换到 Redisson/Redis。集成时只需记住三件事依赖sa-token-redisson 所在生态的 Redisson 接入组件用Bean把RedissonClient包装为SaTokenDao若从旧版本升级留意 Codec 从 Kryo5Codec 到 StringCodec 的变化必要时清库或显式指定Kryo5Codec。【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表