使用Redis完成抽獎功能

redis集合簡介

redis的集合數據類型,功能非常強大。說到集合的話,你可能想到高中數學上的集合。其實他們本就是一個意思。redis集合里面可以存放很多字符串(元素),redis最多支持2的32次方減1個元素,但是集合里的元素都是唯一的,不會有重復。和數學里集合一樣,redis也支持交集,并集以及差集。

用它可以完成許多有意思的功能。最常見的就是標簽功能了,可能A用戶的標簽有“動漫”、”運動“、”二次元“,B用戶的標簽有”運動“、”旅游“、”籃球“。那么,使用集合的并集,就能知道他們的共同標簽是什么。另外,當系統知道用戶的標簽后,就可以給他們推薦相關的廣告或產品。除此之外,還要許多有意思的功能它也能實現。今天,我們來看看如何使用Reids實現抽獎功能。

sRandMember、sPop

這兩個命令功能非常相似,都是從集合中返回一個元素值。不同的是,sRandMember不會從集合中刪除返回的元素,但是sPop會刪除。這兩個命令可以分別實現不同的抽獎算法

比如,集合中有100個元素,值從數字1到數字100.我們定義抽到的是數字1的話,即表示中獎。

使用sRandMember的話,不管之前抽過多少次,下次抽中的概率都是1%。而使用sPop的話,則每次抽中的概率都不一樣。第一個人抽中概率是1%,當第一個人沒抽中的話,第二個人抽中概率就是1/99,以此類推。

抽獎功能實現

抽獎功能實現其實就只有兩步,首先設置抽獎概率,即往集合中添加元素,然后就是開始抽獎了。

設置抽獎概率,偽代碼如下:

/** ?*?$key?集合鍵名 ?*?$cnt?集合元素數量 ?*/ function?setProb($key,?$cnt) { ????for?($i?=?1;?$i?sAdd($key,?$i); ????} }

抽獎,偽代碼如下:

/** ?*?string?$key?集合鍵名 ?*?int?$stand?小于等于該數即表示抽中 ?*?int?$type?抽獎算法,1表示使用sRandMember,2的話 ?*???????????使用sPop ?*/ function?draw?($key,?$stand,?$type?=?1) { ????if?($type?==?1)?{ ????????$number?=?$redis-&gt;sRandMember($key); ????}?else?{ ????????$number?=?$redis-&gt;sPop($key); ????} ???? ????return?$number?<p>注意,stand是用來設置概率的。比如,集合中有10000個元素,將stand設置為10,那么概率即為10/10000.當redis集合返回的元素值小于等于該值,即表示抽中。</p><p>Redis的集合還能完成其他有趣的功能,比如,統計當天的訪問ip,統計活躍用戶等等。大家可以發揮自己的想象力,完成更多有趣的功能。</p>

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享