/
redis.rb
100 lines (87 loc) · 2.89 KB
/
redis.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
module Resque
module Connection
class Redis < Base
def setup_backend(server)
require 'redis/namespace'
if server.respond_to? :split
host, port, db = server.split(':')
redis = ::Redis.new(:host => host, :port => port,
:thread_safe => true, :db => db)
::Redis::Namespace.new(:resque, :redis => redis)
elsif server.respond_to? :namespace=
server
else
::Redis::Namespace.new(:resque, :redis => server)
end
end
# K/V Methods
def set(key, value) ; backend.set(key, value) ; end
def get(key) ; backend.get(key) ; end
def delete(key) ; backend.del(key) ; end
def keys
backend.keys("*").map do |key|
key.sub("#{backend.namespace}:", '')
end
end
# Set methods
def all_from_set(key) ; backend.smembers(key) || [] ; end
def exists_in_set?(key, obj) ; backend.sismember(key, obj) ; end
def delete_from_set(key, obj) ; backend.srem(key, obj) ; end
def push_to_set(key, obj) ; backend.sadd(key, obj) ; end
# Counter methods
def increment(key, by) ; backend.incrby(key, by) ; end
def decrement(key, by) ; backend.decrby(key, by) ; end
# List methods
def delete_list(key) ; delete(key); end
def pop_from_list(key) ; decode(backend.lpop(key)) ; end
def size_of_list(key) ; backend.llen(key).to_i ; end
def push_to_list(key, item) ; backend.rpush(key, encode(item)) ; end
# encoding of value is handled externally
def delete_from_list(key, count, value)
backend.lrem(key, count, value).to_i
end
# encoding of value is handled externally
def range_from_list(key, start = 0, count = 1) # positive 'count' is a delta. negative 'count' is passed through.
if count == 1
#decode
[backend.lindex(key, start)]
else
upper_bound = count < 0 ? count : (start+count-1)
Array(backend.lrange(key, start, upper_bound))
end
end
def get_size(key)
case backend.type(key)
when 'none'
[]
when 'list'
backend.llen(key)
when 'set'
backend.scard(key)
when 'string'
backend.get(key).length
when 'zset'
backend.zcard(key)
end
end
def get_value_as_array(key, start = 0, count = 20)
case backend.type(key)
when 'none'
[]
when 'list'
backend.lrange(key, start, start + count)
when 'set'
backend.smembers(key)[start..(start + count)]
when 'string'
[backend.get(key)]
when 'zset'
backend.zrange(key, start, start + count)
end
end
def type(key)
backend.type(key)
end
def backend_type ; 'redis' ; end
end
end
end