rediscord 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6e4f8b4173dbd78fac11d9b062b5eed27320c2f5
4
+ data.tar.gz: fcf18d91a253bcd1445e1fd708563c3f261d324a
5
+ SHA512:
6
+ metadata.gz: a4f2a097d073cad6e3f36e91a6414b12fef1bcf6ea3596f8462cabc382f1bd479f0eb55d46216fea83c01a2551a950aa1fcb409802629e7614a65d0bc359d932
7
+ data.tar.gz: 6c978952b2ba391679a1f5b5c83d32a60e73aa7318ae146b3e39027d147cd7085338695be6beb13d1fe4730118503aa1fb56e700b2dd588b83d2455ea79474de
@@ -0,0 +1,44 @@
1
+ # Rediscord
2
+ keep record id sync with dynamic redis set or zset
3
+
4
+ ## Install
5
+
6
+ add `gem 'rediscord'` to Gemfile, and run `bundle install`
7
+
8
+ ## Example
9
+ * set
10
+ ```ruby
11
+ class Post < ApplicationRecord
12
+ enum level: [ :one, :two, :there ]
13
+
14
+ include Rediscord
15
+ redis_set key: ->(m){ "level_#{m.level}_post_set" }, redis: Redis.new
16
+ end
17
+ ```
18
+ ```ruby
19
+ Post.create(level: :one) # id: 1
20
+ Post.create(level: :one) # id: 2
21
+ Post.create(level: :two) # id: 3
22
+ Post.create(level: :there) # id: 4
23
+ ```
24
+ > what's in redis?
25
+
26
+ ![](http://ww1.sinaimg.cn/large/006tKfTcjw1f6gc1feycqj31hc0vsdix.jpg)
27
+
28
+ * zset
29
+
30
+ ```ruby
31
+ class Post < ApplicationRecord
32
+ enum level: [ :one, :two, :there ]
33
+
34
+ include Rediscord
35
+ redis_zset key: ->(m){ "level_#{m.level}_post_zset" }, score: ->(m){ m.updated_at.to_i }, redis: Redis.new
36
+ end
37
+ ```
38
+ ```ruby
39
+ Post.create(level: :one)
40
+ Post.create(level: :one)
41
+ Post.create(level: :two)
42
+ Post.create(level: :there)
43
+ ```
44
+ ![](http://ww1.sinaimg.cn/large/006tKfTcjw1f6gc6mmk9sj31hc0vsgov.jpg)
@@ -0,0 +1,62 @@
1
+ require 'active_support/concern'
2
+ require 'rediscord/record_set'
3
+ require 'rediscord/record_zset'
4
+
5
+ module Rediscord
6
+ extend ActiveSupport::Concern
7
+ class_methods do
8
+ attr_reader :force_update, :record_sets
9
+ def init_sets
10
+ unless @record_sets
11
+ @record_sets = []
12
+
13
+ after_create :_update_ids_after_create
14
+ after_update :_update_ids_after_update
15
+ after_destroy :_update_ids_after_destroy
16
+ end
17
+ end
18
+
19
+ def redis_zset(options)
20
+ init_sets
21
+ @record_sets << RecordZset.new(options)
22
+ end
23
+
24
+ def redis_set(options)
25
+ init_sets
26
+ @record_sets << RecordSet.new(options)
27
+ end
28
+
29
+ def redis_refresh
30
+ @force_update = true
31
+ find_each do |m|
32
+ m.save
33
+ end
34
+ end
35
+ def previous_model(obj)
36
+ prev = obj.dup
37
+ obj.changed_attributes.each do |key, value|
38
+ prev.send("#{key}=", value)
39
+ end
40
+ prev
41
+ end
42
+ end
43
+
44
+ def _update_ids_after_create
45
+ self.class.record_sets.each do |s|
46
+ s.after_create(self)
47
+ end
48
+ end
49
+
50
+ def _update_ids_after_destroy
51
+ self.class.record_sets.each do |s|
52
+ s.after_destroy(self)
53
+ end
54
+ end
55
+
56
+ def _update_ids_after_update
57
+ prev_record = self.class.previous_model(self)
58
+ self.class.record_sets.each do |s|
59
+ s.after_update(self, prev_record)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,31 @@
1
+ module Rediscord
2
+ class RecordSet
3
+ attr_reader :key, :redis, :force_update
4
+
5
+ def initialize(options)
6
+ @key = options[:key]
7
+ @redis = options[:redis]
8
+ end
9
+
10
+ def key_for(record)
11
+ key.call(record)
12
+ end
13
+
14
+ def after_create(record)
15
+ redis.sadd(key_for(record), record.id)
16
+ end
17
+
18
+ def after_destroy(record)
19
+ redis.srem(key_for(record), record.id)
20
+ end
21
+
22
+ def after_update(record, prev_record)
23
+ _key_was = key_for(prev_record)
24
+ _key = key_for(record)
25
+ if force_update || _key_was != _key
26
+ redis.srem(_key_was, record.id)
27
+ redis.sadd(_key, record.id)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ module Rediscord
2
+ class RecordZset < RecordSet
3
+ attr_reader :score
4
+
5
+ def initialize(options)
6
+ super
7
+ @score = options[:score]
8
+ end
9
+
10
+ def score_for(record)
11
+ score.call(record)
12
+ end
13
+
14
+ def after_create(record)
15
+ redis.zadd(key_for(record), score_for(record), record.id)
16
+ end
17
+
18
+ def after_destroy(record)
19
+ redis.zrem(key_for(record), record.id)
20
+ end
21
+
22
+ def after_update(record, prev_record)
23
+ _key_was = key_for(prev_record)
24
+ _key = key_for(record)
25
+
26
+ _score = score_for(record)
27
+ _score_was = score_for(prev_record)
28
+
29
+ if force_update || _key_was != _key || _score != _score_was
30
+ redis.zrem(_key_was, record.id)
31
+ redis.zadd(_key, score_for(record), record.id)
32
+ end
33
+ end
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rediscord
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - kikyous
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: keep record id sync with dynamic redis set or zset
14
+ email: kikyous@163.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files:
18
+ - README.md
19
+ files:
20
+ - README.md
21
+ - lib/rediscord.rb
22
+ - lib/rediscord/record_set.rb
23
+ - lib/rediscord/record_zset.rb
24
+ homepage: http://rubyonrails.org
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.5.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: keep record id sync with redis set/zset
48
+ test_files: []