Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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_Ruby_Redis - Fatal编程技术网

Ruby on rails Rails和Redis

Ruby on rails Rails和Redis,ruby-on-rails,ruby,redis,Ruby On Rails,Ruby,Redis,在我的控制台上使用以下命令启动我的redis服务器后: redis-server 我执行以下ruby脚本,如下所示: script/user/generate_roster_kids.rb start 但它不起作用,我得到: generate_roster_kids] Pid not found, process seems doesn't exist! [generate_roster_kids] Process daemonized with pid 1110 with thread a

在我的控制台上使用以下命令启动我的redis服务器后:

redis-server
我执行以下ruby脚本,如下所示:

script/user/generate_roster_kids.rb start
但它不起作用,我得到:

generate_roster_kids] Pid not found, process seems doesn't exist!
[generate_roster_kids] Process daemonized with pid 1110 with thread and Forever v.0.3.2
如果我再次执行相同的命令,我会得到以下结果:

generate_roster_kids] Found pid 1110...
[generate_roster_kids] Waiting the daemon's death . DONE
[generate_roster_kids] Process daemonized with pid 1385 with thread and Forever v.0.3.2
但它不起作用,我做错了什么

这是generate_花名册_kids.rb文件的内容:

#!/usr/bin/ruby
require 'rubygems' unless defined?(Gem)
require 'forever'
require 'redis'

Forever.run do
  REDIS = Redis.new()
  #
  # dir  "foo"     # Default: File.expand_path('../../', __FILE__)
  # file "bar"     # Default: __FILE__
  log  "bar.log" # Default: File.expand_path(dir, '/log/[file_name].log')
  # pid  "bar.pid" # Default: File.expand_path(dir, '/tmp/[file_name].pid')

  every 2.seconds do
    # REDIS.DEL :busy

    # begin
    #   REDIS.SUNIONSTORE :busy, REDIS.keys('Busy:*') 
    # rescue 
    #   REDIS.SUNIONSTORE :busy, nil
    # end

    REDIS.SUNIONSTORE :busy, REDIS.keys('Busy:*') rescue REDIS.SUNIONSTORE :busy, nil
    REDIS.EXPIRE :busy, 3

    # online = REDIS.SUNION :online, REDIS.keys('Online:*')
    # diff = REDIS.SDIFF online, :busy

    # REDIS.SDIFFSTORE :online, (REDIS.SUNION :online, REDIS.keys('Online:*')), :busy
    # REDIS.DEL :online

    # begin
    #   REDIS.SUNIONSTORE :online, REDIS.keys('Online:*') 
    # rescue 
    #   REDIS.SUNIONSTORE :online, nil
    # end

    REDIS.SUNIONSTORE :online, REDIS.keys('Online:*') rescue REDIS.SUNIONSTORE :online, nil
    REDIS.EXPIRE :online, 3
  end

end
这段代码是由较老的开发人员编写的,但是他已经不可用了,我需要在我的本地机器上完成这项工作

提前谢谢

更新


我检查了我的redis cli监视器,一切都“正常”,但我有以下问题,当用户将其状态更改为联机时,我在监视器上看到:

1400661418.908947 [0 127.0.0.1:57453] "DEL" "Busy:537c63ea20db9040d2000332"
1400661418.909909 [0 127.0.0.1:57453] "SREM" "busy" "537c63ea20db9040d2000332"
1400661418.910687 [0 127.0.0.1:57453] "sadd" "Online:537c63ea20db9040d2000332" "537c63ea20db9040d2000332"
1400661418.911705 [0 127.0.0.1:57453] "expire" "Online:537c63ea20db9040d2000332" "2"
1400661419.436520 [0 127.0.0.1:62027] "keys" "Busy:*"
1400661419.437205 [0 127.0.0.1:62027] "SUNIONSTORE" "busy" ""
1400661419.437489 [0 127.0.0.1:62027] "EXPIRE" "busy" "3"
1400661419.437757 [0 127.0.0.1:62027] "keys" "Online:*"
1400661419.438070 [0 127.0.0.1:62027] "SUNIONSTORE" "online" "Online:537c63ea20db9040d2000332"
如果用户更改为忙碌,我会看到:

400661508.795043 [0 127.0.0.1:57453] "DEL" "Online:537c63ea20db9040d2000332"
1400661508.796853 [0 127.0.0.1:57453] "SREM" "online" "537c63ea20db9040d2000332"
1400661508.798088 [0 127.0.0.1:57453] "sadd" "Busy:537c63ea20db9040d2000332" "537c63ea20db9040d2000332"
1400661508.799496 [0 127.0.0.1:57453] "expire" "Busy:537c63ea20db9040d2000332" "2"
1400661509.157067 [0 127.0.0.1:62027] "keys" "Busy:*"
1400661509.157751 [0 127.0.0.1:62027] "SUNIONSTORE" "busy" "Busy:537c63ea20db9040d2000332"

但是,当我使用检查我的redis数据库时,我看不到任何新记录,但是如果我尝试使用redis cli手动创建记录,记录创建成功,可能会出现什么问题,这里???缩小问题的一种方法是使用redis cli工具连接到redis服务器(它似乎正在连接到系统上的Redis实例,运行脚本,并在生成的CLI shell中发出命令
MONITOR

然后运行脚本并观察命令是否进入。当然,您还需要确保运行脚本的系统上运行的Redis副本中包含所需的数据。或者,您需要更改Redis connect命令以连接到数据所在的远程计算机

编辑更新信息

因此,代码将密钥设置为过期2-3秒。这是一个非常短的超时。很可能在您查找记录时记录已过期

例如,“busy”上的
[EXPIRE][1]
告诉Redis在修改“busy”三秒钟后忽略它。我不确定这是您想要的。在“busy:…”上的EXPIRE也告诉Redis在两秒钟后忽略该键

我建议将expire的值更改为更长的值,以便按照您希望的方式进行验证。您将知道2-3秒是否为“正确”您使用的过期时间比我的好,但我怀疑它需要更长。如果您希望在2秒后使用户会话过期,并使所有繁忙会话集如此快速地过期是正确的,那么监视命令将是您验证命令发送的方式,而不是查找可能在您可以使用时过期的密钥nd命令以检索它们


如果可能的话,你也应该考虑尝试替换<代码>键< /C>命令,因为如果你的密钥空间变大,这可能会降低性能。

你所说的“不起作用”是什么意思。?它必须向我显示具有联机状态的用户,但它不起作用。谢谢@the Real Bill,在按照您的建议使用redis cli监视器后,我更新了我的问题,请您检查一下。谢谢,我们每2秒钟检查一次,以更新用户列表,但问题是它在我的本地计算机上不起作用,而是在生产中工作得很好,我不明白为什么本地机器与本地数据库相比,你可能看不到相同级别的流量。除非你有什么东西不断更新过期时间到未来,否则你不会看到它们,因为它们“不存在”。若要自行确认,请将本地代码的超时时间提高到30秒或更高。然后,您应该会看到正在查找的结果。