kredis 1.4.0 → 1.5.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 +4 -4
- data/README.md +8 -0
- data/lib/kredis/migration.rb +2 -2
- data/lib/kredis/types/ordered_set.rb +75 -0
- data/lib/kredis/types/proxying.rb +8 -1
- data/lib/kredis/types/unique_list.rb +1 -1
- data/lib/kredis/types.rb +5 -0
- data/lib/kredis/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72d301175c0d6bac257d10d925bddcaaa4d9fda78f0aa75264fc3b6c5a8af677
|
4
|
+
data.tar.gz: aa7dd573678ca4f8bb18478cf6b606fe2afc3833e6c9b9bb9b693e361f7706ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e12490fc43dd3e73dcc39dfe3af5ab0f44405eae7a071b08edb14b1cba08c4b96bdb968af61072b2329e0f5e449c8c281252f4e32f423656d77bcc5ebf0e95e0
|
7
|
+
data.tar.gz: f047ac1e52365a7b25e10b2d2187df699abe34ced746f4d34b8e47511c019019eee3e9e6f69a5e46d58286a5ad5e38899d0db8517015d809b278ea46526f81b4
|
data/README.md
CHANGED
@@ -62,6 +62,14 @@ unique_list << "5" # => LREM myuniquelist 0, "5" + R
|
|
62
62
|
unique_list.remove(3) # => LREM myuniquelist 0, "3"
|
63
63
|
[ "4", "2", "1", "5" ] == unique_list.elements # => LRANGE myuniquelist 0, -1
|
64
64
|
|
65
|
+
ordered_set = Kredis.ordered_set "myorderedset"
|
66
|
+
ordered_set.append(%w[ 2 3 4 ]) # => ZADD myorderedset 1646131025.4953232 2 1646131025.495326 3 1646131025.4953272 4
|
67
|
+
ordered_set.prepend(%w[ 1 2 3 4 ]) # => ZADD myorderedset -1646131025.4957051 1 -1646131025.495707 2 -1646131025.4957082 3 -1646131025.4957092 4
|
68
|
+
ordered_set.append([])
|
69
|
+
ordered_set << "5" # => ZADD myorderedset 1646131025.4960442 5
|
70
|
+
ordered_set.remove(3) # => ZREM myorderedset 3
|
71
|
+
[ "4", "2", "1", "5" ] == ordered_set.elements # => ZRANGE myorderedset 0 -1
|
72
|
+
|
65
73
|
set = Kredis.set "myset", typed: :datetime
|
66
74
|
set.add(DateTime.tomorrow, DateTime.yesterday) # => SADD myset "2021-02-03 00:00:00 +0100" "2021-02-01 00:00:00 +0100"
|
67
75
|
set << DateTime.tomorrow # => SADD myset "2021-02-03 00:00:00 +0100"
|
data/lib/kredis/migration.rb
CHANGED
@@ -33,10 +33,10 @@ class Kredis::Migration
|
|
33
33
|
def delete_all(*key_patterns)
|
34
34
|
log_migration "DELETE ALL #{key_patterns.inspect}" do
|
35
35
|
if key_patterns.length > 1
|
36
|
-
@redis.del
|
36
|
+
@redis.del(*key_patterns)
|
37
37
|
else
|
38
38
|
each_key_batch_matching(key_patterns.first) do |keys, pipeline|
|
39
|
-
pipeline.del
|
39
|
+
pipeline.del(*keys)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
class Kredis::Types::OrderedSet < Kredis::Types::Proxying
|
2
|
+
proxying :multi, :zrange, :zrem, :zadd, :zremrangebyrank, :zcard, :exists?, :del
|
3
|
+
|
4
|
+
attr_accessor :typed
|
5
|
+
attr_reader :limit
|
6
|
+
|
7
|
+
def elements
|
8
|
+
strings_to_types(zrange(0, -1) || [], typed)
|
9
|
+
end
|
10
|
+
alias to_a elements
|
11
|
+
|
12
|
+
def remove(*elements)
|
13
|
+
zrem(types_to_strings(elements, typed))
|
14
|
+
end
|
15
|
+
|
16
|
+
def prepend(elements)
|
17
|
+
insert(elements, prepending: true)
|
18
|
+
end
|
19
|
+
|
20
|
+
def append(elements)
|
21
|
+
insert(elements)
|
22
|
+
end
|
23
|
+
alias << append
|
24
|
+
|
25
|
+
def limit=(limit)
|
26
|
+
raise "Limit must be greater than 0" if limit && limit <= 0
|
27
|
+
|
28
|
+
@limit = limit
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def insert(elements, prepending: false)
|
33
|
+
elements = Array(elements)
|
34
|
+
return if elements.empty?
|
35
|
+
|
36
|
+
elements_with_scores = types_to_strings(elements, typed).map.with_index do |element, index|
|
37
|
+
incremental_score = index * 0.000001
|
38
|
+
|
39
|
+
score = if prepending
|
40
|
+
-base_score - incremental_score
|
41
|
+
else
|
42
|
+
base_score + incremental_score
|
43
|
+
end
|
44
|
+
|
45
|
+
[ score , element ]
|
46
|
+
end
|
47
|
+
|
48
|
+
multi do
|
49
|
+
zadd(elements_with_scores)
|
50
|
+
trim(from_beginning: prepending)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def base_score
|
55
|
+
process_start_time + process_uptime
|
56
|
+
end
|
57
|
+
|
58
|
+
def process_start_time
|
59
|
+
@process_start_time ||= unproxied_redis.time.join(".").to_f - process_uptime
|
60
|
+
end
|
61
|
+
|
62
|
+
def process_uptime
|
63
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
64
|
+
end
|
65
|
+
|
66
|
+
def trim(from_beginning:)
|
67
|
+
return unless limit
|
68
|
+
|
69
|
+
if from_beginning
|
70
|
+
zremrangebyrank(limit, -1)
|
71
|
+
else
|
72
|
+
zremrangebyrank(0, -(limit + 1))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -4,10 +4,11 @@ class Kredis::Types::Proxying
|
|
4
4
|
attr_accessor :proxy, :key
|
5
5
|
|
6
6
|
def self.proxying(*commands)
|
7
|
-
delegate
|
7
|
+
delegate(*commands, to: :proxy)
|
8
8
|
end
|
9
9
|
|
10
10
|
def initialize(redis, key, **options)
|
11
|
+
@redis = redis
|
11
12
|
@key = key
|
12
13
|
@proxy = Kredis::Types::Proxy.new(redis, key)
|
13
14
|
options.each { |key, value| send("#{key}=", value) }
|
@@ -17,6 +18,12 @@ class Kredis::Types::Proxying
|
|
17
18
|
proxy.suppress_failsafe_with(returning: returning, &block)
|
18
19
|
end
|
19
20
|
|
21
|
+
def unproxied_redis
|
22
|
+
# Generally, this should not be used. It's only here for the rare case where we need to
|
23
|
+
# call Redis commands that don't reference a key and don't want to be pipelined.
|
24
|
+
@redis
|
25
|
+
end
|
26
|
+
|
20
27
|
private
|
21
28
|
delegate :type_to_string, :string_to_type, :types_to_strings, :strings_to_types, to: :Kredis
|
22
29
|
end
|
data/lib/kredis/types.rb
CHANGED
@@ -71,6 +71,10 @@ module Kredis::Types
|
|
71
71
|
type_from(Set, config, key, after_change: after_change, typed: typed)
|
72
72
|
end
|
73
73
|
|
74
|
+
def ordered_set(key, typed: :string, limit: nil, config: :shared, after_change: nil)
|
75
|
+
type_from(OrderedSet, config, key, after_change: after_change, typed: typed, limit: limit)
|
76
|
+
end
|
77
|
+
|
74
78
|
def slot(key, config: :shared, after_change: nil)
|
75
79
|
type_from(Slots, config, key, after_change: after_change, available: 1)
|
76
80
|
end
|
@@ -99,4 +103,5 @@ require "kredis/types/hash"
|
|
99
103
|
require "kredis/types/list"
|
100
104
|
require "kredis/types/unique_list"
|
101
105
|
require "kredis/types/set"
|
106
|
+
require "kredis/types/ordered_set"
|
102
107
|
require "kredis/types/slots"
|
data/lib/kredis/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kredis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kasper Timm Hansen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-06-
|
12
|
+
date: 2023-06-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- lib/kredis/types/flag.rb
|
102
102
|
- lib/kredis/types/hash.rb
|
103
103
|
- lib/kredis/types/list.rb
|
104
|
+
- lib/kredis/types/ordered_set.rb
|
104
105
|
- lib/kredis/types/proxy.rb
|
105
106
|
- lib/kredis/types/proxy/failsafe.rb
|
106
107
|
- lib/kredis/types/proxying.rb
|