Heim  >  Artikel  >  Backend-Entwicklung  >  PHP如何有效防止重复投票问题?

PHP如何有效防止重复投票问题?

WBOY
WBOYOriginal
2016-06-06 20:52:011077Durchsuche

现在需要在一个网站中用到投票系统,需要防止重复投票,想请问有什么比较有效的方法。

因为需要持续记忆投票状态,session 或者cookie肯定是不靠谱,必须写入文件或者数据库么?

顺便问下,Segmentfault采用的什么方法来存储投票状态的?

回复内容:

现在需要在一个网站中用到投票系统,需要防止重复投票,想请问有什么比较有效的方法。

因为需要持续记忆投票状态,session 或者cookie肯定是不靠谱,必须写入文件或者数据库么?

顺便问下,Segmentfault采用的什么方法来存储投票状态的?

无论是现实投票,还是网络投票,都要保证投票者身份的唯一性。一般我们会把投的票放入存储中,但是放到数据库里查询起来显然太慢了,而现在有了redis(http://redis.io),你就可以把它放到set里了。下面我用php代码来演示这一过程,其它语言类同

$userId = '111';
$questionId = '222';

// 用户111向问题222投票,那么我们把222的userId放到名为question:vote:111的set里
$redis->sAdd('question:vote:' . $questionId, $userId);

// 判断222用户是否对111问题投过票了,只需判断111是否被包含在question:vote:111的set里
$isVoted = $redis->sIsMember('question:vote:' . $questionId, $userId);

// 我们还可以取消投票,只需要从set里移除这个元素
$redis->sRem('question:vote:' . $questionId, $userId);

所有的一切都在内存中进行,非常快速

我记得当初我做的时候,把IP和对应的选项写进了数据库。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn