2014-02-13 131 views
0

我在android聊天應用程序中使用ejabberd作爲服務器,Redis作爲存儲聊天消息的數據庫。我想使用erlang client存儲會話的消息,From,To和Redis中的一些字段。我研究了redis。列表數據類型將最適合存儲聊天消息。但我找不到任何使用List實現的示例。是否有任何示例將列表中的聊天消息存儲在列表中。或者告訴我在Redis中是否有其他備用存儲聊天消息?如何使用Erlang客戶端在Redis中存儲聊天消息?

回答

2

那麼,你可以存儲JSON到列表中,但是如果你有一個功能,當用戶可以刪除一條消息,那麼你將不得不在列表中找到確切位置,然後刪除它。如果我會一直在你的地方,我將其存儲到像ZSET: -

redis 127.0.0.1:6379> ZADD chat 1 "{from:me, msg: hello}" 
(integer) 1 
redis 127.0.0.1:6379> ZADD chat 2 "{from:you, msg: hello}" 
(integer) 1 
redis 127.0.0.1:6379> ZADD chat 3 "{from:me, msg: how are you}" 
(integer) 1 
redis 127.0.0.1:6379> ZADD chat 4 "{from:you, msg: good, how about you}" 
(integer) 1 
redis 127.0.0.1:6379> ZADD chat 5 "{from:you, msg: are you there}" 
(integer) 1 
redis 127.0.0.1:6379> ZADD chat 6 "{from:me, msg: yes i am}" 
(integer) 1 
redis 127.0.0.1:6379> ZRANGE chat 0 -1 
1) "{from:me, msg: hello}" 
2) "{from:you, msg: hello}" 
3) "{from:me, msg: how are you}" 
4) "{from:you, msg: good, how about you}" 
5) "{from:you, msg: are you there}" 
6) "{from:me, msg: yes i am}" 

,而不是1,2,3(得分),可以使用時間戳,以便使用ZRANGE您可以輕鬆地獲取了談話。

+0

我用你的答案。但是一個小缺點是,如果我使用與ZSET中的前一個成員相同的成員,則前一個成員將被新成員替換。參考:http://redis.io/commands/ZADD –

+0

我明白你的意思,所以在這種情況下,你可以添加時間戳與消息,每一個味精會被認爲是不同的... –

+1

感謝您的答覆。我會用它。 –

1

http://gitweb.tideland.biz你可以找到ERRC,我的Tideland Erlang/OTP Redis客戶端(ERRC)。除了源代碼之外,還有顯示使用情況的單元測試。

在你的具體任務,我將確定一個UUID每個消息(你會發現它在我的ERAS庫,也有),並使用哈希的消息:

HMSET msg::(UUID) timestamp ... from "foo" to "bar" text "Hello, World" ... 

這是一種事件採購。然後,爲了更好的導航,個人列出所有消息或發件人,收件人等:

LPUSH msgs::all (UUID) LPUSH msgs::from::foo (UUID) 
LPUSH msgs::to::bar (UUID) 

反演可以LRANGE key start stop完成。在這裏,您將獲得郵件的UUID,然後您可以使用HGETALL (UUID)閱讀這些郵件。

相關問題