rails: redis 缓存配置

redis 作为 rails 的默认缓存,可以如下配置

01 安装 gem

添加 Gem: 在你的 Gemfile 中添加 Redis 和 Hiredis:

gem 'redis'
gem 'hiredis'

然后运行 bundle install 来安装这些 gem。

这2个gem的关系:

gem 'redis' 是必须的,它是与 Redis 交互的基本客户端库。
gem 'hiredis' 是可选的,它是一个 C 扩展库,用于提高 Redis 客户端的性能。如果你在高性能环境下运行应用,特别是涉及大量 Redis 操作的场景,建议安装它。
如果你只是想让 Redis 缓存工作,redis gem 就足够了。hiredis 只是为了优化性能,通常不需要在小型应用中强制安装。
如果你安装了 hiredis,它会替换掉默认的 Ruby 实现,因此需要确保你的环境支持 C 扩展。如果你在某些平台(如 Windows)上部署,可能会遇到安装困难。

02 配置 Redis 作为缓存存储

config/environments/production.rb 或其他环境配置文件中,添加以下配置:

特别留意:redis://: 这里的冒号

config.cache_store = :redis_cache_store, {
  url: "redis://:p4ssw0rd@localhost:6379/0",
  namespace: "rails_cache",
}

# 或者这个
config.cache_store = :redis_cache_store, { url: 'redis://192.168.0.10:6379/0'}

# 其它相关配置
# config/environments/development.rb
config.action_controller.perform_caching = true
config.cache_store = :memory_store # 或其他存储

确保你将 url 替换为你的 Redis 服务器的地址。

rails cache 带 ns

03 Rails 对 cache 的 基本操作

基本操作

  • Write: 用于将数据写入缓存
  • Read: 用于从缓存中读取数据
  • Delete: 删除
  • Exists: 用于检查某个键是否存在于缓存中
  • Fetch: 用于获取缓存值,如果值不存在,则执行给定的块并将返回值存入缓存。
# 写
Rails.cache.write("my_key", "my_value")
# 读
value = Rails.cache.read("my_key")
# 删
Rails.cache.delete("my_key")
# 是否存在
exists = Rails.cache.exist?("my_key")
# fetch
value = Rails.cache.fetch("my_key") do
  # 计算或获取数据
  "my_calculated_value"
end

综合的示例

# 写入缓存
Rails.cache.write("user_1", { name: "Alice", age: 30 })

# 读取缓存
user = Rails.cache.read("user_1")
puts user # => { name: "Alice", age: 30 }

# 检查是否存在
if Rails.cache.exist?("user_1")
  puts "User exists"
end

# 删除缓存
Rails.cache.delete("user_1")

# 使用 fetch
user_data = Rails.cache.fetch("user_2") do
  # 假设这里是一个耗时的数据库查询
  { name: "Bob", age: 25 }
end

04 redis 的配置如下

bind 0.0.0.0
requirepass p4ssw0rd

05 启用缓存

确保你的 Rails 应用开启了缓存。在生产环境中,通常是自动开启的,但你可以检查 config/environments/production.rb 中的以下设置:

config.action_controller.perform_caching = true

06 使用缓存

你可以在控制器或视图中使用 Rails 的缓存方法,例如:

# 在控制器中
Rails.cache.fetch("my_cache_key") do
  # 计算或获取数据
end
<!-- 在视图中 -->
<% cache("my_cache_key") do %>
  <!-- 渲染的内容 -->
<% end %>

07 测试 redis 是否配置成功

rails c 测试代码如下

# 这一句返回 false,应该 rails 会自动引入
# require 'redis'

redis = Redis.new(url: "redis://:p4ssw0rd@127.0.0.1:6379/0")
redis.set('foo', 'bar')
测试查看 redis 是否写入

08 dev 上打开 cache

运行命令,检查 caching-dev.txt 是否存在

bin/rails dev:cache
redis rails ruby