白嫖方案:微信 Access_token 时效 2 小时的管理问题

2020-08-05 12:47:38 +08:00
 Visitor233

项目:net core3.1, PostgreSQL12

注:目前没有考虑队列和 redis,定时任务这个没办法再说吧

如题,现在是把获取到的 token,直接存在 psql 库一个单独放各种 token 的表里。有 appid 、token 类型、过期时间(当前时间+2 小时-xx 分钟)、是否更新这四个关键字段。

目前我分了五种情况,代码不方便发,我文字描述吧。

前提:通过参数查到对应的 token 信息,没有就第一种情况处理,有则判断后面四种 一:库没有,申请到新的直接插表 二:库有,且请求在有效期内,直接返回 token 三:库有,但已经到了 xx 分钟时间段内且是否更新字段为 false,需要更新 token 。于是先将字段改为 true,直接 context.savechanges 。然后再申请新的 token,局部更新旧 token,并将字段改为 fasle,再 save,返回新 token 四:库有,也到了 xx 分钟,但是否更新为 true 。直接返回 token (注意:我想这里可能会有脏读,但没关系,微信说了,token 更新期间,旧 token 仍有 5 分钟有效期) 五:库有,但有效期已经过了 xx 分钟,需要更新,考虑到瞬时大量请求刚好赶上,我直接 lock 申请的函数,再更新 token 。

目前就这样,单一请求各个阶段都试了,没问题,但没做压测(我不会,下了 jmeter 没用过) 现在回想起来,我入行一年半还不会多线程很 low 啊,这种单一资源竞争还得写 5 个 if else,罪过罪过。 还请各位大佬在评论区指点一番,先在次谢谢各位。鞠躬.jpg

5043 次点击
所在节点    程序员
34 条回复
340244120w
2020-08-05 19:04:35 +08:00
静态变量完全够了 失效前五分钟提前更新
tcfenix
2020-08-05 19:07:36 +08:00
@Visitor233
....这都 2020 年了....没接触过 c#
不过现在大部分写业务语言的从加个 redis 包到 pingpong 都是几分钟的事情....c#难道这么坑么...

而且就算为了你自己,也一定要上 redis,外部招聘 redis mysql,消息队列这些都是默认服务端开发一定用过的,面试问题的时候,从 redis 如何做独占锁到底层数据结构通常都会问,而且真正工作中也基本都会用到

你经理可能用过了,嫌麻烦不想用,或者怕你搞不定,但是你自己不能放弃任何一个提高自己的机会
Still4
2020-08-05 19:30:46 +08:00
你把 redis 和 psql 都看作是存储,redis 天然支持你的业务需求,同时还满足高并发,随着业务增长 psql 读写更容易到达系统瓶颈
建议不要为了省事将就用现有系统
xylophone21
2020-08-05 19:54:52 +08:00
说 redis 的,其实和你的方案没有本质区别,都是找一个地方存储,当然 redis 可能更合适,因为
1. 超时不需要你处理了,天然支持
2. 性能更好,但实际上估计你也跑不满

另外,你说的那个在是否更新标志使用 redis 也是要处理的,而且也需要一个超时
Pythoner666666
2020-08-05 19:59:07 +08:00
给你说下我们项目的做法吧 简单的一批 直接存 redis 加一个过期时间 用的时候 直接去 redis 取 不存在就主动再去获取并更新 最后加锁 完事了。
echooo0
2020-08-05 23:18:35 +08:00
redis 就行了
Visitor233
2020-08-06 09:17:58 +08:00
@useben
@sunmoon1983
@chinvo
@killergun
@tcfenix
@Still4
@xylophone21
@Pythoner666666 么,大家都说 redis,其实我也认为 redis 很爽,直接 StringSet ( xx,xx,TimeSpan.FromMinutes(90))多舒服,上头担心 redis 崩了会对系统造成影响(我认为系统崩,redis 都不会崩)。昨晚和经理聊,决定加个定时服务,更新 token,再不行就上 redis 吧(这个用过),队列倒是没用过(我收集过一篇基于 k8s 和 rabbitMQ 的文章,这两个还没学会= =)。非常感谢大佬们解惑,鞠躬.jpg
pytth
2020-08-06 09:54:54 +08:00
本地文件缓存不香么?每次访问请求 access_token.json,获得这个 token 当时获取的时间戳,然后用当前时间戳计算,>2 小时则重新请求 token 并更新 access_token.json,若<2 小时则直接使用这个 token
yeept
2020-08-06 10:48:37 +08:00
如果不想上 Redis,既然是 .Net Core, 可以用自带的 MemoryCache
chinvo
2020-08-06 11:00:16 +08:00
@Visitor233 #27 不用 Redis 用 Microsoft.Extensions.Caching.Memory 啊,定时器不是更复杂么
pierswu
2020-08-06 14:47:23 +08:00
Visitor233
2020-08-06 20:41:33 +08:00
@dhssingle
@quan01994 我没听过 MemoryCache,但能 get 到一个新的知识点也不错,感谢大佬进来指点.jpg
@yeept
@chinvo
dhssingle
2020-08-07 09:08:20 +08:00
Still4
2020-08-07 17:02:41 +08:00
主要还是每个系统做自己擅长的事,没有办法的情况下,手术刀能切西瓜吗,当然可以,但是毕竟不是专业的,用起来会很别扭
如果担心 redis 崩了会对系统造成影响,那么你的架构可以改为 core - redis - db,优先读取 redis,没有数据再读取 db 更新到 redis,写数据先写 db 再写 redis,这样 redis 宕机对服务不产生影响,一定程度上也让服务变得更健壮,不过这样一来如果因为压力大导致 redis 宕机,大概率压力转移到 db 也会瞬间崩掉

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/695799

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX