legion-cache 1.3.0 → 1.3.1
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/CHANGELOG.md +15 -0
- data/CLAUDE.md +1 -0
- data/README.md +19 -1
- data/lib/legion/cache/local.rb +1 -1
- data/lib/legion/cache/memcached.rb +12 -5
- data/lib/legion/cache/redis.rb +8 -2
- data/lib/legion/cache/settings.rb +23 -2
- data/lib/legion/cache/version.rb +1 -1
- data/lib/legion/cache.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 657e7afe142d9420c0414c416fdf612ef75456262c91165d545112960bf44e71
|
|
4
|
+
data.tar.gz: 137d4eb307b337bcda85f91db10fddc42319793a99cde3038fbf9799db960d78
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e167c6f650ad38373f8794f9cfc209857fd5053b9751375cf77f7ae9537eab23c40cd33947cc656c64dd77e7832f1312987739b4c95c1d2873b5cdf377aeff0d
|
|
7
|
+
data.tar.gz: 7e38075e7257b4b04fbdefb22de3da21d0055be631f8a6ca4f17d0c78f5669e153d0590aabd3742c05990f88c4e7c55d85409dfae90a5ec6741f36913af54f92
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.3.1] - 2026-03-20
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- `Settings.normalize_driver` — maps `:memcached`, `:dalli`, `:redis` to internal gem names
|
|
7
|
+
- `Settings.resolve_servers` — merges `server:` (string) and `servers:` (array), injects default port per driver (memcached: 11211, redis: 6379), deduplicates
|
|
8
|
+
- `Settings::DEFAULT_PORTS` constant for driver default ports
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- Redis driver now uses configured `server:`/`servers:` instead of hardcoded localhost
|
|
12
|
+
- Memcached driver accepts `server:` (singular) in addition to `servers:` (plural)
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- `Settings.default` and `Settings.local` use `resolve_servers` for driver-aware server defaults
|
|
16
|
+
- Driver selection in `cache.rb` and `local.rb` uses `normalize_driver` for consistent name handling
|
|
17
|
+
|
|
3
18
|
## [1.3.0] - 2026-03-16
|
|
4
19
|
|
|
5
20
|
### Added
|
data/CLAUDE.md
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
Caching wrapper for the LegionIO framework. Provides a consistent interface for Memcached (via `dalli`) and Redis (via `redis` gem) with connection pooling. Driver selection is config-driven.
|
|
9
9
|
|
|
10
10
|
**GitHub**: https://github.com/LegionIO/legion-cache
|
|
11
|
+
**Version**: 1.3.0
|
|
11
12
|
**License**: Apache-2.0
|
|
12
13
|
|
|
13
14
|
## Architecture
|
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Caching wrapper for the [LegionIO](https://github.com/LegionIO/LegionIO) framework. Provides a consistent interface for Memcached (via `dalli`) and Redis (via `redis` gem) with connection pooling. Driver selection is config-driven.
|
|
4
4
|
|
|
5
|
-
**Version**: 1.3.
|
|
5
|
+
**Version**: 1.3.1
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -80,6 +80,24 @@ Local uses a separate namespace (`legion_local`) and independent connection pool
|
|
|
80
80
|
|
|
81
81
|
The driver is auto-detected at load time: prefers `dalli` (Memcached) if available, falls back to `redis`. Override with `"driver": "redis"` and update `servers` to point at your Redis instance.
|
|
82
82
|
|
|
83
|
+
### Driver Names
|
|
84
|
+
|
|
85
|
+
Supported driver names: `memcached` (or `dalli`), `redis`. All names are normalized internally — `"memcached"` and `"dalli"` are equivalent.
|
|
86
|
+
|
|
87
|
+
### Server Resolution
|
|
88
|
+
|
|
89
|
+
Both `server` (singular string) and `servers` (array) are accepted and merged. Default ports are injected per driver when omitted: 11211 for memcached, 6379 for redis. Duplicates are removed.
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"cache": {
|
|
94
|
+
"driver": "memcached",
|
|
95
|
+
"server": "10.0.0.5",
|
|
96
|
+
"servers": ["10.0.0.6", "10.0.0.7:22122"]
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
83
101
|
### Memcached notes
|
|
84
102
|
|
|
85
103
|
- `value_max_bytes` defaults to **8MB**. Dalli enforces a 1MB client-side limit by default, which silently rejects large values. This default overrides that. Your Memcached server should also be started with `-I 8m` to match.
|
data/lib/legion/cache/local.rb
CHANGED
|
@@ -9,18 +9,25 @@ module Legion
|
|
|
9
9
|
include Legion::Cache::Pool
|
|
10
10
|
extend self # rubocop:disable Style/ModuleFunction
|
|
11
11
|
|
|
12
|
-
def client(servers:
|
|
12
|
+
def client(server: nil, servers: nil, **opts)
|
|
13
13
|
return @client unless @client.nil?
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
settings = defined?(Legion::Settings) ? Legion::Settings[:cache] : {}
|
|
16
|
+
servers ||= settings[:servers] || []
|
|
17
|
+
|
|
18
|
+
@pool_size = opts.key?(:pool_size) ? opts[:pool_size] : settings[:pool_size] || 10
|
|
19
|
+
@timeout = opts.key?(:timeout) ? opts[:timeout] : settings[:timeout] || 5
|
|
20
|
+
|
|
21
|
+
resolved = Legion::Cache::Settings.resolve_servers(
|
|
22
|
+
driver: 'memcached', server: server, servers: Array(servers)
|
|
23
|
+
)
|
|
17
24
|
|
|
18
25
|
Dalli.logger = Legion::Logging
|
|
19
|
-
cache_opts =
|
|
26
|
+
cache_opts = settings.merge(opts)
|
|
20
27
|
cache_opts[:value_max_bytes] ||= 8 * 1024 * 1024
|
|
21
28
|
|
|
22
29
|
@client = ConnectionPool.new(size: pool_size, timeout: timeout) do
|
|
23
|
-
Dalli::Client.new(
|
|
30
|
+
Dalli::Client.new(resolved, cache_opts)
|
|
24
31
|
end
|
|
25
32
|
|
|
26
33
|
@connected = true
|
data/lib/legion/cache/redis.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'redis'
|
|
4
4
|
require 'legion/cache/pool'
|
|
5
|
+
require 'legion/cache/settings'
|
|
5
6
|
|
|
6
7
|
module Legion
|
|
7
8
|
module Cache
|
|
@@ -9,14 +10,19 @@ module Legion
|
|
|
9
10
|
include Legion::Cache::Pool
|
|
10
11
|
extend self # rubocop:disable Style/ModuleFunction
|
|
11
12
|
|
|
12
|
-
def client(pool_size: 20, timeout: 5, **)
|
|
13
|
+
def client(pool_size: 20, timeout: 5, server: nil, servers: [], **)
|
|
13
14
|
return @client unless @client.nil?
|
|
14
15
|
|
|
15
16
|
@pool_size = pool_size
|
|
16
17
|
@timeout = timeout
|
|
17
18
|
|
|
19
|
+
resolved = Legion::Cache::Settings.resolve_servers(
|
|
20
|
+
driver: 'redis', server: server, servers: servers
|
|
21
|
+
)
|
|
22
|
+
host, port = resolved.first.split(':')
|
|
23
|
+
|
|
18
24
|
@client = ConnectionPool.new(size: pool_size, timeout: timeout) do
|
|
19
|
-
::Redis.new
|
|
25
|
+
::Redis.new(host: host, port: port.to_i)
|
|
20
26
|
end
|
|
21
27
|
@connected = true
|
|
22
28
|
@client
|
|
@@ -14,7 +14,7 @@ module Legion
|
|
|
14
14
|
def self.default
|
|
15
15
|
{
|
|
16
16
|
driver: driver,
|
|
17
|
-
servers:
|
|
17
|
+
servers: resolve_servers(driver: driver),
|
|
18
18
|
connected: false,
|
|
19
19
|
enabled: true,
|
|
20
20
|
namespace: 'legion',
|
|
@@ -32,7 +32,7 @@ module Legion
|
|
|
32
32
|
def self.local
|
|
33
33
|
{
|
|
34
34
|
driver: driver,
|
|
35
|
-
servers:
|
|
35
|
+
servers: resolve_servers(driver: driver),
|
|
36
36
|
connected: false,
|
|
37
37
|
enabled: true,
|
|
38
38
|
namespace: 'legion_local',
|
|
@@ -47,6 +47,27 @@ module Legion
|
|
|
47
47
|
}
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
DEFAULT_PORTS = { 'dalli' => 11_211, 'redis' => 6379 }.freeze
|
|
51
|
+
|
|
52
|
+
def self.resolve_servers(driver:, server: nil, servers: [], port: nil)
|
|
53
|
+
gem_driver = normalize_driver(driver)
|
|
54
|
+
port ||= DEFAULT_PORTS.fetch(gem_driver, 11_211)
|
|
55
|
+
|
|
56
|
+
all = Array(servers) + Array(server)
|
|
57
|
+
all = ["127.0.0.1:#{port}"] if all.empty?
|
|
58
|
+
|
|
59
|
+
all.map! { |s| s.include?(':') ? s : "#{s}:#{port}" }
|
|
60
|
+
all.uniq
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.normalize_driver(name)
|
|
64
|
+
case name.to_s
|
|
65
|
+
when 'redis' then 'redis'
|
|
66
|
+
when 'memcached', 'dalli' then 'dalli'
|
|
67
|
+
else name.to_s
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
50
71
|
def self.driver(prefer = 'dalli')
|
|
51
72
|
secondary = prefer == 'dalli' ? 'redis' : 'dalli'
|
|
52
73
|
if Gem::Specification.find_all_by_name(prefer).any?
|
data/lib/legion/cache/version.rb
CHANGED
data/lib/legion/cache.rb
CHANGED
|
@@ -9,7 +9,7 @@ require 'legion/cache/local'
|
|
|
9
9
|
|
|
10
10
|
module Legion
|
|
11
11
|
module Cache
|
|
12
|
-
if Legion::Settings[:cache][:driver] == 'redis'
|
|
12
|
+
if Legion::Cache::Settings.normalize_driver(Legion::Settings[:cache][:driver]) == 'redis'
|
|
13
13
|
extend Legion::Cache::Redis
|
|
14
14
|
else
|
|
15
15
|
extend Legion::Cache::Memcached
|