我想通过rails.cache(memory_store(在线维护用户/离线列表。
基本上,如果请求/user/heartbeat?name=John
到达Rails Server,它将仅:
def update_status
name = params.require(:name)
Rails.cache.write(name, Time.now.utc.iso8601, expires_in: 6.seconds)
end
但是,我如何将所有数据存储在railss.cache中。
类似?def get_status
# wrong codes, as Rails.cache.read doesn't have :all option.
ary = Rails.cache.read(:all)
# deal with array ...
end
我搜索了一段时间,似乎Rails.cache没有提供直接获取所有数据的方法。还是有更好的方法来存储数据?
我正在使用Rails 5.0.2
。
感谢您的时间!
您可以使用代码获取所有键:
keys = Rails.cache.instance_variable_get(:@data).keys
如果您有redis,则可以使用 Rails.cache.redis.keys
如果您使用redis,似乎没有任何答案可以工作。相反,您必须使用redis-rb:
redis = Redis.new(url: ENV["REDIS_URL"])
redis.keys("*")
此外,您可以在钥匙上迭代以获取其值并显示全部
keys = Rails.cache.instance_variable_get(:@data).keys
keys.each{|key| puts "key: #{key}, value: #{Rails.cache.fetch(key)}"}
或直接映射它们:
key_values = Rails.cache.instance_variable_get(:@data).keys.map{|key| {key: key, value: Rails.cache.fetch(key)}}
此外,我会事先检查键的量,以确保我不会提出巨大的对象(如果是这样,则将生成的键_Value数组限制为前一个1000个项目(。您可以使用:
Rails.cache.instance_variable_get(:@data).keys.count
或只是查看stats命令的最后一行:
Rails.cache.stats
上述答案对我有帮助。可以通过循环
可以看到现有的缓存值 Rails.cache.redis.keys.each{ |k| puts k if Rails.cache.exist?(k)}
如果您有连接池,请尝试:
Rails.cache.redis.with do |conn|
conn.keys
end