summaryrefslogtreecommitdiffstats
path: root/utils/srandmember
diff options
context:
space:
mode:
Diffstat (limited to 'utils/srandmember')
-rw-r--r--utils/srandmember/README.md14
-rw-r--r--utils/srandmember/showdist.rb33
-rw-r--r--utils/srandmember/showfreq.rb23
3 files changed, 70 insertions, 0 deletions
diff --git a/utils/srandmember/README.md b/utils/srandmember/README.md
new file mode 100644
index 0000000..d3da1e8
--- /dev/null
+++ b/utils/srandmember/README.md
@@ -0,0 +1,14 @@
+The utilities in this directory plot the distribution of SRANDMEMBER to
+evaluate how fair it is.
+
+See http://theshfl.com/redis_sets for more information on the topic that lead
+to such investigation fix.
+
+showdist.rb -- shows the distribution of the frequency elements are returned.
+ The x axis is the number of times elements were returned, and
+ the y axis is how many elements were returned with such
+ frequency.
+
+showfreq.rb -- shows the frequency each element was returned.
+ The x axis is the element number.
+ The y axis is the times it was returned.
diff --git a/utils/srandmember/showdist.rb b/utils/srandmember/showdist.rb
new file mode 100644
index 0000000..2435857
--- /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}"
+}
diff --git a/utils/srandmember/showfreq.rb b/utils/srandmember/showfreq.rb
new file mode 100644
index 0000000..625519c
--- /dev/null
+++ b/utils/srandmember/showfreq.rb
@@ -0,0 +1,23 @@
+require 'redis'
+
+r = Redis.new
+r.select(9)
+r.del("myset");
+r.sadd("myset",(0..999).to_a)
+freq = {}
+500.times {
+ res = r.pipelined {
+ 1000.times {
+ r.srandmember("myset")
+ }
+ }
+ res.each{|ele|
+ freq[ele] = 0 if freq[ele] == nil
+ freq[ele] += 1
+ }
+}
+
+# Print the frequency each element was yield to process it with gnuplot
+freq.each{|item,count|
+ puts "#{item} #{count}"
+}