也是一个业务需求,如题,有曾经实现过的大佬嘛?能否给个例子或文章链接参考一下
1
Mazexal 2018-08-30 09:30:23 +08:00
存数据库
|
2
Light3 2018-08-30 09:44:30 +08:00
mysql 存一条 里面有个过期时间 不就完了吗
|
3
rockyou12 2018-08-30 09:45:15 +08:00
数据库存过期时间,然后程序轮询
|
4
tlday 2018-08-30 09:48:26 +08:00 via iPhone 5
不需要轮询让他失效,用的时候查一下是不是在有效期内就可以了。
|
6
batter 2018-08-30 10:04:05 +08:00
表里面添加一条数据,设置过期时间就可以了
|
7
ieiayaobb 2018-08-30 10:09:25 +08:00
我们之前有一种很 trick 的做法是用 JWT,也有 ttl,可以在验证签名的时候校验
|
8
Shynoob 2018-08-30 10:10:20 +08:00
相比问题我更好奇为什么不使用 redis
|
9
tomfs 2018-08-30 10:14:50 +08:00
简单需求没必要弄卡车来跑吧,memcached 就足够了吧
|
10
Zzdex 2018-08-30 10:15:58 +08:00 via iPhone
用 jwt
|
11
willchen 2018-08-30 10:18:52 +08:00
嗯 jwt 可以,大致就是把过期时间 加密后 作为参数
|
12
rockyou12 2018-08-30 10:27:36 +08:00
@matzoh 过期的时候可能需要触发其他业务,只存时间很多时候都不行。redis 本身 key 可以设置过期时间,而且可以订阅其事件达到一过期就自动触发业务,你只用数据库那不就只能轮询了。
|
13
Hayek 2018-08-30 10:29:41 +08:00
|
14
alwayshere 2018-08-30 10:35:43 +08:00
用数据库存时间也是醉了,你把时间用个可逆式加密的函数写进验证码不就行了吗,后端验证的时候解密验证时间不就行了
|
15
lerry 2018-08-30 10:37:15 +08:00 1
base64(过期时间$用户 id$sha1(过期时间+用户 id+secret_key))
请求的时候,服务器拆开过期时间和用户 id(或者 token) 和哈希值,检查时间是否到期,对过期时间、用户 id、密钥做哈希,检查是否一致 并不需要用数据库 |
16
rockyou12 2018-08-30 10:38:18 +08:00
@Hayek 我又不是写需求,我是在解释为什么用 redis 比较好,还有为什么数据库轮询可以达到一样的效果。领导当惯了口气不小啊?(´・_・`)
|
18
Hayek 2018-08-30 10:40:23 +08:00
@rockyou12 哈哈,抱歉了,不是领导,底层码农而已,偶尔带新人。您说的情况下确实 redis 好,然而楼主并没有说过期之后要触发什么需求,我只是不太喜欢过度优化,简单需求复杂化而已。
|
19
choice4 2018-08-30 10:49:16 +08:00
guava 呢
|
21
loveCoding 2018-08-30 10:59:02 +08:00
在 url 上带个过期时间的加密参数,前提是别让人解出来
|
22
ronglexie 2018-08-30 11:03:32 +08:00
|
23
wplct 2018-08-30 11:06:55 +08:00
楼上有些程序员的方案怕不是要被打死
|
24
rockyou12 2018-08-30 11:29:08 +08:00
|
25
tt67wq 2018-08-30 11:32:20 +08:00
jwt 可以做的吧
|
26
willchen 2018-08-30 11:37:10 +08:00
@Hayek 我用过的邮箱验证码都是链接 逃),说 jwt 是能让一个链接同时搞定认证用户 id 和有效时间,只需要有效时间的话,就是我说的后半句话。
|
27
zsdroid 2018-08-30 11:39:02 +08:00
@alwayshere #14 数字验证码了解下
|
28
ipwx 2018-08-30 11:44:41 +08:00 via iPhone
数据库存时间,后台任务定期轮询,反正时间序基本等于自然序,处理完开头的记录就可以等下一次轮询了,基本没有效率损失。
|
29
aa6563679 2018-08-30 11:46:19 +08:00
把过期时间加密写到验证码里面
|
30
reus 2018-08-30 11:47:16 +08:00
验证码太短,肯定要数据库,如果是验证 url,可以把过期时间和其他信息打包然后做 aes 之类的对称加密,验证时看记录的时间就行
|
31
yejinmo 2018-08-30 11:53:33 +08:00
List + 维护线程
|
32
derrickT 2018-08-30 12:20:41 +08:00
时间戳作为参数然后加密,验证的时候解密就可以了
|
33
opengps 2018-08-30 12:22:32 +08:00
存哪都行,只要带着时间就可以,验证时候检测是否超期,或者直接超期数据自动删掉
|
34
liuqitoday 2018-08-30 12:26:43 +08:00 via Android
jwt
|
35
reself 2018-08-30 12:41:10 +08:00 via Android
@Hayek shut your mouth and show me your code。diss 别人时请拿出自己的方案。
|
36
d5 2018-08-30 12:43:13 +08:00 via iPhone
jwt 思路不错
|
37
reself 2018-08-30 12:47:07 +08:00 via Android
假设这里的 redis 统指服务端存储。这就是一个 token 到过期信息的 map,就看把过期信息存储到哪里。可以考虑 jwt 或者类似的把信息存储到客户端的方案。甚至可以考虑区块链,把信息存到网络上。
|
38
honeycomb 2018-08-30 12:48:00 +08:00 via Android
jwt 的 TTL,布隆过滤器什么的都可以
|
39
wfd0807 2018-08-30 12:55:33 +08:00 4
这个帖子暴露了 V2 的部分程序员的水平,好帖子~
|
40
wfd0807 2018-08-30 13:04:35 +08:00 1
先分析问题,再给解决方案
楼上那些上来就给方案的,我想问问,你们确定知道楼主要做的是"验证邮箱"还是"接收验证码"吗? |
41
wfd0807 2018-08-30 13:06:30 +08:00 1
最后还要喷一下楼主,要想别人提供有效的帮助,自己先学会高效的沟通
|
42
lhx2008 2018-08-30 13:10:30 +08:00 via Android
如果是 java 的话,guava cache 可以单机代替 redis
|
44
panpanpan 2018-08-30 13:27:09 +08:00 via iPhone
Jwt 贼适合干这事
|
45
Hayek 2018-08-30 14:16:51 +08:00
@reself shut your mouth and read other replies. 楼上有人说了存一条过期时间就行了,我就没必要重复了。而且我并没有 diss 的意思,第一条回复可能被误解 diss,我已经道歉。
哎,英文真是好,我还得查字典来回复您。 |
46
Hayek 2018-08-30 14:20:30 +08:00
@willchen 是的,邮箱一般都是链接,楼主这个描述确实有问题。我觉得用 jwt 的话,那这个发给用的链接里面要把 jwt 的参数带上,这个链接就会很长。
一般的网站的做法是生成一个加密字符串(大部分时候是加 salt 的 md5 ),数据里存下来,然后把这个加密字符串拼接到 url 里发送给客户。 |
49
honeycomb 2018-08-30 16:48:27 +08:00 via Android
@lhx2008 现在用 caffeine 比 guava cache 更好,前者是利用了 Java 8 的 concurrenthashmap 重写版的后者
|
50
sky101001 2018-08-31 11:37:06 +08:00 via iPad
如果楼主的题干是指接收数字验证码,而不是链接
那么我真的很想知道楼主的那个数字验证码是存在哪里的 |
51
YiweiHangzhi OP @sky101001 我现在暂时先全存数据里了,验证码、有效状态、邮件发送时间三个字段
|
52
mmdsun 2018-09-01 01:00:13 +08:00 via Android
放 session 设置过期时间。。
|