rediscord 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![](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)
|
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: []
|