我使用Redis作为缓存数据库来管理会话信息的经历

你做了什么?

とあるRailsのカリキュラムを実施しています。セッション情報の管理にRedisを使うことになっていましたが、初めてつかうgemなので、簡単に内容を調べてみました。

なお、実行環境は以下の通りです。

    Rails 5.2.3

2020年12月時点で、官方发布的公告。

まずは、公式のドキュメントで内容を把握しようとしたところ、初めにこんなことが書いてありました。

Rails 5.2.0にはすぐに使えるRedisキャッシュストアが含まれているため、フラグメントキャッシュをRedisに保存するだけでよい場合は、このgemはもう必要ありません。 redis-activesupport gemのメンテナンスは、セキュリティと互換性の問題のために継続されますが、新しい機能は受け付けていません。セッション管理用のredis-actionpackやHTTPキャッシュストレージ用のredis-rack-cacheなど、redis-storeファミリーの他のすべてのgemを引き続き積極的に維持しています。

こ、、、これは、、、、。Rails5.2.0以上ではこのgemは必要ないということなのでしょうか??
とりあえず上記文章中にあった、フラグメントキャッシュという単語は何かわからなかったので、調べてみました。

それによると、フラグメントキャッシュは、ビューの情報の再読み込みに関するキャッシュなのですね。

つまり、上記の記述はビューの情報をキャッシュするだけならこのgemは不要とのことなので、今回のセッション情報管理には引き続き使って良さそうです。よかった。

不过,在官方文档的会话信息管理部分,也提到了“今后请直接使用redis-actionpack”,所以或许以后使用这个会更好呢^^

Gem的概述

由于公式提供的信息很难理解这个宝石到底是怎样的,所以我参考了这篇文章。

“Redis是什么?如何在Rails中引入Redis?”

根据这份报道,Redis具有以下特点。

缓存系统中著名的NoSQL之一是KVS(键值存储),它保存键值对的组合。
可用于各种数据类型:字符串、列表、集合、有序集合、哈希。
由于是内存存储,所以速度快。
可进行持久化设置。
单线程操作。
可进行水平扩展。
适用场景:
– 处理具有有效期限的数据,如会话数据。
– 处理需要运行繁重SQL的排名数据等操作。

由于有很多我不懂的词语,所以下面我会追加一些我查到的内容。

NoSQL…SQLを使わずにデータの操作ができるデータベース言語のことだそうです。jsonなどがこれにあたります。

インメモリ…データをディスクや SSD に保存するデータベースではなく、データストレージ用のメモリに主に依存するもの、だそうです。

シングルスレッド…処理の開始から終了まで線を引いたときに1本の線で書ける、枝分かれしない処理のことだそうです。

嗯,原来如此。终于理解了大致的概况。

导入步骤

接下来,让我们开始引入。首先,在Gemfile中添加以下内容,然后执行bundle install。

gem 'redis-rails'

然后,在config/initializers/session_store.rb中(如果不存在则新建),写入以下内容。需要注意的是,如果按照官方的描述来写的话,会在CSRF方面出现错误,所以我参考了这篇博客文章,并按照以下方式进行了写入。

MyApp::Application.config.session_store :redis_store, expire_after: 1.day, servers: {
  host: "localhost",
  port: 6379,
  namespace: "user_sessions",
  signed: true,
  secure: true
}

由於每個選項都有官方的說明,所以我們可以借助Google翻譯的功能來進行筆記。

servers…データの検索を試みるRedisサーバーのURLの配列(6379はRedisのデフォルト値)

expire_after…セッションキーのデフォルトのTTL(寿命)。これは、セッションストアによって生成されたCookieの有効期限としても設定されます。

key…クライアント側のCookieの名前です

threadsafe…複数のインスタンスで実行されるアプリケーション用です。セッションデータのグローバルミューテックスロック(二人以上が同時に使えなくする仕組み)を無効にする場合は、これをfalseに設定します。これはデフォルトでtrueであり、ミューテックスが有効になることを意味します。

signed…署名済み/暗号化されたCookieを使用してローカルセッションをクライアントマシンに保存し、悪意のあるユーザーがそのコンテンツを改ざんするのを防ぐ

secure…HTTP Cookieがセキュア(HTTPS)接続でサーバーからクライアントに転送されることを保証

我明白了,对于选项也有相当程度的理解。
那么,我立刻开始使用。

使用方法

Redis通过将会话信息存储在Redis服务器中的方式,使开发人员能够看到会话信息。因此,首先需要启动Redis服务器(在Rails应用程序启动之前)。

$ redis-server

请注意,在使用 Redis 的情况下,如果你不先启动 Redis 服务器而直接启动 Rails 服务器,会出现错误。

然后,在新的窗口中运行redis-cli。

$ redis cli
127.0.0.1:6379> # コマンドを入力できます

通过输入各种命令,您可以读取和写入Redis服务器的信息。

命令操作

您可以在这里查看Redis的所有命令信息,但在这里,我只介绍足够查看会话信息的内容。

此外,我也非常参考了这篇博客文章。

你可以查看所有已注册的键。

> KEYS *
1) "user_sessions:2::f7ab4de876c20536e1e391a21bac...."

在Redis的配置中,之前指定了命名空间为”user_sessions”,因此会在会话信息前面加上”user_sessions”作为前缀。由于键中可以使用通配符,所以可以使用通配符进行匹配。

当你键入”KEYS user_sessions*”时,

> keys user_sessions*
1) "user_sessions:2::f7ab4de876c20536e1e391a21bac...."

只能看到与用户会话相关的键。(显示上没变化,哈哈)

在Redis中,根据数据类型获取值的方法似乎是不同的。因此,首先我们要确认刚才获取的KEY的数据类型。

可以使用TYPE关键字来检查数据类型。

> type 1) "user_sessions:2::f7ab4de876c20536e1e391a21bac...."
string

通过GET方法获取string类型的key的value。

当您输入GET键名时,您可以确认会话的值。

get 1) "user_sessions:2::f7ab4de876c20536e1e391a21bac...."
"\x04\b{\aI\"\x10_csrf_token\x06:\x06EFI\...."

会话信息是这个样子的呀。。。

心得

实施就到这里。因为是第一次使用这个 gem,并且直到输出结果为止都是个问题,所以我进行了相当谨慎的研究,幸好现在我对官方文档的阅读方法有了相当的理解。此外,先仔细阅读文档再开始实施能让我更好地了解 gem 的运作原理,并且能更快地解决错误问题。

继续努力不懈。

附注:关于生成了一个名为dump.rdb的文件的事情

我遇到了一个问题,当我引入Redis时,会在当前目录生成一个名为dump.rdb的文件。但是我通过以下方法成功避免了这个问题。

生成dump.rdb文件在当前目录下。

bannerAds