在Mac/EC2:AmazonLinux上,将Redis用作Rails的会话存储
尝试将默认的Rails Cookie会话存储方式更改为Redis。确保在本地开发环境(Mac)和生产环境(EC2:AmazonLinux)都可以运行。值得注意的是,在生产环境中,我们使用ElastiCache作为Redis服务器。
Redis是什么东西?
只是称为一个数据库。但是与传统的关系型数据库(如Postgresql和MySQL)有所不同。
(Please note that Chinese translation might not be accurate due to the limitation of the AI model.)
-
- 一意のキーと、保存したい値のペアでデータを保存する(KVS:KeyValueStore)
- データを全てメモリ上に持つ(なので動作が高速)
有这个特点。
但是,如果重新启动,存储在内存中的数据就会消失吧?我原以为是这样,但实际上,系统会定期保存内存中数据的快照(数据持久化)。当然,在系统崩溃时,只能保存最后一个快照之前的数据就会丢失,但根据需要可以尽量减少这种情况发生。
而且它还支持复制。复制是指准备多个数据库,并始终保持其内容同步。这样可以实现负载均衡,并增强其对故障的容错能力。
而且,AWS的ElastiCache也支持这种复制。(虽然我还没有开始复制,但这正是我决定使用它的原因)
在Mac上安装Redis。
安装 Redis
使用Homebrew安装。
% brew install redis
我先确认一下版本。
% redis-server --version
Redis server v=2.8.13 sha=00000000:0 malloc=libc bits=64 build=96319fcc2102d7fa
启动 Redis 服务器。(按Ctrl-C终止)
% redis-server /usr/local/etc/redis.conf
注册使Redis自动运行。
虽然这个也能运行,但每次在本地运行Rails应用程序时都需要启动Redis服务器,这非常麻烦。
为了避免这个麻烦,我将设置Redis服务器自动执行。
% ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
% launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
为了确认,我们尝试检查一下过程。
% ps ax | grep redis-server
13443 ?? S 0:00.44 /usr/local/opt/redis/bin/redis-server 127.0.0.1:6379
13836 s005 S+ 0:00.00 grep redis-server
经过这个步骤,即使重新启动Mac,Redis服务器也会自动启动。
如果你想要停止自动启动,请点击这里。
% launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
将Redis引入Rails
安装Gem
gem 'redis'
gem 'redis-rails'
将会话存储更改为Redis。
最初的设置是注释掉的。
#Rails.application.config.session_store :cookie_store, key: 'XXXXXX'
为了在开发和生产环境中进行设置区分,并将会话存储的设置移动到development.rb文件中。
Rails.application.configure do
# (中略)
# これを追加
config.session_store :redis_store, servers: 'redis://localhost:6379/0', expire_in: 1.day
end
如果在其他情况下也要使用Redis的话,也许可以使用不同的数字。
expire_in代表会话数据的存活时间。在这种情况下,1天后会消失。
这样本地开发环境(Mac)应该可以运行了。
查看存储在Redis中的数据
既然已经如此,就来查看保存的会话数据吧。
启动 Redis 客户端。
% redis-cli
如果指定了非ID0的数据库,请选择数据库。
127.0.0.1:6379> select 1
获取存储在数据库中的键的数量
127.0.0.1:6379> dbsize
获取钥匙
127.0.0.1:6379> keys *
1) "f1412e2bbe5df2091ebdf2e3025e2335"
因为会显示出键,所以可以使用该键来查看值。
127.0.0.1:6379> get "f1412e2bbe5df2091ebdf2e3025e2335"
尽管出现了无法阅读的字符串,但某种东西被保存了下来。
顺便提一下,执行flushdb命令会删除Redis数据库中的所有数据。如果Rails应用程序中包含登录功能,那么会导致会话数据丢失,需要重新登录。这样一来,我们可以真正感受到数据确实存储在Redis中。
127.0.0.1:6379> flushdb
结束了。
127.0.0.1:6379> exit
EC2:在ElastiCache上也可以运行Amazon Linux。
如果在本地运行顺利的话,就尝试在生产环境中运行。
虽然我本来希望从本地也能使用ElastiCache,但目前似乎无法从EC2网络外部访问ElastiCache。
请确认ElastiCache的终端节点。
请忽略ElastiCache的创建步骤。
然而,需要注意的是,与EC2等不同的是,无法在后期更改CacheCluster的名称。
如果完成了,会是这个样子。

从显示的图片中的一个节点,点击链接可以进入节点的详细页面。

请在此处复制终端节点的字符串。
用于生产环境的会话存储设置
Rails.application.configure do
# (中略)
# これを追加
config.session_store :redis_store, servers: 'redis://XXXX.XXXX.XXXX.XXXX.cache.amazonaws.com:6379/0', expire_in: 1.day
end
XXXX.XXXX.XXXX.XXXX.cache.amazonaws.com是端点。
只要部署,应该就可以在生产环境中运行。