solid_cache 0.1.0 → 0.2.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 +38 -9
- data/app/models/solid_cache/entry.rb +6 -6
- data/lib/solid_cache/maglev_hash.rb +1 -1
- data/lib/solid_cache/store/api.rb +8 -1
- data/lib/solid_cache/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98f4ca743bf44353244b4e1bb870df48b426fcb8b082941ad0f07e150f05cffb
|
4
|
+
data.tar.gz: 85a3660e7c8b63b8f838039228b887f6a4ecde5d17401707f243804efb7f98d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2251bc348573da1c8492f299cd7fadbd87450ad22252ae388b25c842b71bf6cf6525d40243587d3c2951c8af1a71fb0ac42af6eedde767465ab08a7cfcfbe9b6
|
7
|
+
data.tar.gz: 1e69812734160e29b7ae9430303243f23f09f24a75440da61e7dd5d0efd0ac6e4934e0d7a6566791c60f3cf1d88e8d45364f9904bd60b742f16aa8241e0c1fbb
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Solid Cache
|
2
2
|
|
3
|
-
Solid Cache is a database-backed Active Support cache store implementation.
|
3
|
+
Solid Cache is a database-backed Active Support cache store implementation.
|
4
4
|
|
5
5
|
Using SQL databases backed by SSDs we can have caches that are much larger and cheaper than traditional memory only Redis or Memcached backed caches.
|
6
6
|
|
@@ -58,7 +58,7 @@ $ bin/rails db:migrate
|
|
58
58
|
There are two options that can be set on the engine:
|
59
59
|
|
60
60
|
- `executor` - the [Rails executor](https://guides.rubyonrails.org/threading_and_code_execution.html#executor) used to wrap asynchronous operations, defaults to the app executor
|
61
|
-
- `connects_to` - a custom connects to value for the abstract `SolidCache::Record` active record model.
|
61
|
+
- `connects_to` - a custom connects to value for the abstract `SolidCache::Record` active record model. Required for sharding and/or using a separate cache database to the main app.
|
62
62
|
|
63
63
|
These can be set in your Rails configuration:
|
64
64
|
|
@@ -81,7 +81,7 @@ Solid Cache supports these options in addition to the standard `ActiveSupport::C
|
|
81
81
|
- `expiry_batch_size` - the batch size to use when deleting old records (default: `100`)
|
82
82
|
- `expiry_method` - what expiry method to use `thread` or `job` (default: `thread`)
|
83
83
|
- `max_age` - the maximum age of entries in the cache (default: `2.weeks.to_i`)
|
84
|
-
- `max_entries` - the maximum number of entries allowed in the cache (default: `
|
84
|
+
- `max_entries` - the maximum number of entries allowed in the cache (default: `nil`, meaning no limit)
|
85
85
|
- `cluster` - a Hash of options for the cache database cluster, e.g `{ shards: [:database1, :database2, :database3] }`
|
86
86
|
- `clusters` - and Array of Hashes for multiple cache clusters (ignored if `:cluster` is set)
|
87
87
|
- `active_record_instrumentation` - whether to instrument the cache's queries (default: `true`)
|
@@ -92,7 +92,7 @@ For more information on cache clusters see [Sharding the cache](#sharding-the-ca
|
|
92
92
|
|
93
93
|
### Cache expiry
|
94
94
|
|
95
|
-
Solid Cache tracks writes to the cache. For every write it increments a counter by 1. Once the counter reaches 80% of the `expiry_batch_size` it
|
95
|
+
Solid Cache tracks writes to the cache. For every write it increments a counter by 1. Once the counter reaches 80% of the `expiry_batch_size` it adds a task to run on a background thread. That task will:
|
96
96
|
|
97
97
|
1. Check if we have exceeded the `max_entries` value (if set) by subtracting the max and min IDs from the `SolidCache::Entry` table (this is an estimate that ignores any gaps).
|
98
98
|
2. If we have it will delete `expiry_batch_size` entries
|
@@ -109,7 +109,7 @@ If you want the cache expiry to be run in a background job instead of a thread,
|
|
109
109
|
Add database configuration to database.yml, e.g.:
|
110
110
|
|
111
111
|
```
|
112
|
-
development
|
112
|
+
development:
|
113
113
|
cache:
|
114
114
|
database: cache_development
|
115
115
|
host: 127.0.0.1
|
@@ -135,7 +135,7 @@ $ mv db/migrate/*.solid_cache.rb db/cache/migrate
|
|
135
135
|
Set the engine configuration to point to the new database:
|
136
136
|
```
|
137
137
|
Rails.application.configure do
|
138
|
-
config.solid_cache.connects_to = {
|
138
|
+
config.solid_cache.connects_to = { database: { writing: :cache } }
|
139
139
|
end
|
140
140
|
```
|
141
141
|
|
@@ -250,19 +250,48 @@ The Solid Cache migrations try to create an index with 1024 byte entries. If tha
|
|
250
250
|
|
251
251
|
## Development
|
252
252
|
|
253
|
-
Run the tests with `bin/rails test`.
|
253
|
+
Run the tests with `bin/rails test`. By default, these will run against SQLite.
|
254
254
|
|
255
|
-
You can also run the tests against MySQL and
|
255
|
+
You can also run the tests against MySQL and PostgreSQL. First start up the databases:
|
256
256
|
|
257
257
|
```shell
|
258
258
|
$ docker compose up -d
|
259
259
|
```
|
260
260
|
|
261
|
-
|
261
|
+
Next, setup the database schema:
|
262
|
+
|
263
|
+
```shell
|
264
|
+
$ TARGET_DB=mysql bin/rails db:setup
|
265
|
+
$ TARGET_DB=postgres bin/rails db:setup
|
262
266
|
```
|
267
|
+
|
268
|
+
|
269
|
+
Then run the tests for the target database:
|
270
|
+
|
271
|
+
```shell
|
263
272
|
$ TARGET_DB=mysql bin/rails test
|
264
273
|
$ TARGET_DB=postgres bin/rails test
|
265
274
|
```
|
266
275
|
|
276
|
+
### Testing with multiple Rails version
|
277
|
+
|
278
|
+
Solid Cache relies on [appraisal](https://github.com/thoughtbot/appraisal/tree/main) to test
|
279
|
+
multiple Rails version.
|
280
|
+
|
281
|
+
To run a test for a specific version run:
|
282
|
+
|
283
|
+
```shell
|
284
|
+
bundle exec appraisal rails-7-1 bin/rails test
|
285
|
+
```
|
286
|
+
|
287
|
+
After updating the dependencies in then `Gemfile` please run:
|
288
|
+
|
289
|
+
```shell
|
290
|
+
$ bundle
|
291
|
+
$ appraisal update
|
292
|
+
```
|
293
|
+
|
294
|
+
This ensures that all the Rails versions dependencies are updated.
|
295
|
+
|
267
296
|
## License
|
268
297
|
Solid Cache is licensed under MIT.
|
@@ -21,10 +21,6 @@ module SolidCache
|
|
21
21
|
select_all_no_query_cache(get_all_sql(serialized_keys), serialized_keys).to_h
|
22
22
|
end
|
23
23
|
|
24
|
-
def expire(ids)
|
25
|
-
delete_no_query_cache(:id, ids) if ids.any?
|
26
|
-
end
|
27
|
-
|
28
24
|
def delete_by_key(key)
|
29
25
|
delete_no_query_cache(:key, to_binary(key))
|
30
26
|
end
|
@@ -78,8 +74,12 @@ module SolidCache
|
|
78
74
|
message = +"#{self} "
|
79
75
|
message << "Bulk " if attributes.many?
|
80
76
|
message << "Upsert"
|
81
|
-
#
|
82
|
-
connection.
|
77
|
+
# exec_query_method does not clear the query cache, exec_insert_all does
|
78
|
+
connection.send exec_query_method, sql, message
|
79
|
+
end
|
80
|
+
|
81
|
+
def exec_query_method
|
82
|
+
connection.respond_to?(:internal_exec_query) ? :internal_exec_query : :exec_query
|
83
83
|
end
|
84
84
|
|
85
85
|
def upsert_unique_by
|
@@ -88,7 +88,14 @@ module SolidCache
|
|
88
88
|
if entry.expired?
|
89
89
|
delete_entry(key, **options)
|
90
90
|
elsif !entry.mismatched?(version)
|
91
|
-
|
91
|
+
if defined? ActiveSupport::Cache::DeserializationError
|
92
|
+
begin
|
93
|
+
results[name] = entry.value
|
94
|
+
rescue ActiveSupport::Cache::DeserializationError
|
95
|
+
end
|
96
|
+
else
|
97
|
+
results[name] = entry.value
|
98
|
+
end
|
92
99
|
end
|
93
100
|
end
|
94
101
|
end
|
data/lib/solid_cache/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solid_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Donal McBreen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
requirements: []
|
112
|
-
rubygems_version: 3.4.
|
112
|
+
rubygems_version: 3.4.21
|
113
113
|
signing_key:
|
114
114
|
specification_version: 4
|
115
115
|
summary: A database backed ActiveSupport::Cache::Store
|