从Redis列表中弹出随机集成员

时间:2015-06-22 13:49:06

标签: ruby redis

我正在寻找一种方法从Redis中的Set中随机弹出一个Set成员,但只有与提供的列表/数组匹配的pop成员。

例如,我可以创建(使用Redis gem)这样的集合

require 'redis'
redis = Redis.new

redis.hmset("user_1", :username, "user1", :password, "password")
redis.hmset("user_2", :username, "user2", :password, "password")
redis.hmset("user_3", :username, "user3", :password, "password")
redis.hmset("user_4", :username, "user4", :password, "password")
redis.hmset("user_5", :username, "user5", :password, "password")
redis.hmset("user_6", :username, "user6", :password, "password")    

redis.sadd("users", ["user_1", "user_2", "user_3", "user_4", "user_5", "user_6"])

所以此时我有一个名为“用户”的集合。要从集合中获取随机用户,我可以这样做:

@redis = Redis.new
@randUser = @redis.spop("users")

但我想要做的只是从预定义列表中选择一个随机用户,因此在整个集合中我只想选择user_1user_2,而无需创建新的设置

这背后的想法是一些用户拥有比其他用户更多的权限,对于我使用的某些测试,我想选择某些用户。

@redis = Redis.new
@randUser = @redis.spop("users", ["user_1", "user_2"]) # Incorrect syntax but to give illustration of what i want to achieve

这一切都可能吗?

修改

考虑到这一点,如果我在用户弹出设备后进行检查,然后如果不是我想要的话将其重新放入,这不应该导致很多时间延迟吗? / p>

类似

def choose_redis_user
  @redis = Redis.new
  @randUser = @redis.spop("users")
  if @randUser.includes? ["user_1", "user_2", "user_3"]
    $user_username = @redis.hget(@randUser, "username")
    $user_password = @redis.hget(@randUser, "password")
  else
    @redis.sadd("users", @randUser)
    # How do i return to top to select another user
  end
end

我现在要测试这个,但是我如何把它放在一个循环中,以便如果用户不匹配再次弹出一个?

0 个答案:

没有答案