それでもRedisコマンドで抽選を行うことはできますか?

親愛なる皆さん、2020年はこの2週間で終わりに近づいており、多くの企業が次々と年次総会の準備を始めています。年次総会で最も期待されているプログラムは間違いなくラッキードローです。

ある日、リーダーは「リトルファッティ、会社はもうすぐ年次総会を開くでしょう。宝くじプログラムを書いてください」とあなたに言いました。その後、黙ってEclipseを開き、Math.random()の作成を開始しました。

今日、Feng兄弟は、宝くじについてはそれほど面倒である必要はなく、Redisセットコレクションの使用を検討できると言っています。


セットの2つの主要な特性は、重複排除と無秩序であることは誰もが知っています。同様に、Redisセットもこれら2つの特性を満たしています。

Redisセットが提供する使用法を見てみましょう(セット関連のコマンドのほとんどはsで始まることがわかります)。

127.0.0.1:6379> help @set
  SADD key member [member ...]
  summary: Add one or more members to a set
  since: 1.0.0

  SCARD key
  summary: Get the number of members in a set
  since: 1.0.0

  SDIFF key [key ...]
  summary: Subtract multiple sets
  since: 1.0.0

  SDIFFSTORE destination key [key ...]
  summary: Subtract multiple sets and store the resulting set in a key
  since: 1.0.0

  SINTER key [key ...]
  summary: Intersect multiple sets
  since: 1.0.0

  SINTERSTORE destination key [key ...]
  summary: Intersect multiple sets and store the resulting set in a key
  since: 1.0.0

  SISMEMBER key member
  summary: Determine if a given value is a member of a set
  since: 1.0.0

  SMEMBERS key
  summary: Get all the members in a set
  since: 1.0.0

  SMOVE source destination member
  summary: Move a member from one set to another
  since: 1.0.0

  SPOP key [count]
  summary: Remove and return one or multiple random members from a set
  since: 1.0.0

  SRANDMEMBER key [count]
  summary: Get one or multiple random members from a set
  since: 1.0.0

  SREM key member [member ...]
  summary: Remove one or more members from a set
  since: 1.0.0

  SSCAN key cursor [MATCH pattern] [COUNT count]
  summary: Incrementally iterate Set elements
  since: 2.8.0

  SUNION key [key ...]
  summary: Add multiple sets
  since: 1.0.0

  SUNIONSTORE destination key [key ...]
  summary: Add multiple sets and store the resulting set in a key
  since: 1.0.0

 

一般的に使用されているものをいくつか見てみましょう。

127.0.0.1:6379> SADD k1 a a b b c d //在名为k1的集合中添加abcd四个元素
(integer) 4
127.0.0.1:6379> SADD k2  b c d e
(integer) 4
127.0.0.1:6379> SCARD k1 //列出集合的大小
(integer) 4
127.0.0.1:6379> SMEMBERS k1 //列出集合中所有元素,可以看出“去重且乱序”的
1) "c"
2) "a"
3) "d"
4) "b"
127.0.0.1:6379> SISMEMBER k1 a //集合k1是否包含a
(integer) 1
127.0.0.1:6379> SISMEMBER k1 aa
(integer) 0
127.0.0.1:6379> sdiff k1 k2 //集合k1和k2的差异,k1,k2是有顺序的(k1-k2)
1) "a"
127.0.0.1:6379> sdiff k2 k1
1) "e"
127.0.0.1:6379> SUNION k1 k2 // 并集
1) "a"
2) "d"
3) "b"
4) "c"
5) "e"
127.0.0.1:6379> SINTER k1 k2 //交集
1) "c"
2) "d"
3) "b"
127.0.0.1:6379> SRANDMEMBER k1 //从集合中随机取出(get)一个元素
"c"
127.0.0.1:6379> SRANDMEMBER k1
"b"
127.0.0.1:6379> SRANDMEMBER k1 3 //从集合中随机(这不废话吗,反正set也是无序的)取出3个元素
1) "c"
2) "d"
3) "b"
127.0.0.1:6379> SRANDMEMBER k1 3
1) "a"
2) "d"
3) "b"
127.0.0.1:6379> SPOP k1 3  //从集合中随机取出(remove)3个元素
1) "d"
2) "a"
3) "b"
127.0.0.1:6379> SPOP k1 2
1) "c"

お気づきかもしれませんが、抽選はSRANDMEMBERまたはSPOPで行うことができます。

1.賞品の数>抽選の数

    3人の会社が5つの賞品を用意したと仮定すると、それを繰り返すことができます。

127.0.0.1:6379> sadd lotteryList tom jerry tony
(integer) 3
127.0.0.1:6379> SRANDMEMBER lotteryList -5 //如果为负数,会首先满足返回元素个数,可能会有重复
1) "tom"
2) "jerry"
3) "tony"
4) "jerry"
5) "jerry"

2.賞品数<抽選数

127.0.0.1:6379> sadd lottoryList tom jerry jack tony lucy lily poly kevin
(integer) 8
127.0.0.1:6379> spop lottoryList 3 //三等奖
1) "jerry"
2) "jack"
3) "lily"
127.0.0.1:6379> spop lottoryList 2 //二等奖
1) "kevin"
2) "poly"
127.0.0.1:6379> spop lottoryList 1 //一等奖
1) "tony"

 


総括する

少し要約してみましょう。宝くじの抽選のような単純なランダムシーンの場合、実際の状況に基づいて、RedisのSRANDMEMBERまたはspopを使用して達成するという別のアイデアを検討できます。

さて、これはこの共有の場合です。次回はsorted_setについて説明します。あなたが得ることができることを願っています。

おすすめ

転載: blog.csdn.net/H517604180/article/details/111084993