diff options
Diffstat (limited to 'lib/gitlab/redis/hll.rb')
-rw-r--r-- | lib/gitlab/redis/hll.rb | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/gitlab/redis/hll.rb b/lib/gitlab/redis/hll.rb index ff5754675e2..010a6b59da5 100644 --- a/lib/gitlab/redis/hll.rb +++ b/lib/gitlab/redis/hll.rb @@ -3,15 +3,16 @@ module Gitlab module Redis class HLL + BATCH_SIZE = 300 KEY_REGEX = %r{\A(\w|-|:)*\{\w*\}(\w|-|:)*\z}.freeze KeyFormatError = Class.new(StandardError) def self.count(params) - self.new.count(params) + self.new.count(**params) end def self.add(params) - self.new.add(params) + self.new.add(**params) end def count(keys:) @@ -29,17 +30,24 @@ module Gitlab # 2020-216-{project_action} # i_{analytics}_dev_ops_score-2020-32 def add(key:, value:, expiry:) - unless KEY_REGEX.match?(key) - raise KeyFormatError.new("Invalid key format. #{key} key should have changeable parts in curly braces. See https://docs.gitlab.com/ee/development/redis.html#multi-key-commands") - end + validate_key!(key) Gitlab::Redis::SharedState.with do |redis| redis.multi do |multi| - multi.pfadd(key, value) + Array.wrap(value).each_slice(BATCH_SIZE) { |batch| multi.pfadd(key, batch) } + multi.expire(key, expiry) end end end + + private + + def validate_key!(key) + return if KEY_REGEX.match?(key) + + raise KeyFormatError.new("Invalid key format. #{key} key should have changeable parts in curly braces. See https://docs.gitlab.com/ee/development/redis.html#multi-key-commands") + end end end end |