php - 求教url访问一次就失效的设计方法

查看:386
本文介绍了php - 求教url访问一次就失效的设计方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

比如说类似下面这种url:

https://foo.com/?timestamp=时间&nonce=随机串&sign=签名

我能想到的方法有以下几种:
1、存数据库:首次访问,把该url存库,第二次访问,查库;
2、存session,先存,后查;
3、存redis、mencache等,先存,后查;
以上几种方法虽然能够达到要求,但是每次都得先存再查,数据量小还好,如果有上千万、上亿条数据呢?也这么查吗?有没有好的解决办法?

我正在考虑能不能根据url的规则设计一个算法来对url进行是否访问过的验证,就算存数据也只存少许数据,而不用存整个url。

解决方案

你总是要在后台存储url是否访问过这个信息的,这一点跑不了,凭算法手段无法消灭这个问题。

但这个需求的容易之处在于:请求与请求之间是没有联系的,你可以用任意的方法去分表、分库。例如以URL作为分桶依据(注),直接把数据库请求分散到数据库集群中。上千万上亿也是能做到的。

这个需求的真正困难之处在于原子性,即两个请求同时到达服务器时,如何抵抗两个事务同时操作数据库的时间差,造成的数据不一致。

不过这一点的解决也可以靠分表+数据库的锁机制实现。分表分库在这里更是同时承担了(1)分担请求数量压力(2)分担加锁带来的性能压力两个作用。


注1:当然实务上,要先对URL要做一下规范化,避免?v1=1&v2=2?v2=2&v1=1被判定为不同的URL等乌龙情况发生。

注2:实际上根据业务逻辑,用单次有效的索引字符串/token/nonce key(不管叫啥了,随你喜欢)做key才是最好的,省的处理URL的麻烦。

注3:一般而言数据库集群套件,会自动承担平摊分桶的算法,无需手工编写。

这篇关于php - 求教url访问一次就失效的设计方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