我想在Docker的Rails应用程序中连接Redis服务器
首先
我想从在Docker环境中运行的Rails应用程序连接到托管的Redis服务器。请注意,假设已完成使用Docker构建Rails应用程序的环境搭建。
环境
-
- ローカル環境
macOS
docker環境
ruby 3.1.2
Rails 7.0.3.1
做法
在本地主机上启动Redis。
首先,执行以下命令来安装Redis。
brew install redis
确认是否已安装
若已安装redis,则OK
$ brew list | grep redis
redis
将Redis服务器在后台启动
brew services start redis
通过Redis客户端命令进行连接确认,并确保返回了”PONG”。
$ redis-cli ping
PONG
在Rails端引入Redis
在Gemfile中写入以下内容,进入app容器并执行bundle install。
gem ‘redis-rails’
确认已安装以下内容,如果存在,即可确认。
root@[コンテナID]:/app# gem list | grep redis
redis (4.8.0)
redis-actionpack (5.3.0)
redis-activesupport (5.3.0)
redis-rack (2.1.4)
redis-rails (5.0.2)
redis-store (1.9.1)
3. 准备好了!试试连接吧!
进入app容器并执行rails c来启动控制台。
执行Redis.new。对于URL部分,在Docker容器内连接主机的localhost,应指定为docker.for.mac.localhost。(参考:https://qiita.com/Asayu123/items/ccfe4ccfc417ce57f445)
端口默认为6379。
irb(main):004:0> redis = Redis.new(url:"redis://docker.for.mac.localhost:6379")
=> #<Redis client v4.8.0 for redis://docker.for.mac.localhost:6379/0>
与其在1的时候做连接确认一样,在此也需要进行连接确认。
irb(main):005:0> redis.ping
=> "PONG"
尝试操作Redis
关于操作:https://github.com/redis/redis-rb
在Rails控制台中,尝试按以下方式输入。
irb(main):015:0> redis.set "hogekey", "Hello"
=> "OK"
当我检查本地文件时,发现已经保存了!
$ redis-cli
127.0.0.1:6379> get "hogekey"
"Hello"
外传
当我尝试使用redis-cli启动客户端时,出现了错误。
$ redis-cli ping
(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
首先,Redis是一种内存数据库(因此具有快速处理的特点)。
然而,当服务器停止时,内存会被释放,数据会消失,所以需要进行数据持久化。具体做法是定期创建快照,并在启动时加载该快照以进行恢复。现在看来,似乎由于无法将数据写入磁盘而导致错误发生。
通过重新启动Redis服务器来解决。
$ brew services restart redis
In Chinese, to paraphrase the given sentence “参考:” would be:
请参阅:
-
- https://www.sraoss.co.jp/tech-blog/redis/redis-persistdata/
- https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots