class Redis::List
Class representing a Redis
list. Instances of Redis::List
are designed to behave as much like Ruby arrays as possible.
Public Instance Methods
Works like push. Can chain together: list << ‘a’ << ‘b’
# File lib/redis/list.rb, line 10 def <<(value) push(value) # marshal in push() self # for << 'a' << 'b' end
# File lib/redis/list.rb, line 152 def ==(x) values == x end
Same functionality as Ruby arrays. If a single number is given, return just the element at that index using Redis: LINDEX. Otherwise, return a range of values using Redis: LRANGE.
# File lib/redis/list.rb, line 89 def [](index, length=nil) if index.is_a? Range range(index.first, index.max) 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 at(index) end end
Same functionality as Ruby arrays.
# File lib/redis/list.rb, line 105 def []=(index, value) allow_expiration do redis.lset(key, index, marshal(value)) end end
Return the value at the given index. Can also use familiar list syntax. Redis: LINDEX
# File lib/redis/list.rb, line 127 def at(index) unmarshal redis.lindex(key, index) end
Delete the element(s) from the list that match name. If count is specified, only the first-N (if positive) or last-N (if negative) will be removed. Use .del to completely delete the entire key. Redis: LREM
# File lib/redis/list.rb, line 115 def delete(name, count=0) redis.lrem(key, count, marshal(name)) # weird api end
Returns true if there are no elements in the list. Redis: LLEN == 0
# File lib/redis/list.rb, line 148 def empty? length == 0 end
Return the first element in the list. Redis: LINDEX(0)
# File lib/redis/list.rb, line 132 def first at(0) end
Add a member before or after pivot in the list. Redis: LINSERT
# File lib/redis/list.rb, line 16 def insert(where,pivot,value) allow_expiration do redis.linsert(key,where,marshal(pivot),marshal(value)) end end
Return the last element in the list. Redis: LINDEX(-1)
# File lib/redis/list.rb, line 137 def last at(-1) end
Return the length of the list. Aliased as size. Redis: LLEN
# File lib/redis/list.rb, line 142 def length redis.llen(key) end
Remove a member from the end of the list. Redis: RPOP
# File lib/redis/list.rb, line 32 def pop(n=nil) if n result, = redis.multi do redis.lrange(key, -n, -1) redis.ltrim(key, 0, -n - 1) end unmarshal result else unmarshal redis.rpop(key) end end
Add a member to the end of the list. Redis: RPUSH
# File lib/redis/list.rb, line 23 def push(*values) allow_expiration do count = redis.rpush(key, values.map{|v| marshal(v) }) redis.ltrim(key, -options[:maxlength], -1) if options[:maxlength] count end end
Return a range of values from start_index
to end_index
. Can also use the familiar list Ruby syntax. Redis: LRANGE
# File lib/redis/list.rb, line 121 def range(start_index, end_index) redis.lrange(key, start_index, end_index).map{|v| unmarshal(v) } end
Atomically pops a value from one list, pushes to another and returns the value. Destination can be a String or a Redis::List
list.rpoplpush(destination)
Returns the popped/pushed value.
Redis: RPOPLPUSH
# File lib/redis/list.rb, line 52 def rpoplpush(destination) unmarshal redis.rpoplpush(key, destination.is_a?(Redis::List) ? destination.key : destination.to_s) end
Remove a member from the start of the list. Redis: LPOP
# File lib/redis/list.rb, line 66 def shift(n=nil) if n result, = redis.multi do redis.lrange(key, 0, n - 1) redis.ltrim(key, n, -1) end unmarshal result else unmarshal redis.lpop(key) end end
# File lib/redis/list.rb, line 156 def to_s values.join(', ') end
Add a member to the start of the list. Redis: LPUSH
# File lib/redis/list.rb, line 57 def unshift(*values) allow_expiration do count = redis.lpush(key, values.map{|v| marshal(v) }) redis.ltrim(key, 0, options[:maxlength] - 1) if options[:maxlength] count end end