Class: Frivol::Backend::Riak

Inherits:
Object
  • Object
show all
Defined in:
lib/frivol/backend/riak.rb

Overview

Configuration

This backend is experimental. I have not used this in production. YMMV.

RIAK_CONFIG = {
  :protocol => 'http',
  :nodes => [ { :host => '127.0.0.1' } ]
}
Frivol::Config.backend = Frivol::Backend::Riak.new(RIAK_CONFIG)

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ Riak

:nodoc:



14
15
16
17
# File 'lib/frivol/backend/riak.rb', line 14

def initialize(config)
  @prefix = config.delete(:prefix) || ''
  @config = config
end

Instance Method Details

#connectionObject



147
148
149
150
151
152
153
154
# File 'lib/frivol/backend/riak.rb', line 147

def connection
  Thread.current[thread_key] ||= begin
    @objects_bucket = nil
    @counters_bucket = nil
    @expires_bucket = nil
    ::Riak::Client.new(@config)
  end
end

#decr(key, expiry = Frivol::NEVER_EXPIRE) ⇒ Object



101
102
103
104
105
106
# File 'lib/frivol/backend/riak.rb', line 101

def decr(key, expiry = Frivol::NEVER_EXPIRE)
  cnt = counters_bucket.counter(key)
  cnt.decrement
  expire(key, expiry) unless expiry == Frivol::NEVER_EXPIRE
  cnt.value
end

#decrby(key, amt, expiry = Frivol::NEVER_EXPIRE) ⇒ Object



115
116
117
118
119
120
# File 'lib/frivol/backend/riak.rb', line 115

def decrby(key, amt, expiry = Frivol::NEVER_EXPIRE)
  cnt = counters_bucket.counter(key)
  cnt.decrement(amt)
  expire(key, expiry) unless expiry == Frivol::NEVER_EXPIRE
  cnt.value
end

#del(key) ⇒ Object



39
40
41
42
# File 'lib/frivol/backend/riak.rb', line 39

def del(key)
  objects_bucket.delete(key)
  expires_bucket.delete(key)
end

#delc(key) ⇒ Object



76
77
78
79
# File 'lib/frivol/backend/riak.rb', line 76

def delc(key)
  counters_bucket.delete(key)
  expires_bucket.delete(key)
end

#exists(key) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/frivol/backend/riak.rb', line 44

def exists(key)
  exists = objects_bucket.exist?(key)
  if exists
    expires_in = ttl(key)
    if expires_in.nil? || expires_in > 0
      true
    else
      objects_bucket.delete(key)
      false
    end
  end
end

#existsc(key) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/frivol/backend/riak.rb', line 81

def existsc(key)
  exists = counters_bucket.exist?(key)
  if exists
    expires_in = ttl(key)
    if expires_in.nil? || expires_in > 0
      true
    else
      counters_bucket.delete(key)
      false
    end
  end
end

#expire(key, ttl) ⇒ Object

Expiry/TTL



123
124
125
126
127
128
# File 'lib/frivol/backend/riak.rb', line 123

def expire(key, ttl)
  obj = expires_bucket.get_or_new(key)
  obj.raw_data = (Time.now.to_i + ttl).to_s
  obj.content_type = 'text/plain'
  obj.store
end

#flushdbObject

Connection



141
142
143
144
145
# File 'lib/frivol/backend/riak.rb', line 141

def flushdb
  objects_bucket.keys.each { |k| objects_bucket.delete(k) }
  counters_bucket.keys.each { |k| counters_bucket.delete(k) }
  expires_bucket.keys.each { |k| expires_bucket.delete(k) }
end

#get(key, expiry = Frivol::NEVER_EXPIRE) ⇒ Object

Hashes



20
21
22
23
24
25
26
27
28
29
# File 'lib/frivol/backend/riak.rb', line 20

def get(key, expiry = Frivol::NEVER_EXPIRE)
  obj = objects_bucket.get_or_new(key)
  expires_in = ttl(key)
  if expires_in.nil? || expires_in > 0
    obj.raw_data
  else
    obj.delete
    nil
  end
end

#getc(key, expiry = Frivol::NEVER_EXPIRE) ⇒ Object

Counters



58
59
60
61
62
63
64
65
66
67
# File 'lib/frivol/backend/riak.rb', line 58

def getc(key, expiry = Frivol::NEVER_EXPIRE)
  cnt = counters_bucket.counter(key) if existsc(key)
  expires_in = ttl(key)
  if expires_in.nil? || expires_in > 0
    cnt ? cnt.value : nil
  else
    delc(key)
    nil
  end
end

#incr(key, expiry = Frivol::NEVER_EXPIRE) ⇒ Object



94
95
96
97
98
99
# File 'lib/frivol/backend/riak.rb', line 94

def incr(key, expiry = Frivol::NEVER_EXPIRE)
  cnt = counters_bucket.counter(key)
  cnt.increment
  expire(key, expiry) unless expiry == Frivol::NEVER_EXPIRE
  cnt.value
end

#incrby(key, amt, expiry = Frivol::NEVER_EXPIRE) ⇒ Object



108
109
110
111
112
113
# File 'lib/frivol/backend/riak.rb', line 108

def incrby(key, amt, expiry = Frivol::NEVER_EXPIRE)
  cnt = counters_bucket.counter(key)
  cnt.increment(amt)
  expire(key, expiry) unless expiry == Frivol::NEVER_EXPIRE
  cnt.value
end

#set(key, val, expiry = Frivol::NEVER_EXPIRE) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/frivol/backend/riak.rb', line 31

def set(key, val, expiry = Frivol::NEVER_EXPIRE)
  obj = objects_bucket.get_or_new(key)
  obj.raw_data = val
  obj.content_type = 'text/plain'
  obj.store
  expire(key, expiry) unless expiry == Frivol::NEVER_EXPIRE
end

#setc(key, val, expiry = Frivol::NEVER_EXPIRE) ⇒ Object



69
70
71
72
73
74
# File 'lib/frivol/backend/riak.rb', line 69

def setc(key, val, expiry = Frivol::NEVER_EXPIRE)
  delc(key)
  cnt = counters_bucket.counter(key)
  cnt.increment(val)
  expire(key, expiry) unless expiry == Frivol::NEVER_EXPIRE
end

#ttl(key) ⇒ Object



130
131
132
133
134
135
136
137
138
# File 'lib/frivol/backend/riak.rb', line 130

def ttl(key)
  obj = expires_bucket.get_or_new(key)
  expiry = obj.raw_data.to_i
  if expiry == 0
    nil
  else
    expiry - Time.now.to_i
  end
end