Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Cách sử dụng ActionController ::Live cùng với Resque + Redis (dành cho ứng dụng Trò chuyện)

Yêu cầu trước:

  • Ruby 2.0.0+
  • Đường ray 4.0.0+
  • Redis
  • Puma

Bộ khởi tạo:

Tạo redis.rb tệp khởi tạo trong config/initializers thư mục, toàn cầu hóa một phiên bản của redis . Bạn cũng nên thiết lập heartbeat thread (Thời gian từ 5 giây đến 5 phút đều được, tùy theo yêu cầu của bạn):

$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

Bộ điều khiển:

Bạn cần thêm hai phương thức vào ChatController của mình , pubsub . Vai trò của pub là xuất bản các sự kiện và tin nhắn trò chuyện lên redissub để đăng ký các sự kiện này. Nó sẽ trông giống như sau:

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

Trong routes của bạn , làm cho quán rượu một POST phụ a GET và khớp với đường dẫn đến một cái gì đó như /chat/publish/chat/subscribe .

Coffeescript / Javascript:

Giả sử trang web thực của bạn cho ứng dụng trò chuyện là tại /chat , bạn cần viết một số Javascript để thực sự gửi và nhận tin nhắn trò chuyện.

Để dễ hiểu, giả sử trang web của bạn chỉ có một hộp văn bản và một nút. Nhấn vào nút sẽ xuất bản nội dung của hộp văn bản lên luồng trò chuyện, chúng tôi có thể làm điều đó bằng cách sử dụng 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

Bây giờ, bạn cũng cần có thể đăng ký và nhận tin nhắn trò chuyện. Bạn cần sử dụng EventSource cho điều này. Sử dụng EventSource , mở một kênh cho SSE để bạn có thể nhận các sự kiện và sử dụng dữ liệu đó để cập nhật chế độ xem. Trong ví dụ này, chúng tôi sẽ chỉ đăng nhập chúng vào bảng điều khiển javascript.

Mã sẽ trông giống như sau:

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

Lưu ý: Đặt cả hai khối mã ở trên vào controllername.coffee của bạn , đối với ví dụ này, nó phải là chat.js.coffee trong app/assets/javascript của bạn danh mục. Bạn cũng cần đảm bảo rằng nó đang được tải trong đường dẫn nội dung. require nó trong application.js của bạn tệp (nếu bạn chưa gọi require tree . ).

Bật yêu cầu song song:

Trong môi trường phát triển của mình, bạn sẽ phải kích hoạt các yêu cầu song song bằng cách thêm hai dòng này vào config/environments/development.rb của mình :

config.preload_frameworks = true
config.allow_concurrency = true

Bây giờ hãy khởi động trình duyệt của bạn, duyệt tới /chat và xem điều kỳ diệu. Khi bạn nhập tin nhắn và nhấp vào nút, tất cả các phiên bản của trang web đó sẽ nhận được tin nhắn đó.

Đây là cách bạn tạo một ứng dụng trò chuyện cơ bản trong rails sử dụng ActionController::LiveRedis . Mã cuối cùng rõ ràng sẽ rất khác nhau tùy thuộc vào yêu cầu của bạn nhưng điều này sẽ giúp bạn bắt đầu.

Một số tài nguyên khác mà bạn nên xem:

  • Làm tình dịu dàng - Có trực tiếp không?
  • Railscast - # 401 - ActionController ::Trực tiếp
  • SitePoint - Trò chuyện nhỏ với Rails và SSE
  • Github - mohanraj-ramanujam / live-stream
  • Thoughtbot - Ví dụ về trò chuyện sử dụng SSE



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Duy trì kết nối Redis đang mở bằng BookSleeve

  2. Redis:Để đặt thời gian chờ cho một cặp giá trị khóa trong Đặt

  3. Redis Cache trong .NET Core 3 có yêu cầu sử dụng gói Stack Exchange không?

  4. Làm cách nào để xóa mọi thứ trong Redis?

  5. Sử dụng jedis cách ghi vào một vị trí / nút cụ thể trong cụm redis