在使用Rails和redis-objects时,可能最好也同时使用redis-namespace

在Rails中处理Redis,使用redis-objects之类的工具很方便。

但是,在Rails的AR中使用redis-objects时,默认情况下,Redis键的格式是模型名称:ID:指定的键。


例如,假设我们以这样的方式使用。

Redis.current = Redis.new(:host => '127.0.0.1', :port => 6379)
class User < ActiveRecord::Base
  include Redis::Objects
  value :hoge
end
user = User.find(1)
user.hoge.value = 'aaa'

通过使用redis-cli直接进行检查。

$ redis-cli
redis 127.0.0.1:6379> GET user:1:hoge
"aaa"

虽然这样也无所谓,但是在本地开发并且只有一个Redis实例用于多个项目时,如果其他项目的模型名称和键名重叠,会变得非常麻烦。

也可以使用Redis的数据库功能Redis.new(:host => ‘127.0.0.1’, :port => 6379, :db => 1),但由于只能使用数字进行指定,可能会导致类似于“在之前的项目中使用到了哪个编号?”这样的情况。

redis-命名空间

为了防止这种情况发生,当每个项目都有不同的键时,可以使用这个。
如README所述,在调用redis时会自动添加指定的命名空间到键中。

r = Redis::Namespace.new(:ns, :redis => @r)
r['foo'] = 1000
$ redis-cli
redis 127.0.0.1:6379> GET ns:foo
"1000"

让我们也在redis-objects中使用这个。

namespace = [Rails.application.class.parent_name, Rails.env].join ':'
Redis.current = Redis::Namespace.new(namespace,
  :redis => Redis.new(:host => '127.0.0.1', :port => 6379))

命名空间可以随意,但最好在每个项目中命名不同,可以使用Rails应用名称或环境名称。

用这个设置,以前提到的User#hoge的例子来说,

user = User.find(1)
user.hoge.value = 'bbb'
$ redis-cli
redis 127.0.0.1:6379> GET SampleApp:development:user:1:hoge
"bbb"

键名上有命名空间的样子如下。


每个项目都会有不同的名称,这样就不再需要担心模型名称或键名称了。

太好了太好了。

bannerAds