使用Redis-Objects来实现通知功能

為了創建類似於 Facebook 上的通知功能,
我使用 redis 進行實現,這是我的筆記。
希望能對創建通知功能以及使用 redis-objects 有所幫助。
請注意,這不是關於推送功能的實現。
更詳細的 API 使用方法請參見 Github。

环境

    • Ruby 2.0.0

 

    • Ruby on Rails 4.0.2

 

    • Redis 2.8.9

 

    • redis(gem) 3.0.7

 

    redis-objects 0.9.1

必须满足的条件。

首先,我会确认需求作为前提。

    • 未読お知らせ件数は日をまたいだ全てのものをカウント

 

    お知らせの内容、未読既読は日毎に管理

安装 Redis-objects

请在bundle install之后添加以下行:

gem 'redis-objects'

Redis-objects的使用方法

在redis-objects中

    1. 在模型中包含的方法

 

    与模型独立地使用的方法

在Github上有两种选择。

在第一个模型中包含的方式是这样的。

モデル名:id:フィールド名

Redis的key是以这种形式创建的。

在2中,您可以创建独特格式的密钥。

实施

我将总结未读通知数量以及未读已读管理的实施方法。

未阅读通知数量的计数

使用将方法包含在模型1中。


class User < ActiveRecord::Base

  include Redis::Objects

  counter :notice_counter

end

当你包含 Redis::Objects 时,DSL 将被添加。
通过 counter 定义的键将使用 Redis 的 String 类型来保存整数值的数据。
在上述例子中,将创建一个名为 usernotice_counter 的 String 类型键。


@user = User.find(1)
@user.notice_counter.incr # お知らせに追加があったとき
@user.notice_counter.decr # お知らせがpopされたとき
@user.notice_counter.reset # すべてのお知らせを消去したとき

每天的未读已读管理

使用两种独立的方法。

因为可以自定义定义键

user:id:notice:date(yymmdd)

我們將以這種形式進行創建。我們將使用列表作為數據類型。我們將以模型名稱:id的形式保存將要添加到此鍵的值。例如) comment:10


class User < ActiveRecord::Base

  def push_notice(object, date)
    l = Redis::List.new(notice_key(date))
    l << "#{object.class.to_s.underscore}:#{object.id}"
    notice_counter.incr
  end

  def pop_notice(date)
    l = Redis::List.new(notice_key(date))
    res = l.pop
    notice_counter.decr unless res
    res
  end

  private
  def notice_key(date)
    "user:#{self.id}:notice:#{date.strftime('%y%m%d')}"
  end
end

现在可以通过此,对每日通知的未读和已读进行管理。

总结

我总结了以下内容。

    • redis-objectsのインストール方法

 

    • redis-objectsの使い方2通り

 

    お知らせ機能の実装

Redis很容易理解和使用,感觉很好。
这是适用于KVS(键值存储)的一般情况,如果不正确设计键,会导致难以管理,因此像redis-objects这样预先限制用法是令人高兴的。

bannerAds