lists_by_days_redis 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/README.md +6 -0
- data/lib/lists.rb +223 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MmE1ZjQ2NmNjNWIzMTczMThiMjA5MDU1Y2E2OGM2NGYwN2E5MDI0MA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZGNkZDE5OWU5YzlmNWZmYTQzNmZkYjM4ZjM3Mjc5MWMyNTY1ZjczNg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZGMyNWI5ZWYwNDgyNzk2MzJkMDg0MDk0OTNmZGQxNDEwZTgzMzM5NWU4MjFl
|
10
|
+
YjI1ZjBiNjU1MjZlMjVlYjJkODUyMjRkYzRmYTcxNGRkYzk2MjMyZDExMTA3
|
11
|
+
MmZiYTBkMmYxOWRiZGY2MjdmMTk0OWJmNzZiNGRlMDViOWMzOTQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OGM3MDM4NzdkNGM1ZmViMDQ3YTk4Nzg0MjNhMTk3MTExNjRlNzA1YmYxN2Nh
|
14
|
+
YmQ2OTRkY2QxYWIzNDVkM2FmZDRmYTU3MDk4MjI0NWI1ODczYWU3MTk5ZDU0
|
15
|
+
ZTk1ZjI4MDQzODY4MzNkYTY4MDEzZjVjNzg0MzIxMmY4MmQ2ZGI=
|
data/README.md
ADDED
data/lib/lists.rb
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
module ListsByDaysRedis
|
2
|
+
|
3
|
+
require 'redis'
|
4
|
+
|
5
|
+
class List
|
6
|
+
# static data
|
7
|
+
#PROCESSES = ['effects']
|
8
|
+
SITE_NAME = ''
|
9
|
+
|
10
|
+
EXPIRE_DAYS = 7
|
11
|
+
|
12
|
+
|
13
|
+
@@redis = nil
|
14
|
+
|
15
|
+
# redis object to access Redis server
|
16
|
+
def self.redis
|
17
|
+
return @@redis unless @redis.nil?
|
18
|
+
|
19
|
+
# init by global object
|
20
|
+
unless $redis.nil?
|
21
|
+
@@redis = $redis
|
22
|
+
return @@redis
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
# default
|
27
|
+
@@redis = Redis.new(:host => 'localhost', :port => 6379)
|
28
|
+
|
29
|
+
@@redis
|
30
|
+
end
|
31
|
+
|
32
|
+
# methods for any log_type add_<<ANY_LOG_TYPE>>
|
33
|
+
def self.method_missing(method_name, *args, &block)
|
34
|
+
if method_name.to_s =~ /^add_(.+)$/
|
35
|
+
self.add($1, *args)
|
36
|
+
else
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# generic method
|
43
|
+
|
44
|
+
def self.add(list_name, data={})
|
45
|
+
t = Time.now.utc.to_i
|
46
|
+
rkey = self.redis_key_list list_name
|
47
|
+
|
48
|
+
#
|
49
|
+
hash = {:created=>t}
|
50
|
+
if data.is_a?(Hash)
|
51
|
+
data.each_pair { |k,v| hash["#{k}"] = v }
|
52
|
+
elsif data.is_a?(String)
|
53
|
+
hash["msg"] = data
|
54
|
+
else
|
55
|
+
hash["msg"] = "#{data.inspect}"
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
require 'json'
|
60
|
+
s = JSON.generate(hash)
|
61
|
+
|
62
|
+
redis.rpush rkey, s
|
63
|
+
redis.expireat rkey, t+EXPIRE_DAYS*24*60*60
|
64
|
+
|
65
|
+
return true
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
#
|
70
|
+
def self.add_debug(event_name, msg='', fields={})
|
71
|
+
fields['msg'] = msg
|
72
|
+
fields['event'] = event_name
|
73
|
+
return self.add 'debug', fields
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
def self.get_all(list_name, days_back=1, filter={})
|
79
|
+
all_keys = redis.keys(self.redis_key_list(list_name)+'*')
|
80
|
+
|
81
|
+
return [] if all_keys.nil?
|
82
|
+
|
83
|
+
tnow = Time.now.utc.to_i
|
84
|
+
rows = []
|
85
|
+
all_keys.each do |rkey|
|
86
|
+
day = self.parse_date_for_key rkey
|
87
|
+
|
88
|
+
# if cannot parse key
|
89
|
+
next if day.nil?
|
90
|
+
|
91
|
+
# if not too old day
|
92
|
+
next if tnow - day.to_i > days_back * (60*60*24)
|
93
|
+
|
94
|
+
|
95
|
+
# get all items from the list
|
96
|
+
values = redis.lrange rkey, 0, 100000
|
97
|
+
|
98
|
+
values.each do |v|
|
99
|
+
r = Marshal.load v
|
100
|
+
|
101
|
+
# filter
|
102
|
+
is_good = true
|
103
|
+
unless filter.nil? && filter.is_a?(Hash)
|
104
|
+
filter.each_pair do |field_name, field_value|
|
105
|
+
next if r[field_name].nil?
|
106
|
+
if r[field_name] != field_value
|
107
|
+
is_good = false
|
108
|
+
break
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# add to result
|
114
|
+
if is_good
|
115
|
+
rows << r
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
rows
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
# status
|
129
|
+
def self.set_status(event_name, site_name=nil)
|
130
|
+
tnow = Time.now.utc.to_i
|
131
|
+
|
132
|
+
redis.hset(self.redis_key_status, event_name, tnow)
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
def self.get_statuses(event_pattern, site_name=nil)
|
137
|
+
# event_names like 'name*'
|
138
|
+
|
139
|
+
rows = []
|
140
|
+
|
141
|
+
all_values = redis.hgetall(self.redis_key_status)
|
142
|
+
|
143
|
+
all_values.each do |type_name, v|
|
144
|
+
rows << {:log_type=>type_name, :site=>site_name, :v_type=>'date', :v=>v.to_i}
|
145
|
+
end
|
146
|
+
|
147
|
+
rows
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
# counters ??
|
152
|
+
def self.add_stat(counter_name, amount=1)
|
153
|
+
redis.hincrby(self.redis_key_stats, counter_name, amount)
|
154
|
+
return true
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
# performance counter
|
159
|
+
def self.add_perf_time(counter_name, duration_secs)
|
160
|
+
rkey = self.redis_key_stats
|
161
|
+
|
162
|
+
redis.hincrby(rkey, counter_name+'_time', (duration_secs*1000).floor)
|
163
|
+
redis.hincrby(rkey, counter_name+'_n', 1)
|
164
|
+
|
165
|
+
return true
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
# helper methods
|
170
|
+
|
171
|
+
def self.redis_key_prefix
|
172
|
+
"#{SITE_NAME=='' ? '' : SITE_NAME+':'}"
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.redis_key_list_prefix(name)
|
176
|
+
self.redis_key_prefix + "lists:#{name}:"
|
177
|
+
end
|
178
|
+
|
179
|
+
def self.key_day(d=nil)
|
180
|
+
d ||= DateTime.now.new_offset(0)
|
181
|
+
|
182
|
+
d.strftime("%Y%m%d")
|
183
|
+
end
|
184
|
+
|
185
|
+
def self.redis_key_list(name)
|
186
|
+
self.redis_key_list_prefix(name) + self.key_day
|
187
|
+
end
|
188
|
+
|
189
|
+
|
190
|
+
def self.parse_date_for_key(key)
|
191
|
+
# parse key
|
192
|
+
mm = key.scan(/:(\d\d\d\d)(\d\d)(\d\d)$/i)
|
193
|
+
|
194
|
+
return nil if mm.nil? || mm[0].nil?
|
195
|
+
|
196
|
+
y, m, d = mm[0].map{|v| v.to_i}
|
197
|
+
|
198
|
+
Time.utc(y,m,d)
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
# redis methods
|
204
|
+
|
205
|
+
def self.redis_clear_lists_all
|
206
|
+
keys = redis.keys(redis_key_prefix+'lists:*')
|
207
|
+
return if keys.empty?
|
208
|
+
redis.del keys
|
209
|
+
end
|
210
|
+
|
211
|
+
def self.redis_clear_list(name)
|
212
|
+
keys = redis.keys(redis_key_list_prefix(name)+"*")
|
213
|
+
return if keys.empty?
|
214
|
+
redis.del keys
|
215
|
+
end
|
216
|
+
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lists_by_days_redis
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- ! 'Max Ivak '
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-07 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Useful for debugging and tracking different events in application.
|
14
|
+
email:
|
15
|
+
- maxivak@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/lists.rb
|
21
|
+
- README.md
|
22
|
+
homepage: https://github.com/maxivak/lists_by_days_redis/
|
23
|
+
licenses: []
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.0.3
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Simple library to store custom data in lists by days in Redis
|
45
|
+
test_files: []
|