使用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中
-
- 在模型中包含的方法
- 与模型独立地使用的方法
在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这样预先限制用法是令人高兴的。