module SidekiqScheduler::RedisManager

def self.add_schedule_change(name)

Parameters:
  • name (String) -- The name of the job
def self.add_schedule_change(name)
  Sidekiq.redis { |r| r.zadd(schedules_changed_key, Time.now.to_f, name) }
end

def self.clean_schedules_changed

Remove all the schedule changes records
def self.clean_schedules_changed
  Sidekiq.redis { |r| r.del(schedules_changed_key) unless r.type(schedules_changed_key) == 'zset' }
end

def self.get_all_schedules

Returns:
  • (Hash) - hash with all the job schedules
def self.get_all_schedules
  Sidekiq.redis { |r| r.hgetall(schedules_key) }
end

def self.get_job_last_time(name)

Returns:
  • (String) - last time the job was executed

Parameters:
  • name (String) -- The name of the job
def self.get_job_last_time(name)
  hget(last_times_key, name)
end

def self.get_job_next_time(name)

Returns:
  • (String) - next time the job has to be executed

Parameters:
  • name (String) -- The name of the job
def self.get_job_next_time(name)
  hget(next_times_key, name)
end

def self.get_job_schedule(name)

Returns:
  • (String) - schedule in JSON format

Parameters:
  • name (String) -- The name of the job
def self.get_job_schedule(name)
  hget(schedules_key, name)
end

def self.get_job_state(name)

Returns:
  • (String) - state in JSON format

Parameters:
  • name (String) -- The name of the job
def self.get_job_state(name)
  hget(schedules_state_key, name)
end

def self.get_schedule_changes(from, to)

Returns:
  • (Array) - array with all the changed job names

Parameters:
  • to (Float) -- The maximum value in the range
  • from (Float) -- The minimum value in the range
def self.get_schedule_changes(from, to)
  Sidekiq.redis { |r| r.zrangebyscore(schedules_changed_key, from, "(#{to}") }
end

def self.hdel(hash_key, field_key)

Parameters:
  • field_key (String) -- The key name of the field
  • hash_key (String) -- The key name of the hash
def self.hdel(hash_key, field_key)
  Sidekiq.redis { |r| r.hdel(hash_key, field_key) }
end

def self.hget(hash_key, field_key)

Returns:
  • (String) -

Parameters:
  • field_key (String) -- The key name of the field
  • hash_key (String) -- The key name of the hash
def self.hget(hash_key, field_key)
  Sidekiq.redis { |r| r.hget(hash_key, field_key) }
end

def self.hset(hash_key, field_key, value)

Parameters:
  • value (String) -- The new value name for the field
  • field_key (String) -- The key name of the field
  • hash_key (String) -- The key name of the hash
def self.hset(hash_key, field_key, value)
  Sidekiq.redis { |r| r.hset(hash_key, field_key, value) }
end

def self.key_prefix

Returns:
  • (String) - with the key prefix
def self.key_prefix
  @key_prefix
end

def self.key_prefix=(value)

Parameters:
  • value (String) -- The string to use as the prefix. A ":" will be appended as a delimiter if needed.
def self.key_prefix=(value)
  value = "#{value}:" if value && !%w[. :].include?(value[-1])
  @key_prefix = value
end

def self.last_times_key

Returns:
  • (String) - with the key
def self.last_times_key
  "#{key_prefix}sidekiq-scheduler:last_times"
end

def self.next_times_key

Returns:
  • (String) - with the key
def self.next_times_key
  "#{key_prefix}sidekiq-scheduler:next_times"
end

def self.pushed_job_key(job_name)

Returns:
  • (String) - the pushed job key

Parameters:
  • job_name (String) -- The name of the job
def self.pushed_job_key(job_name)
  "#{key_prefix}sidekiq-scheduler:pushed:#{job_name}"
end

def self.register_job_instance(job_name, time)

Returns:
  • (Boolean) - true if the job was registered, false otherwise

Parameters:
  • time (Time) -- The time at which the job was cleared by the scheduler
  • job_name (String) -- The name of the job
def self.register_job_instance(job_name, time)
  job_key = pushed_job_key(job_name)
  registered, _ = Sidekiq.redis do |r|
    r.pipelined do |pipeline|
      pipeline.zadd(job_key, time.to_i, time.to_i)
      pipeline.expire(job_key, REGISTERED_JOBS_THRESHOLD_IN_SECONDS)
    end
  end
  registered.instance_of?(Integer) ? (registered > 0) : registered
end

def self.remove_elder_job_instances(job_name)

Parameters:
  • job_name (String) -- The name of the job
def self.remove_elder_job_instances(job_name)
  seconds_ago = Time.now.to_i - REGISTERED_JOBS_THRESHOLD_IN_SECONDS
  Sidekiq.redis do |r|
    r.zremrangebyscore(pushed_job_key(job_name), 0, seconds_ago)
  end
end

def self.remove_job_next_time(name)

Parameters:
  • name (String) -- The name of the job
def self.remove_job_next_time(name)
  hdel(next_times_key, name)
end

def self.remove_job_schedule(name)

Parameters:
  • name (String) -- The name of the job
def self.remove_job_schedule(name)
  hdel(schedules_key, name)
end

def self.schedule_exist?

Returns:
  • (Boolean) - true if the schedules key is set, false otherwise
def self.schedule_exist?
  SidekiqScheduler::SidekiqAdapter.redis_key_exists?(schedules_key)
end

def self.schedules_changed_key

Returns:
  • (String) - with the key
def self.schedules_changed_key
  "#{key_prefix}schedules_changed"
end

def self.schedules_key

Returns:
  • (String) - with the key
def self.schedules_key
  "#{key_prefix}schedules"
end

def self.schedules_state_key

Returns:
  • (String) - with the key
def self.schedules_state_key
  "#{key_prefix}sidekiq-scheduler:states"
end

def self.set_job_last_time(name, last_time)

Parameters:
  • last_time (String) -- The last time the job was executed
  • name (String) -- The name of the job
def self.set_job_last_time(name, last_time)
  hset(last_times_key, name, String(last_time))
end

def self.set_job_next_time(name, next_time)

Parameters:
  • next_time (String) -- The next time the job has to be executed
  • name (String) -- The name of the job
def self.set_job_next_time(name, next_time)
  hset(next_times_key, name, String(next_time))
end

def self.set_job_schedule(name, config)

Parameters:
  • config (Hash) -- The new schedule for the job
  • name (String) -- The name of the job
def self.set_job_schedule(name, config)
  hset(schedules_key, name, JSON.generate(config))
end

def self.set_job_state(name, state)

Parameters:
  • state (Hash) -- The new state for the job
  • name (String) -- The name of the job
def self.set_job_state(name, state)
  hset(schedules_state_key, name, JSON.generate(state))
end