【问题标题】:Rails and RedisRails 和 Redis
【发布时间】:2014-07-03 19:45:05
【问题描述】:

在我的控制台上启动我的 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_roster_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 MONITOR 并且一切都“运行良好”,但是我遇到了以下问题,当用户将他的状态更改为 ONLINE 时,我在 MONITOR 上看到了这个:

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"

如果用户更改为 BUSY,我看到了这个:

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"

但是当我使用 redisdesktopmanager 检查我的 redis 数据库时,我没有看到任何新记录,但是如果我尝试使用 redis-cli 手动创建记录,则记录创建成功,可能是什么问题,在这里????

【问题讨论】:

  • “不起作用”是什么意思?
  • 它必须向我显示在线状态的用户,但它不起作用。

标签: ruby-on-rails ruby redis


【解决方案1】:

缩小问题范围的一种方法是使用 redis-cli 工具连接到 Redis 服务器(它似乎正在连接到系统上的 Redis 实例,m 脚本在其上运行,并发出命令 @987654321 @ 在生成的 CLI shell 中。

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

编辑更新信息

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

例如,“busy”上的[EXPIRE][1] 告诉Redis 在修改“busy”三秒后忽略它。我不确定那是你想要的。 "Busy:..." 的过期时间也告诉 Redis 在两秒后忽略该键。

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

如果可能,您还应该考虑尝试替换 keys 命令,因为如果您的密钥空间变大,这可能会降低性能。

【讨论】:

  • 谢谢@The Real Bill,我更新了我的问题,在按照您的建议使用 redis-cli MONITOR 后,请您检查一下。谢谢
  • 好吧,我们每 2 秒检查一次以更新我们的用户列表,但是,问题是它在我的本地机器上不起作用,但在生产中效果很好,我不明白为什么
  • 在您的本地计算机上针对本地数据库,您可能看不到相同级别的流量。除非您有某些东西不断将过期时间更新到未来,否则您将看不到它们,因为它们“不存在”。要自己确认这一点,请在本地代码上将超时时间提高到 30 秒或更长。然后您应该会看到您正在寻找的结果。
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2018-02-01
  • 2013-07-06
  • 2019-03-03
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多