我正在使用Ruby,Sinatra和Redis创建一个简短的URL应用程序。目前它不到15行:
require 'rubygems'
require 'sinatra'
require 'redis'
require 'uri'
configure do
REDISTOGO_URL = "redis://localhost:6379/"
uri = URI.parse(REDISTOGO_URL)
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end
get '/' do
haml :index
end
post '/shorten' do
a = rand(9999)
REDIS.set(a.to_s, params[:long])
"<pre>http://199.19.118.186/get/#{a}</pre>"
#haml :shorten
end
get '/get/:url' do
redirect REDIS.get(params[:url])
end
其中index.haml
是POST
s long
到/shorten
的表单。我没问题。
但是,现在,当我尝试使用Redis(运行服务器,是)时,我收到此错误:
我做错了什么?
编辑:从Emacs复制/粘贴... facepalm
编辑:当尝试从ruby单独访问redis时(下面的代码),我得到了这个:
/var/lib/gems/1.8/gems/redis-2.2.2/lib/redis/client.rb:47:in `call': ERR unknown command (RuntimeError)
from /var/lib/gems/1.8/gems/redis-2.2.2/lib/redis.rb:841:in `set'
from /usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /var/lib/gems/1.8/gems/redis-2.2.2/lib/redis.rb:840:in `set'
from test_redis.rb:9
使用此代码:
require 'rubygems'
require 'redis'
require 'uri'
REDISTOGO_URL = "redis://localhost:6379/"
uri = URI.parse(REDISTOGO_URL)
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
REDIS.set("test", "blah")
puts REDIS.get("test")
答案 0 :(得分:3)
Ruby区分大小写,我会尝试用REDIS.set替换REDIS.set和REDIS.GET的REDIS.ET。您可以在此处找到Redis客户端的文档:
https://github.com/ezmobius/redis-rb
我用ruby 1.8.7测试了你的例子。 (默认在我的Linux机器上)。 在安装了sinatra,haml,redis和hiredis gem之后,我修改了代码如下:
require 'rubygems'
require 'sinatra'
require 'redis'
require 'uri'
configure do
REDISTOGO_URL = "redis://localhost:6379/"
uri = URI.parse(REDISTOGO_URL)
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end
get '/' do
"Hello"
haml :index
end
post '/shorten' do
a = rand(9999)
REDIS.set(a.to_s, "http://"+params[:long])
"<pre>http://localhost:4567/get/#{a}</pre>"
end
get '/get/:url' do
redirect REDIS.get(params[:url])
end
我在views / index.haml中添加了以下模板。
!!!
%html
%head
%title My Sinatra Website
%body
%h1 Welcome
%p
Welcome to my website made with Sinatra and HAML
%form{ :action => "/shorten", :method=>"POST" }
%fieldset
%input{ :type =>"text", :name=>"long" }
%input{ :type =>"submit" }
一旦Redis在端口6379上启动,而sinatra在端口4567上启动,它就像一个魅力。 我建议你查看你的ruby安装,并尝试使用简单的非sinatra脚本从ruby访问Redis。
<强>更新强>
错误消息很奇怪,因为通常情况下,当向服务器发送未知命令时,会提供错误命令:
ERR unknown command 'dummy'
当你刚才:
ERR unknown command
实际上,这个特定的修复程序是在2年多之前(2009年12月)在Redis服务器中引入的 - Redis的永恒。
https://github.com/antirez/redis/commit/2c14807b2dd5c15f1471bec32a7c6dbb077720ee
换句话说,您正在尝试使用Redis服务器的最旧版本(即前1-3版)与最新版本的Redis客户端ruby gem,这可能不再支持初始协议。您可能希望编译并安装最新版本的Redis服务器(这很简单),它应该可以更好地工作。