使用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可以减少会话劫持等安全风险!

rails_redis_5

试着安装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
Image from Gyazo

通过这样做,您将能在本地环境中使用 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') %>

让我们检查一下在控制器中保存的值是否能够在视图中取出来。

Image from Gyazo

我已确认能够从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对查询结果进行缓存以减轻数据库负载。

广告
将在 10 秒后关闭
bannerAds