Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 每个Rails应用程序一台Redis服务器?_Ruby On Rails_Redis - Fatal编程技术网

Ruby on rails 每个Rails应用程序一台Redis服务器?

Ruby on rails 每个Rails应用程序一台Redis服务器?,ruby-on-rails,redis,Ruby On Rails,Redis,我的服务器上有一堆rails应用程序,应该能够使用Redis作为缓存引擎 我是否必须为我的每个应用程序启动一个Redis实例,或者Redis是否支持作用域 我担心如果我在一个应用程序中删除一个值,那么我所有的应用程序都会删除具有相同密钥的值 例如,我不希望发生这种情况 应用程序1 Rails.cache.write(“键”、“值”) 应用程序2 Rails.cache.read(“key”)=>“value” 应用程序3 Rails.cache.delete(“key”) 应用程序1 Rails

我的服务器上有一堆rails应用程序,应该能够使用Redis作为缓存引擎

我是否必须为我的每个应用程序启动一个Redis实例,或者Redis是否支持作用域

我担心如果我在一个应用程序中删除一个值,那么我所有的应用程序都会删除具有相同密钥的值

例如,我不希望发生这种情况

应用程序1
Rails.cache.write(“键”、“值”)

应用程序2
Rails.cache.read(“key”)=>“value”

应用程序3
Rails.cache.delete(“key”)

应用程序1

Rails.cache.read(“key”)=>nil
实现这一点的常用方法有两种:

  • 用某种类型的“类型”标识符作为键的前缀,如
    app1:key
    app2:key
  • 对于每种使用,使用单独的DBs。默认情况下,连接从DB 0开始。如果对app1执行
    SELECT 1
    ,对app2执行
    SELECT 2
    等操作,则可以保证没有其他应用程序会破坏该数据

    • 我建议为每个应用程序运行一个服务器。每一个额外的Redis实例在清空时只会多使用1兆字节的内存,因此开销很小,在一个实例中运行数十台服务器是可以的。另外,空闲的Redis服务器将使用最小的内存量

      因此,运行多台服务器基本上不会浪费资源,而是提高速度,因为您将使用所有CPU或CPU核心,因为Redis是单线程的。

      解决方案是使用名称空间参数

      这是我的
      config/production.rb
      文件

      # App 1
      config.cache_store = :redis_store, {path: "/tmp/redis.sock", db:1, namespace: "app1"}
      
      # App 2
      config.cache_store = :redis_store, {path: "/tmp/redis.sock", db:2, namespace: "app2"}
      

      用你的应用程序名或其他东西作为查找的前缀怎么样?事实上,Redis开发人员最近建议我不要使用单独的db,因为它更多的是为了向后兼容,并且没有理由不运行多个instance.Awesome。谢谢你的信息!但是为什么不运行多个实例呢?现在,如果应用程序2正在访问Redis,应用程序1将被阻止。。。