Class: Redis::SortedSet

Inherits:
BaseObject show all
Includes:
Helpers::CoreCommands
Defined in:
lib/redis/sorted_set.rb

Overview

Class representing a sorted set.

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Methods included from Helpers::CoreCommands

#exists?, #expire, #expireat, #marshal, #move, #persist, #rename, #renamenx, #sort, #ttl, #type, #unmarshal

Methods inherited from BaseObject

expiration_filter, #initialize, #redis, #set_expiration

Constructor Details

This class inherits a constructor from Redis::BaseObject

Instance Attribute Details

- (Object) key (readonly)

Returns the value of attribute key



13
14
15
# File 'lib/redis/sorted_set.rb', line 13

def key
  @key
end

- (Object) options (readonly)

Returns the value of attribute options



13
14
15
# File 'lib/redis/sorted_set.rb', line 13

def options
  @options
end

Instance Method Details

- (Object) ==(x)



265
266
267
# File 'lib/redis/sorted_set.rb', line 265

def ==(x)
  members == x
end

- (Object) [](index, length = nil) Also known as: slice

Same functionality as Ruby arrays. If a single number is given, return just the element at that index using Redis: ZRANGE. Otherwise, return a range of values using Redis: ZRANGE.



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/redis/sorted_set.rb', line 42

def [](index, length=nil)
  if index.is_a? Range
    range(index.first, index.last)
  elsif length
    case length <=> 0
    when 1  then range(index, index + length - 1)
    when 0  then []
    when -1 then nil  # Ruby does this (a bit weird)
    end
  else
    result = score(index) || 0 # handles a nil score
  end
end

- (Object) []=(member, score)

How to add values using a sorted set. The key is the member, eg, “Peter”, and the value is the score, eg, 163. So:

num_posts['Peter'] = 163


18
19
20
# File 'lib/redis/sorted_set.rb', line 18

def []=(member, score)
  add(member, score)
end

- (Object) add(member, score)

Add a member and its corresponding value to Redis. Note that the arguments to this are flipped; the member comes first rather than the score, since the member is the unique item (not the score).



25
26
27
# File 'lib/redis/sorted_set.rb', line 25

def add(member, score)
  redis.zadd(key, score, marshal(member))
end

- (Object) at(index)

Return the value at the given index. Can also use familiar list syntax. Redis: ZRANGE



275
276
277
# File 'lib/redis/sorted_set.rb', line 275

def at(index)
  range(index, index).first
end

- (Object) decrement(member, by = 1) Also known as: decr, decrby

Convenience to calling increment() with a negative number.



182
183
184
# File 'lib/redis/sorted_set.rb', line 182

def decrement(member, by=1)
  redis.zincrby(key, -by, marshal(member)).to_i
end

- (Object) delete(value)

Delete the value from the set. Redis: ZREM



157
158
159
# File 'lib/redis/sorted_set.rb', line 157

def delete(value)
  redis.zrem(key, marshal(value))
end

- (Object) delete_if(&block)

Delete element if it matches block

Raises:

  • (ArgumentError)


162
163
164
165
166
167
168
169
170
171
# File 'lib/redis/sorted_set.rb', line 162

def delete_if(&block)
  raise ArgumentError, "Missing block to SortedSet#delete_if" unless block_given?
  res = false
  redis.zrange(key, 0, -1).each do |m|
    if block.call(unmarshal(m))
      res = redis.zrem(key, m)
    end
  end
  res
end

- (Object) difference(*sets) Also known as: diff, ^, -

Return the difference vs another set. Can pass it either another set object or set name. Also available as ^ or - which is a bit cleaner:

members_difference = set1 ^ set2
members_difference = set1 - set2

If you want to specify multiple sets, you must use difference:

members_difference = set1.difference(set2, set3, set4)
members_difference = set1.diff(set2, set3, set4)

Redis: SDIFF



247
248
249
# File 'lib/redis/sorted_set.rb', line 247

def difference(*sets)
  redis.zdiff(key, *keys_from_objects(sets)).map{|v| unmarshal(v) }
end

- (Object) diffstore(name, *sets)

Calculate the diff and store it in Redis as name. Returns the number of elements in the stored union. Redis: SDIFFSTORE



256
257
258
# File 'lib/redis/sorted_set.rb', line 256

def diffstore(name, *sets)
  redis.zdiffstore(name, key, *keys_from_objects(sets))
end

- (Boolean) empty?

