2020-10-24 23:57:45 +05:30
# frozen_string_literal: true
module Gitlab
module Redis
class HLL
2021-01-03 14:25:43 +05:30
BATCH_SIZE = 300
2020-10-24 23:57:45 +05:30
KEY_REGEX = %r{ \ A( \ w|-|:)* \{ \ w* \} ( \ w|-|:)* \ z } . freeze
KeyFormatError = Class . new ( StandardError )
def self . count ( params )
2021-01-03 14:25:43 +05:30
self . new . count ( ** params )
2020-10-24 23:57:45 +05:30
end
def self . add ( params )
2021-01-03 14:25:43 +05:30
self . new . add ( ** params )
2020-10-24 23:57:45 +05:30
end
def count ( keys : )
Gitlab :: Redis :: SharedState . with do | redis |
redis . pfcount ( * keys )
end
end
# Check a basic format for the Redis key in order to ensure the keys are in the same hash slot
#
# Examples of keys
# project:{1}:set_a
# project:{1}:set_b
# project:{2}:set_c
# 2020-216-{project_action}
# i_{analytics}_dev_ops_score-2020-32
def add ( key : , value : , expiry : )
2021-01-03 14:25:43 +05:30
validate_key! ( key )
2020-10-24 23:57:45 +05:30
Gitlab :: Redis :: SharedState . with do | redis |
redis . multi do | multi |
2021-01-03 14:25:43 +05:30
Array . wrap ( value ) . each_slice ( BATCH_SIZE ) { | batch | multi . pfadd ( key , batch ) }
2020-10-24 23:57:45 +05:30
multi . expire ( key , expiry )
end
end
end
2021-01-03 14:25:43 +05:30
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
2020-10-24 23:57:45 +05:30
end
end
end