Данные удалены из базы данных, но все еще существуют в кэше Redis - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь кэшировать модель в моем приложении rails. У меня есть модель Snippets . При первом создании записи создается кэш счетчика повторов.

Модель

class Snippet < ApplicationRecord
  after_save :clear_cache
  def clear_cache
    $redis.del("snippets")
  end
end

Контроллер

class SnippetsController < ApplicationController
  include SnippetsHelper
  def index
    @snippets = fetch_snippets
  end
  def destroy
    @snippet.destroy
    respond_to do |format|
      format.html { redirect_to snippets_url, notice: 'Snippet was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
end

вид

  <td><%= link_to 'Destroy', snippet_path(snippet["id"]), method: :delete, data: { confirm: 'Are you sure?' } %></td>

Таким образом, каждый раз, когда я загружаю страницу индекса, я загружаю кеш вместо запроса базы данных. Теперь, хотя я удалил запись в БД, она все равно появляется на странице указателя. Моя проблема заключается в том, как удалить одновременно и запись в БД, и запись в кеш.

Redis Helper

module SnippetsHelper
  def fetch_snippets
    snippets = $redis.get("snippets")
    if snippets.nil?
      snippets = Snippet.all.to_json
      $redis.set("snippets", snippets)
      $redis.expire("snippets", 5.hour.to_i)
    end
    JSON.load snippets
  end
end

1 Ответ

0 голосов
/ 27 апреля 2018

Из приведенного выше фрагмента кода кажется, что вы очищаете кеш только тогда, когда данные сохраняются в базе данных с помощью обратного вызова.

Но вам также необходимо обновить кеш при удалении данных из базы данных. Для этого добавьте обратный звонок в модель.

after_destroy :clear_cache.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...