Returns true if the set has no members. Redis: SCARD == 0

Returns:

  • (Boolean)


261
262
263
# File 'lib/redis/sorted_set.rb', line 261

def empty?
  length == 0
end

- (Object) first

Return the first element in the list. Redis: ZRANGE(0)



280
281
282
# File 'lib/redis/sorted_set.rb', line 280

def first
  at(0)
end

- (Object) increment(member, by = 1) Also known as: incr, incrby

Increment the rank of that member atomically and return the new value. This method is aliased as incr() for brevity. Redis: ZINCRBY



175
176
177
# File 'lib/redis/sorted_set.rb', line 175

def increment(member, by=1)
  redis.zincrby(key, by, marshal(member)).to_i
end

- (Object) intersection(*sets) Also known as: intersect, inter, &

Return the intersection with another set. Can pass it either another set object or set name. Also available as & which is a bit cleaner:

members_in_both = set1 & set2

If you want to specify multiple sets, you must use intersection:

members_in_all = set1.intersection(set2, set3, set4)
members_in_all = set1.inter(set2, set3, set4)  # alias

Redis: SINTER



199
200
201
# File 'lib/redis/sorted_set.rb', line 199

def intersection(*sets)
  redis.zinter(key, *keys_from_objects(sets)).map{|v| unmarshal(v) }
end

- (Object) interstore(name, *sets)

Calculate the intersection and store it in Redis as name. Returns the number of elements in the stored intersection. Redis: SUNIONSTORE



208
209
210
# File 'lib/redis/sorted_set.rb', line 208

def interstore(name, *sets)
  redis.zinterstore(name, keys_from_objects([self] + sets))
end

- (Object) last

Return the last element in the list. Redis: ZRANGE(-1)



285
286
287
# File 'lib/redis/sorted_set.rb', line 285

def last
  at(-1)
end

- (Object) length Also known as: size

The number of members in the set. Aliased as size. Redis: ZCARD



290
291
292
# File 'lib/redis/sorted_set.rb', line 290

def length
  redis.zcard(key)
end

- (Boolean) member?(value)

Return a boolean indicating whether value is a member.

Returns:

  • (Boolean)


301
302
303
# File 'lib/redis/sorted_set.rb', line 301

def member?(value)
  !redis.zscore(key, marshal(value)).nil?
end

- (Object) members(options = {})

Return all members of the sorted set with their scores. Extremely CPU-intensive. Better to use a range instead.



88
89
90
# File 'lib/redis/sorted_set.rb', line 88

def members(options={})
  range(0, -1, options) || []
end

- (Object) merge(values) Also known as: add_all

Add a list of members and their corresponding value (or a hash mapping values to scores) to Redis. Note that the arguments to this are flipped; the member comes first rather than the score, since the member is the unique item (not the score).



33
34
35
36
# File 'lib/redis/sorted_set.rb', line 33

def merge(values)
  vals = values.map{|v,s| [s, marshal(v)] }
  redis.zadd(key, vals)
end

- (Object) range(start_index, end_index, options = {})

Return a range of values from start_index to end_index. Can also use the familiar list Ruby syntax. Redis: ZRANGE



94
95
96
97
98
99
100
# File 'lib/redis/sorted_set.rb', line 94

def range(start_index, end_index, options={})
  if options[:withscores] || options[:with_scores]
    redis.zrange(key, start_index, end_index, :with_scores => true).map{|v,s| [unmarshal(v), s] }
  else
    redis.zrange(key, start_index, end_index).map{|v| unmarshal(v) }
  end
end

- (Object) range_size(min, max)

The number of members within a range of scores. Redis: ZCOUNT



296
297
298
# File 'lib/redis/sorted_set.rb', line 296

def range_size(min, max)
  redis.zcount(key, min, max)
end

- (Object) rangebyscore(min, max, options = {})

Return the all the elements in the sorted set at key with a score between min and max (including elements with score equal to min or max). Options:

:count, :offset - passed to LIMIT
:withscores     - if true, scores are returned as well

Redis: ZRANGEBYSCORE



116
117
118
119
120
121
122
123
# File 'lib/redis/sorted_set.rb', line 116

def rangebyscore(min, max, options={})
  args = {}
  args[:limit] = [options[:offset] || 0, options[:limit] || options[:count]] if
            options[:offset] || options[:limit] || options[:count]
  args[:with_scores] = true if options[:withscores] || options[:with_scores]

  redis.zrangebyscore(key, min, max, args).map{|v| unmarshal(v) }
