add a script to sort all keys of a redis DB by size
This commit is contained in:
parent
5672c62ca9
commit
a7c1887eb8
1 changed files with 86 additions and 0 deletions
86
sort-redis-keys
Executable file
86
sort-redis-keys
Executable file
|
|
@ -0,0 +1,86 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
require 'csv'
|
||||
|
||||
def darwin?
|
||||
@darwin ||= `uname`.strip == 'Darwin'
|
||||
end
|
||||
|
||||
def mktemp
|
||||
if darwin?
|
||||
`mktemp -t $$`.strip
|
||||
else
|
||||
`mktemp`.strip
|
||||
end
|
||||
end
|
||||
|
||||
def delimit(n, delimiter = ',')
|
||||
n.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
|
||||
end
|
||||
|
||||
Units = %w[KB MB GB TB]
|
||||
|
||||
def human_size(n)
|
||||
unit = 'bytes'
|
||||
units = Units.dup
|
||||
while n > 1024 && units.length > 0
|
||||
n /= 1024.0
|
||||
unit = units.shift
|
||||
end
|
||||
"#{delimit(n.round(2))} #{unit}"
|
||||
end
|
||||
|
||||
def analyze_rdb(rdbfile, keyfile)
|
||||
size = human_size(File.stat(rdbfile).size)
|
||||
puts "Getting key info for #{rdbfile} (#{size}), this can take a while..."
|
||||
`rdb -c memory #{rdbfile} > #{keyfile}`
|
||||
keyfile
|
||||
end
|
||||
|
||||
def sort_keys(rdbfile)
|
||||
keyfile = rdbfile.sub('rdb', 'csv')
|
||||
sortedkeyfile = rdbfile.sub('.rdb', '-sorted.csv')
|
||||
if !File.exists?(keyfile)
|
||||
analyze_rdb(rdbfile, keyfile)
|
||||
end
|
||||
lines = File.readlines(keyfile)
|
||||
lines.shift # drop the header
|
||||
n = lines.length
|
||||
print "Munging #{delimit(n)} rows..."
|
||||
rows = []
|
||||
while line = lines.shift
|
||||
row = line.strip.split(',')
|
||||
size = row[3].to_i
|
||||
key = row[2].sub(/^"/, '').sub(/"$/, '')
|
||||
type = row[1]
|
||||
num_elements = row[5]
|
||||
len_largest = row[6]
|
||||
row = [size, key, type, num_elements, len_largest]
|
||||
rows << row
|
||||
if rows.length % (n / 50) == 0
|
||||
print '.'
|
||||
end
|
||||
end
|
||||
puts
|
||||
puts "Sorting..."
|
||||
rows = rows.sort { |a,b| b[0] <=> a[0] }
|
||||
print "Writing..."
|
||||
CSV.open(sortedkeyfile, 'wb') do |csv|
|
||||
# header
|
||||
csv << %w[size key type num_elements len_largest_element]
|
||||
while row = rows.shift
|
||||
csv << row
|
||||
if rows.length % (n / 50) == 0
|
||||
print '.'
|
||||
end
|
||||
end
|
||||
puts
|
||||
puts "Done."
|
||||
end
|
||||
end
|
||||
|
||||
def main
|
||||
sort_keys(ARGV.shift)
|
||||
end
|
||||
|
||||
main if $0 == __FILE__
|
||||
Loading…
Reference in a new issue