Clear Memcached on Heroku Deploy

前端 未结 9 1732
旧巷少年郎
旧巷少年郎 2020-12-13 09:18

What is the best way to automatically clear Memcached when I deploy my rails app to Heroku?

I\'m caching the home page, and when I make changes and redeploy, the pag

9条回答
  •  -上瘾入骨i
    2020-12-13 09:42

    I just had this problem as well but wanted to stick to the git deployment without an additional script as a wrapper.

    So my approach is to write a file during slug generation with an uuid that marks the current precompilation. This is impelmented as a hook in assets:precompile.

    # /lib/tasks/store_asset_cacheversion.rake
    # add uuidtools to Gemfile
    
    require "uuidtools"
    
    def storeCacheVersion
      cacheversion = UUIDTools::UUID.random_create
      File.open(".cacheversion", "w") { |file| file.write(cacheversion) }
    end
    
    Rake::Task["assets:precompile"].enhance do
      puts "Storing git hash in file for cache invalidation (assets:precompile)\n"
      storeCacheVersion
    end
    
    Rake::Task["assets:precompile:nondigest"].enhance do
      puts "Storing git hash in file for cache invalidation (assets:precompile:nondigest)\n"
      storeCacheVersion
    end
    

    The other is an initializer that checks this id against the cached version. If they differ, there has been another precompilation and the cache will be invalidated.

    So it dosen't matter how often the application spins up or down or on how many nodes the worker will be distributed, because the slug generation just happens once.

    # /config/initializers/00_asset_cache_check.rb
    
    currenthash = File.read ".cacheversion"
    cachehash   = Rails.cache.read "cacheversion"
    
    puts "Checking cache version: #{cachehash} against slug version: #{currenthash}\n"
    
    if currenthash != cachehash
      puts "flushing cache\n"
      Rails.cache.clear
      Rails.cache.write "cacheversion", currenthash
    else
      puts "cache ok\n"
    end
    

    I needed to use a random ID because there is as far as I know no way of getting the git hash or any other useful id. Perhaps the ENV[REQUEST_ID] but this is an random ID as well.

    The good thing about the uuid is, that it is now independent from heroku as well.

提交回复
热议问题