SRANDMEMBER

SRANDMEMBER key [count]

如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。

从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:

  • 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
  • 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。

可用版本:

>= 1.0.0

时间复杂度:

只提供 key 参数时为 O(1) 。如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。

返回值:

只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 。如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。

  1. # 添加元素
  2. redis> SADD fruit apple banana cherry
  3. (integer) 3
  4. # 只给定 key 参数,返回一个随机元素
  5. redis> SRANDMEMBER fruit
  6. "cherry"
  7. redis> SRANDMEMBER fruit
  8. "apple"
  9. # 给定 3 为 count 参数,返回 3 个随机元素
  10. # 每个随机元素都不相同
  11. redis> SRANDMEMBER fruit 3
  12. 1) "apple"
  13. 2) "banana"
  14. 3) "cherry"
  15. # 给定 -3 为 count 参数,返回 3 个随机元素
  16. # 元素可能会重复出现多次
  17. redis> SRANDMEMBER fruit -3
  18. 1) "banana"
  19. 2) "cherry"
  20. 3) "apple"
  21. redis> SRANDMEMBER fruit -3
  22. 1) "apple"
  23. 2) "apple"
  24. 3) "cherry"
  25. # 如果 count 是整数,且大于等于集合基数,那么返回整个集合
  26. redis> SRANDMEMBER fruit 10
  27. 1) "apple"
  28. 2) "banana"
  29. 3) "cherry"
  30. # 如果 count 是负数,且 count 的绝对值大于集合的基数
  31. # 那么返回的数组的长度为 count 的绝对值
  32. redis> SRANDMEMBER fruit -10
  33. 1) "banana"
  34. 2) "apple"
  35. 3) "banana"
  36. 4) "cherry"
  37. 5) "apple"
  38. 6) "apple"
  39. 7) "cherry"
  40. 8) "apple"
  41. 9) "apple"
  42. 10) "banana"
  43. # SRANDMEMBER 并不会修改集合内容
  44. redis> SMEMBERS fruit
  45. 1) "apple"
  46. 2) "cherry"
  47. 3) "banana"
  48. # 集合为空时返回 nil 或者空数组
  49. redis> SRANDMEMBER not-exists
  50. (nil)
  51. redis> SRANDMEMBER not-eixsts 10
  52. (empty list or set)