summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2019-02-18 12:39:00 +0100
committerantirez <antirez@gmail.com>2019-02-18 12:39:07 +0100
commite6948b8f2847896d3c6443744a53f7c3f79a1984 (patch)
tree9de2f464dec3c4e7a9f2ef1c3681d9690971c46c
parent86802d4f2681baa04869fabfbd0ca6c2fe0a94d7 (diff)
downloadredis-e6948b8f2847896d3c6443744a53f7c3f79a1984.tar.gz
showdist.rb utility for SRANDMEMBER analysis added.
-rw-r--r--utils/srandmember/README.md2
-rw-r--r--utils/srandmember/showdist.rb33
2 files changed, 35 insertions, 0 deletions
diff --git a/utils/srandmember/README.md b/utils/srandmember/README.md
new file mode 100644
index 000000000..e6dae5ba8
--- /dev/null
+++ b/utils/srandmember/README.md
@@ -0,0 +1,2 @@
+This utility plots the distribution of SRANDMEMBER to evaluate how fair it is.
+See http://theshfl.com/redis_sets for more information on the topic.
diff --git a/utils/srandmember/showdist.rb b/utils/srandmember/showdist.rb
new file mode 100644
index 000000000..243585700
--- /dev/null
+++ b/utils/srandmember/showdist.rb
@@ -0,0 +1,33 @@
+require 'redis'
+
+r = Redis.new
+r.select(9)
+r.del("myset");
+r.sadd("myset",(0..999).to_a)
+freq = {}
+100.times {
+ res = r.pipelined {
+ 1000.times {
+ r.srandmember("myset")
+ }
+ }
+ res.each{|ele|
+ freq[ele] = 0 if freq[ele] == nil
+ freq[ele] += 1
+ }
+}
+
+# Convert into frequency distribution
+dist = {}
+freq.each{|item,count|
+ dist[count] = 0 if dist[count] == nil
+ dist[count] += 1
+}
+
+min = dist.keys.min
+max = dist.keys.max
+(min..max).each{|x|
+ count = dist[x]
+ count = 0 if count == nil
+ puts "#{x} -> #{"*"*count}"
+}