现在平台要加入会员机制,会员每个月 5 元钱,最低一个月,想问下如何计算这一个月时间,是将到期的时间计算出来,到了那个时间执行还是如何操作?用户量比较大,大概几十万会员。
1
kchum 2016-11-27 15:32:46 +08:00 via iPhone
没有会员的有限时间这个字段咩
|
2
sagaxu 2016-11-27 15:41:14 +08:00
加索引(is_member, expire_time),每次查 is_member=1 and expire_time < 当前时间的,关闭会员资格。可以每 5 分钟检查一次,每批 limit 10000 条,处理到没有为止。
|
3
xavier007 2016-11-27 15:41:34 +08:00
会员到期一般不都是专门一个字段存储到期日期么? 使用某功能前线判断是否到期
|
4
SlipStupig 2016-11-27 16:01:08 +08:00
不知道你用什么数据库,但是大致思路差不多,我认为根本不要,定时去排查到期的,除非你需要去通知到期用户,所以提一下我的一些愚蠢的想法:
sql:设置一个到期,每次用户登录的时候去检查这个字段就行了,如果他花钱了钱不登录,也就是根本没用你服务,你也不用管他,要考虑一个例外就是用户可能没有付费,这个字段就是-1 或者其他,要去通知的话就是: expired != -1 and today > expired,这样就可以了 nosql :更好办了,直接弄个 collections ,设置一个到期日期,到时间了 token 自动 drop 掉了,找不到 token 的都是到期了的全是到期了的 |
5
Immortal 2016-11-27 16:06:22 +08:00
1 设置一个到期时间 遇到功能限制的地方 先判断会员等级 再判断时间 如果时间到了 但是会员等级还是高级 update
2 设置一个任务计划,每天检查一次所有会员是否到期 |
6
eDeeraiD0thei6Oh 2016-11-27 16:19:05 +08:00
付费会员单独一张表记录
|
7
Curtion 2016-11-27 16:48:47 +08:00
4 楼的不错
1.只有当这个用户登陆 /操作时才执行查询命令,看会员是否到期 2.如果是需要会员功能来达到某个功能,那么在实现这个功能之前可以检查一下会员是否到期 |
8
zhaolion 2016-11-27 17:53:56 +08:00
如果你使用了 redis ,可以用 redis 缓存用户信息,然后支付 vip 时候,使用 redis 命令 EXPIRE 设置一个 vip_key 的过期时间为一个月,然后每次都会检查 redis 缓存里面的这个 vip_key 是否消失了, get 这个 vip_key 为 null 就证明 vip 已经到期了,后续可以做更多操作
|
9
txlty 2016-11-27 18:05:43 +08:00
最古老最普通的实现方式,请求时判断。
|
10
ichou 2016-11-27 18:08:20 +08:00 via iPhone
@zhaolion 支付类信息放在 redis 的话,记得在数据库里做好冗余或者做好持续化。想想 redis 宕一下的话,那酸爽 😂
|
11
ichou 2016-11-27 18:09:20 +08:00 via iPhone
是持久化 上条指误
|
12
raincious 2016-11-27 18:11:58 +08:00
这就是用 Model 的好处:
添加一个字段 expire_time ,然后 function isExpired(): bool { return $this->expireTime < time(); } 后面的操作用这个方法就好了。 |
14
onlyhot 2016-11-27 19:59:33 +08:00 via iPhone
请求时验证。
定时任务跑。 |
15
lianxiaoyi 2016-11-27 20:34:13 +08:00 via Android
记一个用户到期时间,然后记一个是否开通了 vip 标志,然后 2 分钟去数据库执行一次 update 表 set a=非会员 where time<=当前时间!几十万数据毫秒级别完成!
|
16
jimzhong 2016-11-27 21:04:26 +08:00
在表中增加用户的会员到期时间,在用户登录和使用会员服务时检查即可。
还可以写个 cron 脚本,每天午夜扫一次数据库,去掉过期会员的会员标志。 |
17
cncqw 2016-11-27 22:20:17 +08:00
有这么复杂吗,用户表加个会员到期时间字段,每次登录和当前时间判断一下
|
18
techmoe 2016-11-27 23:55:52 +08:00 via Android
请求时验证吧。。逻辑设计好没什么太大问题的
|
19
components 2016-11-28 01:37:59 +08:00
定时任务+redis 跑
|
20
aerostone 2016-11-28 08:17:07 +08:00
几十万用户应该会发通知的吧
|
21
yao978318542 2016-11-28 09:21:50 +08:00
我猜你们肯定是要发短信或者微信模板或者是邮箱之类的提示用户该交钱了,所以可以再服务器上跑个定时查询!用户开通会员的时候插入一个到期时间的字段,判断这个字段就 ok 了
|
22
XueRainey 2016-11-28 09:43:20 +08:00
可以考虑授权,通过验证会员接口获得授权 token 然后再去请求会员服务,这样就可以在验证会员接口进行会员到期验证了。那些花了钱不用会员服务的,其实你也不用管他。
|
23
numberwolf 2016-11-28 10:53:03 +08:00
至于检查的话完全可以跑一个 crontab 检查,反馈到 redis
|
25
realpg 2016-11-28 15:11:14 +08:00
分布式解决这个问题
每次请求自动执行 update user set vip=0 where expire<= {now} limit 1 |
27
hoythan 2016-11-28 18:08:59 +08:00
|
28
cncqw 2016-11-29 10:18:34 +08:00
@hoythan 就想问你怎么在页面上判断一个用户是否为会员并显示出来?你不每次在渲染视图的时候判断一下吗。还肯定不可能,麻烦你自己做一遍就知道原理了。
|
29
duguxiaohuai OP 不想每天都要刷新占用内容啊 毕竟每天都需要定时查询的话还是挺麻烦的
|