end

- (Object) rank(member)

Return the rank of the member in the sorted set, with scores ordered from low to high. revrank returns the rank with scores ordered from high to low. When the given member does not exist in the sorted set, nil is returned. The returned rank (or index) of the member is 0-based for both commands



70
71
72
73
74
75
76
# File 'lib/redis/sorted_set.rb', line 70

def rank(member)
  if n = redis.zrank(key, marshal(member))
    n.to_i
  else
    nil
  end
end

- (Object) remrangebyrank(min, max)

Remove all elements in the sorted set at key with rank between start and end. Start and end are 0-based with rank 0 being the element with the lowest score. Both start and end can be negative numbers, where they indicate offsets starting at the element with the highest rank. For example: -1 is the element with the highest score, -2 the element with the second highest score and so forth. Redis: ZREMRANGEBYRANK



146
147
148
# File 'lib/redis/sorted_set.rb', line 146

def remrangebyrank(min, max)
  redis.zremrangebyrank(key, min, max)
end

- (Object) remrangebyscore(min, max)

Remove all the elements in the sorted set at key with a score between min and max (including elements with score equal to min or max). Redis: ZREMRANGEBYSCORE



152
153
154
# File 'lib/redis/sorted_set.rb', line 152

def remrangebyscore(min, max)
  redis.zremrangebyscore(key, min, max)
end

- (Object) revrange(start_index, end_index, options = {})

Return a range of values from start_index to end_index in reverse order. Redis: ZREVRANGE



103
104
105
106
107
108
109
# File 'lib/redis/sorted_set.rb', line 103

def revrange(start_index, end_index, options={})
  if options[:withscores] || options[:with_scores]
    redis.zrevrange(key, start_index, end_index, :with_scores => true).map{|v,s| [unmarshal(v), s] }
  else
    redis.zrevrange(key, start_index, end_index).map{|v| unmarshal(v) }
  end
end

- (Object) revrangebyscore(max, min, options = {})

Returns all the elements in the sorted set at key with a score between max and min (including elements with score equal to max or min). In contrary to the default ordering of sorted sets, for this command the elements are considered to be ordered from high to low scores. Options:

:count, :offset - passed to LIMIT
:withscores     - if true, scores are returned as well

Redis: ZREVRANGEBYSCORE



132
133
134
135
136
137
138
139
# File 'lib/redis/sorted_set.rb', line 132

def revrangebyscore(max, min, options={})
  args = {}
  args[:limit] = [options[:offset] || 0, options[:limit] || options[:count]] if
            options[:offset] || options[:limit] || options[:count]
  args[:with_scores] = true if options[:withscores] || options[:with_scores]

  redis.zrevrangebyscore(key, max, min, args).map{|v| unmarshal(v) }
end

- (Object) revrank(member)



78
79
80
81
82
83
84
# File 'lib/redis/sorted_set.rb', line 78

def revrank(member)
  if n = redis.zrevrank(key, marshal(member))
    n.to_i
  else
    nil
  end
end

- (Object) score(member)

Return the score of the specified element of the sorted set at key. If the specified element does not exist in the sorted set, or the key does not exist at all, nil is returned. Redis: ZSCORE.



60
61
62
63
64
# File 'lib/redis/sorted_set.rb', line 60

def score(member)
  result = redis.zscore(key, marshal(member))

  result.to_f unless result.nil?
end

- (Object) to_s



269
270
271
# File 'lib/redis/sorted_set.rb', line 269

def to_s
  members.join(', ')
end

- (Object) union(*sets) Also known as: |, +

Return the union with another set. Can pass it either another set object or set name. Also available as | and + which are a bit cleaner:

members_in_either = set1 | set2
members_in_either = set1 + set2

If you want to specify multiple sets, you must use union:

members_in_all = set1.union(set2, set3, set4)

Redis: SUNION



223
224
225
# File 'lib/redis/sorted_set.rb', line 223

def union(*sets)
  redis.zunion(key, *keys_from_objects(sets)).map{|v| unmarshal(v) }
end

- (Object) unionstore(name, *sets)

Calculate the union and store it in Redis as name. Returns the number of elements in the stored union. Redis: SUNIONSTORE



231
232
233
# File 'lib/redis/sorted_set.rb', line 231

def unionstore(name, *sets)
  redis.zunionstore(name, keys_from_objects([self] + sets))
end