используя Redis и Ruby, чтобы реализовать крошечное приложение с коротким URL - PullRequest
2 голосов
/ 10 марта 2012

Я создаю приложение для коротких URL, используя Ruby, Sinatra и Redis.В настоящее время он содержит менее 15 строк:

<code>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}
"#haml: shortten end get '/ get /: url' do redirect REDIS.get (params [: url]) end

Где index.haml - это форма, которая POST s long до /shorten. У меня нет проблем с этим.

Однако сейчас, когда я пытаюсь использовать Redis (с работающим сервером, да), Я получаю эту ошибку: RuntimeError

Что я делаю не так?

РЕДАКТИРОВАТЬ: Копировать / вставить из Emacs ... facepalm

РЕДАКТИРОВАТЬ: Когда я пытаюсь получить доступ к Redis один от ruby ​​(код ниже), я получаю это:

/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 Ответ

3 голосов
/ 11 марта 2012

В Ruby чувствительна к регистру, я бы попытался заменить REDIS.SET на REDIS.set и REDIS.GET на REDIS.get. Вы можете найти документацию по клиенту Redis здесь:

https://github.com/ezmobius/redis-rb

Я протестировал ваш пример с ruby ​​1.8.7. (по умолчанию на моей коробке Linux). После установки гемов sinatra, haml, redis и hiredis я изменил код следующим образом:

<code>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}
» конец get '/ get /: url' do перенаправить REDIS.get (params [: url]) конец

Я добавил следующий шаблон в 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 ​​и попытаться получить доступ к Redis из ruby ​​с помощью простого сценария не sinatra.

UPDATE:

Сообщение об ошибке является своеобразным, потому что обычно, когда неизвестная команда отправляется на сервер, предоставляется неисправная команда:

ERR unknown command 'dummy'

пока у вас просто есть:

ERR unknown command

На самом деле это конкретное исправление было представлено на сервере Redis более 2 лет назад (в декабре 2009 года) - вечность для Redis.

https://github.com/antirez/redis/commit/2c14807b2dd5c15f1471bec32a7c6dbb077720ee

Другими словами, вы пытаетесь использовать очень старую (т.е. до 1-3) версию сервера Redis с последней версией клиента Redis ruby ​​gem, который, вероятно, больше не поддерживает первоначальный протокол. Возможно, вы захотите скомпилировать и установить последнюю версию сервера Redis (это легко), она должна работать лучше.

...