I am using Rails 6, Devise and Redis for caching.
If I run
redis-cli monitor
I see that Rails try to fetch a key and it refresh the cache. Even if I just reload the same page or I change webpage during the same user-logged session. Maybe is it because of utm and referrer field on the user model?
utm/referrer are filled at user signup and they don’t will never change.
This is an issue because I perform a "get"/"set" operation when I just need a "get".
1604411976.019840 [0 [::1]:50683] "get" "_session_id:2::252360dc050fb8d65e84a43a7a55da72ce1428fbdde4d9cda696296e3bdb130d"
1604411978.440996 [0 [::1]:50683] "set" "_session_id:2::252360dc050fb8d65e84a43a7a55da72ce1428fbdde4d9cda696296e3bdb130d"
"x04bo: ActiveSupport::Cache::Entryt:x0b@value{nI"x0fsession_idx06:x06ETI"%45f803f32b1a89b8d6b0fc38ff90b00cx06;aTI"x19warden.user.user.keyx06;aT[a[x06ix06I""$2a$11$6p01wAYCqmAGsjxzT40z8Ox06;aTI"butmx06;aT{n:x0bsource0:rcampaign0:x0bmedium0:x0ccontent0:tterm0I"x10_csrf_tokenx06;aTI"1SzDbADoyFrsa/DwWutlecf+7RiSURygsxiU5+XL/o5c=x06;aTI"rreferrerx06;aT"Ehttp://localhost:3000/en/profiles/34/items/35940:r@version0:x10@created_atfx161604411978.440767:x10@expires_in0
config/devise
config.skip_session_storage = [:http_auth]
app/models/user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
:trackable
Schema.yml
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "locale"
t.integer "sign_in_count"
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.string "stripe_id"
t.string "paypal"
t.decimal "referral_commission"
t.date "trial_end_date"
t.string "coupon_code"
t.json "utm"
t.string "referrer"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
config/application.rb
config.middleware.insert_after ActionDispatch::Static, Rack::Deflater
config.session_store :cookie_store, key: '_interslice_session'
config.middleware.use ActionDispatch::Cookies # Required for all session management
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options
The problem is not caused by the controller. There is no code.
app/controller/application_controller.rb
class ApplicationController < ActionController::Base
# It happens even when I remove everything from here and page controller
end
class PagesController < ApplicationController
def test
render json: "ok"
end
end
2
Answers
Seems like rails uses it’s own field for expiration instead of the native setx for redis.
If you notice, the last field from the active record cache is expires_in0
You have 3 pieces at play here. redis, devise and rails, gotta find which one has bad configs.
Try:
These writes are result of changes to
session
(data isMarshal.dump
ed).Some bytes look to be broken in example, but it looks like you have
referrer
written to session (http://localhost:3000/en/profiles/34/items/35940
in example), which obviously change upon navigation and thus can result in writes.Strange thing is that you have
session_store = :cookie_store
, but sessions are usually written to redis whencache_store
is enabled