我正在寻找一种方法从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_1
或user_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
我现在要测试这个,但是我如何把它放在一个循环中,以便如果用户不匹配再次弹出一个?