The default session store for Rails is cookie_store
. This makes the session be stored on the client side (correct me if I am wrong).
I want to change this default behavior, so that I can store the sessions into Redis database.
The posts/articles I found on the Internet, suggests setup a caching store to use redis_cache_store
and then for the session_store, to use cache_store
.
As I got it, this means that, both caching and sessions will be using the same database (Instance). I don’t want that. I want both sessions and cache to use different instances of Redis, so they can be configured accordingly.
I tried to create an initializer file config/initializers/session_store.rb
with the following content:
Rails.application.config.session_store :redis_cache_store, key: '_my_app_session'
But this does not work. It gives me the following error:
/application/configuration.rb:324:in `const_get’: uninitialized constant ActionDispatch::Session::RedisCacheStore (NameError)
I also found this gem https://github.com/redis-store/redis-store
but I am not sure how problematic using this gem can be, since Rails already has a built-in Redis cache store (https://github.com/rails/rails/pull/31134)
2
Answers
redis_cache_store
is a cache store, you cannot directly use it as a session store. You will have to useredis_cache_store
as your defaultcache_store
and then you can use thecache_store
for yoursession_store
. Something like thisIn your
config/application.rb
(Read this to know why here)and then in your
config/initializers/session_store.rb
There are other options to do this without modifying
cache_store
as well such as redis-store and redis-session-storeAs explained in redis-rails, Rails has a redis cache store out of the box starting with Rails 5.2.
The advise is to use this store for caching (fragment cache).
For sessions, you can still use the session store provided by redis-actionpack which is a part of redis-rails and can be use on its own.
So you should define in your Gemfile:
In your environment, define cache and session store (see Rails Guide and gem redis-rails):
Now your using the cache store of Rails and the session store of redis-rails.
The sessions are namespaced or can be in a different redis instance.