class LimitForbidControl::Base def initialize end def cache_key raise 'Please overwrite method :cache_Key' end def forbid_cache_key "#{cache_key}:forbid" end def allow_times 5 end def cumulative_expires 1.days end def forbid_expires 1.hours end def forbid? Rails.cache.read(forbid_cache_key) end def increment! value = Rails.cache.read(cache_key) value = value.to_i + 1 # 锁定 if value >= allow_times.to_i Rails.logger.info("[LimitForbidControl] Lock #{cache_key}") Rails.cache.write(forbid_cache_key, true, expires_in: forbid_expires) Rails.cache.delete(cache_key) else Rails.cache.write(cache_key, value, expires_in: cumulative_expires) end end def error_times Rails.cache.read(cache_key).to_i end def remain_times allow_times.to_i - error_times end def clear Rails.logger.info("[LimitForbidControl] Clear #{cache_key}") Rails.cache.delete(forbid_cache_key) Rails.cache.delete(cache_key) end private def redis_cache? Rails.cache.is_a?(ActiveSupport::Cache::RedisStore) end def day Time.current.strftime('%Y%m%d') end end