Redis
 sql >> база данни >  >> NoSQL >> Redis

Как да използвате ActionController::На живо заедно с Resque + Redis (за приложение за чат)

Предварителни изисквания:

  • Ruby 2.0.0+
  • Rails 4.0.0+
  • Redis
  • Пума

Инициализатор:

Създайте redis.rb инициализатор файл в config/initializers директория, глобализирайки екземпляр на redis . Също така е добра идея да настроите heartbeat нишка (Всичко от 5 секунди до 5 минути е добре, в зависимост от вашите изисквания):

$redis = Redis.new

heartbeat_thread = Thread.new do
  while true
    $redis.publish("heartbeat","thump")
    sleep 15.seconds
  end
end

at_exit do
  heartbeat_thread.kill
  $redis.quit
end

Контролер:

Трябва да добавите два метода към вашия ChatController , pub и sub . Ролята на pub е да публикува чат събития и съобщения в redis и sub да се абонирате за тези събития. Трябва да изглежда така:

class ChatController < ApplicationController
    include ActionController::Live

    skip_before_filter  :verify_authenticity_token

    def index
    end

    def pub
        $redis.publish 'chat_event', params[:chat_data].to_json
        render json: {}, status: 200
    end

    def sub
        response.headers["Content-Type"] = "text/event-stream"

        redis = Redis.new
        redis.subscribe(['chat_event', 'heartbeat']) do |on|
            on.message do |event, data|
                response.stream.write "event: #{event}\ndata: #{data}\n\n"
            end
        end
    rescue IOError
        logger.info "Stream Closed"
    ensure
        redis.quit
        response.stream.close
    end
end

Във вашите routes , направикръчма a POST ипод a GET и съпоставете пътя с нещо като /chat/publish и /chat/subscribe .

Coffeescript / Javascript:

Ако приемем, че действителната ви уеб страница за приложението за чат е в /chat , трябва да напишете някакъв Javascript за действително изпращане и получаване на чат съобщения.

За по-лесно разбиране, нека предположим, че вашата уеб страница има само текстово поле и бутон. Натискането на бутона трябва да публикува съдържанието на текстовото поле в потока за чат, можем да направим това с AJAX:

$('button#send').click (e) ->
    e.preventDefault()
    $.ajax '/chat/publish',
        type: 'POST'
        data:
            chat_data: {
                message: $("input#message").val()
                timestamp: $.now()
        error: (jqXHR, textStatus, errorThrown) ->
            console.log "Failed: " + textStatus 
        success: (data, textStatus, jqXHR) ->
            console.log "Success: " + textStatus

Сега трябва да можете да се абонирате и да получавате съобщенията в чата. Трябва да използвате EventSource за това. Използване на EventSource , отворете канал за SSE, за да можете да получавате събития и да използвате тези данни, за да актуализирате изгледа. В този пример ще ги регистрираме само в конзолата на javascript.

Кодът трябва да изглежда така:

$(document).ready ->
    source = new EventSource('/chat/subscribe')
    source.addEventListener 'chat_event', (e) ->
        console.log(e.data)

Забележка: Поставете и двата кодови блока по-горе във вашия controllername.coffee файл, за този пример трябва да бъде chat.js.coffee във вашето app/assets/javascript директория. Трябва също така да се уверите, че се зарежда в конвейера за активи. require го във вашия application.js файл (ако вече не се обаждате на require tree . ).

Активиране на паралелни заявки:

Във вашата среда за разработка ще трябва да активирате паралелни заявки, като добавите тези два реда към вашия config/environments/development.rb :

config.preload_frameworks = true
config.allow_concurrency = true

Сега стартирайте браузъра си, потърсете /chat и вижте магията. Когато въведете съобщение и щракнете върху бутона, съобщението ще бъде получено от всички екземпляри на тази уеб страница.

Ето как се прави основно приложение за чат в rails използвайки ActionController::Live и Redis . Окончателният код очевидно би бил много различен в зависимост от вашите изисквания, но това трябва да ви помогне да започнете.

Още някои ресурси, които трябва да проверите:

  • Нежно правене на любов – на живо ли е?
  • Railscasts - #401 - ActionController::Live
  • SitePoint – Мини чат с Rails и SSEs
  • Github - mohanraj-ramanujam / поточно предаване на живо
  • Thoughtbot – Пример за чат с използване на SSE



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Пробиване на взаимодействията на Redis в javascript с помощта на Sinon

  2. Redis cluster failover:slave няма да стане главен

  3. Взаимодействие на Python Redis

  4. Как да използвам повторно Redis връзка в socket.io?

  5. Грешка при интегриране на Redis към JHipster CacheConfiguration