首页 > 解决方案 > Rails 缓存存储:如何使用密码配置 redis_cache_store

问题描述

在我的环境文件中,我有:

config.cache_store = :redis_cache_store, { url: ENV.fetch('REDIS_URL_CACHING', 'redis://localhost:6379/0')}

在 rails 控制台中,如果我 print REDIS_URL_CACHING,我会得到:

> ENV['REDIS_URL_CACHING']
=> "redis://:mypassword@localhost:6379/0

但是,如果我想检查 rails 是否连接到 redis,我会得到:

> Rails.cache.redis.keys
=> false
irb(main):004:0> Rails.cache.redis.keys
Traceback (most recent call last):
        1: from (irb):4
Redis::CannotConnectError (Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL))

我的 redis.conf 文件是这样的:

bind 0.0.0.0
requirepass mypassword

我在这里想念什么?

如果我删除密码选项,它可以工作,但我的 MacBook受到攻击

编辑

redis gem guide中,您可以为 redis 设置密码,如下所示:

redis = Redis.new(url: "redis://:p4ssw0rd@10.0.1.1:6380/15")
# Or 
redis = Redis.new(password: "mysecret")

# And then
redis.set("foo", "bar")
redis.get("foo")

但是,我想按照官方低级缓存指南中提到的方式使用低级缓存

class Product < ApplicationRecord
  def competing_price
    Rails.cache.fetch("#{cache_key_with_version}/competing_price", expires_in: 12.hours) do
      Competitor::API.find_price(id)
    end
  end
end

不知道如何配置 redis gem 来使用Rails.cache.fetch

标签: ruby-on-railsrubyredis

解决方案


根据已完成的测试,似乎唯一的问题是配置 Rail 的缓存适配器以在配置期间正确地将密码传递给 Redis 客户端。

在 Rails 源代码中,设置配置会将后面的参数传递给底层 Redis 客户端

所以如果这有效:

Redis.new(url: your_url, password: your_pass)

让 Rails 通过这些设置,如下所示:

config.cache_store = :redis_cache_store, { url: your_url, password: your_pass }

推荐阅读