使用Ruby on Rails和Redis加速会话!
今天的目标 de
学习关于NoSQL数据库
这是在学习如何设置Redis之前,通过一个非常简单的应用程序来预习使用Amazon Web Services的Amazon ElastiCache for Redis或者Microsoft Azure的Azure Redis Cache的笔记。
Redis 是一种开源的内存数据库,用于存储和访问数据的高性能解决方案。
Redis是一種將數據保存在內存上的超高速數據庫,它是一種內存型鍵值存儲(KVS)系統,用於將數據保存在內存中。
KVS是一种主要用于存储简单键值数据的数据库类型,无法处理类似关系数据库(RDB)中复杂的数据,但具有快速操作的特点。
如果是为了数据的持久化而考虑的话,它并不适合。
Rails使用Redis的好处是什么?
由于Redis是一个简单且高速的数据库,因此可以用以下方式来同义重述这句话:
由于Redis是一种简明且高效的数据库,因此
-
- キャッシュ(Rails.cache)
-
- Ruby on Rails のセッションデータ
- 大量データ送信データ(Active Job)
使用Redis作为临时数据存储位置可以加速Rails!
此外,对于会话数据,通过将其更改为Redis可以减少会话劫持等安全风险!

试着安装Redis。
安装Redis
$ brew install redis
(base) USERnoMacBookea:~ user$ brew install redis
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/services).
No changes to formulae.
==> Downloading https://homebrew.bintray.com/bottles/redis-5.0.8.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/c7/c72def1c78f6c24c02d47de80a0b5ae5ef67640a42a38d040c503429eb02d3b1?__gda__=exp=1588749665~hmac=c2fa7998accdcd9eaee8924e58ca7815a1
######################################################################## 100.0%
==> Pouring redis-5.0.8.mojave.bottle.tar.gz
==> Caveats
To have launchd start redis now and restart at login:
brew services start redis
Or, if you don't want/need a background service you can just run:
redis-server /usr/local/etc/redis.conf
==> Summary
? /usr/local/Cellar/redis/5.0.8: 13 files, 3.1MB
启动Redis服务器
$ redis-server

通过这样做,您将能在本地环境中使用 Redis。
在终端中打开一个新的选项卡并连接到Redis。
$ redis-cli
127.0.0.1:6379>
尝试使用Redis
在使用redis-cli连接到Redis服务器后,尝试以下操作。
使用 SET 方法设置键和值并保存数据
使用 GET 方法通过键获取值
使用 quit 命令退出 redis-cli 交互环境
(base) USERnoMacBookea:~ user$ redis-cli
127.0.0.1:6379> SET mykey "Hello"
OK
127.0.0.1:6379> GET mykey
"Hello"
127.0.0.1:6379> quit
尝试在Rails中引入Redis
环境:
Ruby版本为2.5.1,Rails版本为5.2.4。
创建一个Rails应用
在这里,我们将创建一个简单的应用程序,只需要从Redis中检索值并显示在页面上。
rails _5.2.4_ new redis_sample
安装 gem redis-rails
gem 'redis-rails'
$ bundle install
在config/application.rb中写入以下内容
config.cache_store = :redis_store, 'redis://localhost:6379/0/cache', { expires_in: 90.minutes }
config/application.rb 写在那里,但实际上,我认为根据不同的环境引用的 Redis 服务器是不同的,所以最好写在 config/environments/◯◯.rb 中。
创建示例页面
Redis.current = Redis.new
由于是在本地环境,所以只写了Redis.new,但是可以像下面这样指定host和port,所以如果要使用AWS的ElastiCache的Redis等,需要分别指定它们。
class RedisController < ApplicationController
def show
Redis.current.set('mykey', 'Hello')
end
end
将值保存到在config/initializers/redis.rb中定义的Redis.current。
<%= Redis.current.get('mykey') %>
让我们检查一下在控制器中保存的值是否能够在视图中取出来。

我已确认能够从Redis中获取值。
尝试将Rails的会话管理更换到Redis上。
请创建config/initializers/session_store.rb文件。(对于Rails 5.0来说是默认的,但对于5.2以后的版本,请务必创建此文件)
Rails.application.config.session_store :redis_store, {
servers: [
{
host: "localhost", # Redisのサーバー名
port: 6379, # Redisのサーバーのポート
db: 0, # データベースの番号(0 ~ 15)の任意
namespace: "session" # 名前空間。"session:セッションID"の形式
},
],
expire_after: 90.minutes # 保存期間
}
我会在 Rails 控制台中进行确认。
$ bin/rails c
>redis = Redis.new(url: 'redis://localhost:6379/0') # Redisに接続
# セッションを保存しているデータベースを選択
> redis.select 0
=> "OK
# Redisのセッションデータをクリア
> redis.flushdb
=> "OK"
# キーの一覧を取得
> redis.keys
=> []
在本次示例应用程序中,由于没有使用会话,所以 `redis.keys => []`,但是我认为在Rails应用程序中执行保存到会话的操作后,可以通过 `redis.keys` 来确认内容。
# キーの一覧を取得
> redis.keys
=> ["session:de7b87c3c487b3622c8a505c5e1ce69a", "session:7d12e83552cd35bb1e082480fbaee71d"]
# 保存データの中身を確認
> redis.get "session:de7b87c3c487b3622c8a505c5e1ce69a"
=> "\u0004\b{\u0006I\"\u0010_csrf_token\u0006:\u0006EFI\"13u/SxOI4lsxx836eIAKj8yOnViUXGcAMF02kvvDQFB8=\u0006;\u0000F"
以上就完成了对于会话数据的Redis连接。
Redis 是一种超高速的数据库,它将数据保存在内存中。
请务必将Ruby on Rails的会话管理数据存储在Redis中,这不仅可以加快速度,还可以增强安全性。
请参考
启用Redis缓存
通过缓存查询结果来减少数据库访问次数并减轻负载的方法,您可以在这篇文章中创建一个示例应用程序。
使用Rails对查询结果进行缓存以减轻数据库负载。