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 服务器的地址。
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')
08 dev 上打开 cache
运行命令,检查 caching-dev.txt 是否存在
bin/rails dev:cache