我使用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文件在当前目录下。