如何设计一个每天每人只能点赞一次的功能(无状态)?

July_EF
  • 235

如题:
如何设计一个点赞统计的功能 ,每天每人只能点击一次,没有登陆状态

我是通过cookie的思路 控制每人每天只能点击一次

如果缓存被清空了,就会有bug 访客会再次重新点击
如何设计?

如果控制ip 就需要存入数据库,是否有其它最优方案?

回复
阅读 6.3k
10 个回答
✓ 已被采纳

前提:没有登陆状态
如你所说,通过 cookie 控制,是有缺陷的。
建议:
这种时效性的操作,可以用 redis 一类的缓存来做,没必要持久化存储。
当然,后端存储,无论是否持久化,你都是需要客户端的凭证的,也就是 IP

方案:
redis 存储当天点赞的 IP 集合,如果在集合里,则限制点赞。
每天零点,清空集合,重新记录即可。

参考:redis-set

经验告诉我说。不登录的话,没有唯一标识,(IP不算唯一标识)。真的限制不住。

防住的都是普通用户。

感觉这个问题的关键点在身份的确认,无论是种在cookie中还是通过ip限制都是不靠谱的,cookie可以清楚掉,至于ip我们获取的是一个出口ip(一个路由可能有多个电脑使用,但他们的出口ip一样,那么他们这些不同的电脑算是一个,还是多个呢?)
这个应该业务决定的,通过业务决定什么才叫做一个独立的用户,如果对点赞的数据可靠性要求比较高,最好还是要登录操作,希望对你有帮助

这些一般写 redis,简单点以 uid 为 key,value = 1,表示已经点赞。 ttl 设置成今天 24 点的时间戳 - 点赞时间。

想完全控制就得在服务端记录用户的唯一标识,数据库或者文本文件都可以

你这样想哈,要知道这个人(今天)有没有点过赞,那就肯定要一个东西来存储状态,
这个状态可以放前端cookie存,可以放后端数据库存,再高深一点就是借助其他同步状态存储。
那么你这个点赞状态有没有和其他状态是同步的呢?比如说点完赞本用户今天头像就多了个啥标志之类的,就可以依靠这个标志来判断是否点赞,这就是借助了标志存储状态了。
反正必须要一个东西来存啊。

不管cookie还是ip,最关键是看你的这个功能面向的对象,对象是普通用户cookie足矣

这个cookie或者ip的可靠性都不高,如果别人使用了批量代理ip来请求,照样可以刷数据

不能.只能有限的限制一下.

如果没有登陆状态怎么判断“每人”呢?这里的“每人”应该是指每个用户吧。用户每天的点赞状态要判断,要判断就要存储。所以,我是没有想到好的方法。

宣传栏