lists_by_days_redis 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +6 -0
  3. data/lib/lists.rb +223 -0
  4. metadata +45 -0
@@ -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=
@@ -0,0 +1,6 @@
1
+ Lists by Days in Redis Gem
2
+ ==========
3
+
4
+ Simple gem to store custom data in lists by days in Redis.
5
+ Old data is automatically removed.
6
+ Useful for debugging and tracking different events in application.
@@ -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: []