-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Max size option #15
base: main
Are you sure you want to change the base?
Max size option #15
Changes from all commits
0323bb1
9843642
787704d
c770484
49e15c2
6443b65
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,8 +20,15 @@ def self.supports_cache_versioning? | |
|
||
# param [Hash] options options | ||
# option options [Class] :model model class. Default: ActiveSupport::Cache::DatabaseStore::Model | ||
# option options [Boolean] :auto_cleanup When true, runs {#cleanup} after every {#write_entry} and {#delete_entry}. Default: false | ||
# option options [Integer, nil] :max_size When set (to a positive integer), | ||
# this is the maximum amount of entries that is allowed in the cache. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. typo/correct wording: "this is the maximum number of entries..." |
||
# Going over will first run {#cleanup} to delete any expired entries. | ||
# If this is not enough, the oldest entry in the cache (based on `created_at` time) will also be deleted. Default: nil | ||
def initialize(options = nil) | ||
@model = (options || {}).delete(:model) || Model | ||
@auto_cleanup = (options || {}).delete(:auto_cleanup) || false | ||
@max_size = (options || {}).delete(:max_size) || nil | ||
super(options) | ||
end | ||
|
||
|
@@ -74,10 +81,23 @@ def write_entry(key, entry, _options = nil) | |
record = @model.where(key: key).first_or_initialize | ||
expires_at = Time.zone.at(entry.expires_at) if entry.expires_at | ||
record.update! value: Marshal.dump(entry.value), version: entry.version.presence, expires_at: expires_at | ||
ensure | ||
cleanup if @auto_cleanup || max_size_exceeded? | ||
delete_oldest_entry if max_size_exceeded? # <- Only happens when running cleanup was not enough | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can see this being a useful thing, but I am worried about the number of SQL queries that it requires (up to 6!). In the same vein as with #14 I wonder if this is better implemented as a timed option. Instead of running up-to 6 queries on every write, ensure there is at least e.g. 1 minute between each check, i.e. make this an "approximate" rather than an absolute thing. Furthermore, you could optimise here:
|
||
end | ||
|
||
def max_size_exceeded? | ||
@max_size && @model.count > @max_size | ||
end | ||
|
||
def delete_oldest_entry | ||
@model.order(created_at: :asc).limit(1).destroy_all | ||
end | ||
|
||
def delete_entry(key, _options = nil) | ||
@model.where(key: key).destroy_all | ||
ensure | ||
cleanup if @auto_cleanup | ||
end | ||
|
||
def read_multi_entries(names, options) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, thank you very much for the contribution, but could you please submit this as an independent PR? It's so much easier to review and merge them individually, as separate features.