Class: Gitlab::RepositorySetCache
- Defined in:
- lib/gitlab/repository_set_cache.rb
Instance Attribute Summary collapse
-
#expires_in ⇒ Object
readonly
Returns the value of attribute expires_in.
-
#namespace ⇒ Object
readonly
Returns the value of attribute namespace.
-
#repository ⇒ Object
readonly
Returns the value of attribute repository.
Instance Method Summary collapse
- #cache_key(type) ⇒ Object
- #fetch(key, &block) ⇒ Object
-
#initialize(repository, extra_namespace: nil, expires_in: 2.weeks) ⇒ RepositorySetCache
constructor
A new instance of RepositorySetCache.
-
#search(key, pattern, &block) ⇒ Object
Searches the cache set using SSCAN with the MATCH option.
- #write(key, value) ⇒ Object
Methods inherited from SetCache
#count, #exist?, #expire, #include?, #read, #try_include?, #ttl
Constructor Details
#initialize(repository, extra_namespace: nil, expires_in: 2.weeks) ⇒ RepositorySetCache
Returns a new instance of RepositorySetCache.
8 9 10 11 12 13 14 |
# File 'lib/gitlab/repository_set_cache.rb', line 8 def initialize(repository, extra_namespace: nil, expires_in: 2.weeks) @repository = repository @namespace = "#{repository.full_path}" @namespace += ":#{repository.project.id}" if repository.project @namespace = "#{@namespace}:#{extra_namespace}" if extra_namespace @expires_in = expires_in end |
Instance Attribute Details
#expires_in ⇒ Object (readonly)
Returns the value of attribute expires_in.
6 7 8 |
# File 'lib/gitlab/repository_set_cache.rb', line 6 def expires_in @expires_in end |
#namespace ⇒ Object (readonly)
Returns the value of attribute namespace.
6 7 8 |
# File 'lib/gitlab/repository_set_cache.rb', line 6 def namespace @namespace end |
#repository ⇒ Object (readonly)
Returns the value of attribute repository.
6 7 8 |
# File 'lib/gitlab/repository_set_cache.rb', line 6 def repository @repository end |
Instance Method Details
#cache_key(type) ⇒ Object
16 17 18 |
# File 'lib/gitlab/repository_set_cache.rb', line 16 def cache_key(type) super("#{type}:#{namespace}") end |
#fetch(key, &block) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/gitlab/repository_set_cache.rb', line 38 def fetch(key, &block) full_key = cache_key(key) smembers, exists = with do |redis| redis.multi do |multi| multi.smembers(full_key) multi.exists?(full_key) # rubocop:disable CodeReuse/ActiveRecord end end return smembers if exists write(key, yield) end |
#search(key, pattern, &block) ⇒ Object
Searches the cache set using SSCAN with the MATCH option. The MATCH parameter is the pattern argument. See redis.io/commands/scan#the-match-option for more information. Returns an Enumerator that enumerates all SSCAN hits.
57 58 59 60 61 62 63 64 65 66 |
# File 'lib/gitlab/repository_set_cache.rb', line 57 def search(key, pattern, &block) full_key = cache_key(key) with do |redis| exists = redis.exists?(full_key) # rubocop:disable CodeReuse/ActiveRecord write(key, yield) unless exists redis.sscan_each(full_key, match: pattern) end end |
#write(key, value) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/gitlab/repository_set_cache.rb', line 20 def write(key, value) full_key = cache_key(key) with do |redis| redis.multi do |multi| multi.unlink(full_key) # Splitting into groups of 1000 prevents us from creating a too-long # Redis command value.each_slice(1000) { |subset| multi.sadd(full_key, subset) } multi.expire(full_key, expires_in) end end value end |