使用redis和ruby实现一个小的短网址应用程序

时间:2012-03-10 18:51:58

标签: ruby sinatra redis runtime-error

我正在使用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.hamlPOST s long/shorten的表单。我没问题。

但是,现在,当我尝试使用Redis(运行服务器,是)时,我收到此错误: RuntimeError

我做错了什么?

编辑:从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")

1 个答案:

答案 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服务器(这很简单),它应该可以更好地工作。