Skip to content

Instantly share code, notes, and snippets.

@ecavazos
Created February 19, 2012 03:40
Show Gist options
  • Save ecavazos/1861832 to your computer and use it in GitHub Desktop.
Save ecavazos/1861832 to your computer and use it in GitHub Desktop.
Sorted set rank and score.
require 'sorted_set_adapter'
set = SortedSetAdapter.new
set.flush
set.add 1, 'foo'
set.add 2, 'bar'
p set.all # -> ["foo", "bar"]
set.add 3, 'foo'
p set.all # -> ["bar", "foo"]
set.add -1, 'baz'
p set.all # -> ["baz", "bar", "foo"]
set.add -1, 'foo'
set.add -1, 'bar'
p set.all # -> ["bar", "baz", "foo"]
require 'redis'
class SortedSetAdapter
@key = :scheduler
class << self
attr :key
end
def redis
@redis ||= Redis.new
end
def add score, member
redis.zadd self.class.key, score, member
end
def rem_first
member = redis.zrange(self.class.key, 0, 0).first
# try to remove the first member from the set so it doesn't
# get processed by another job. If it's already been
# removed then try and get the next member
if redis.zrem(self.class.key, member)
member
else
# get the next member
rem_first
end
end
def count
redis.zcard self.class.key
end
def flush
redis.zremrangebyrank self.class.key, 0, -1
end
def top size
redis.zrange self.class.key, 0, size - 1
end
def rank member
redis.zrank self.class.key, member
end
def all
redis.zrange self.class.key, 0, -1
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment