rediscord 1.0.0
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 +7 -0
- data/README.md +44 -0
- data/lib/rediscord.rb +62 -0
- data/lib/rediscord/record_set.rb +31 -0
- data/lib/rediscord/record_zset.rb +35 -0
- metadata +48 -0
checksums.yaml
ADDED
@@ -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
|
data/README.md
ADDED
@@ -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
|
+

|
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
|
+

|
data/lib/rediscord.rb
ADDED
@@ -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: []
|