【发布时间】:2014-03-11 19:43:54
【问题描述】:
我正在使用 ejabberd 作为服务器和 Redis 作为用于存储聊天消息的数据库的 android 聊天应用程序。我想使用 erlang 客户端在 Redis 中存储对话的消息、From、To 和一些字段。我研究了 redis。列表数据类型最好存储聊天消息。但是我找不到任何使用列表实现的示例。有没有将聊天消息存储在列表中的示例。或者告诉我是否还有其他替代方法可以在 Redis 中存储聊天消息?
【问题讨论】:
我正在使用 ejabberd 作为服务器和 Redis 作为用于存储聊天消息的数据库的 android 聊天应用程序。我想使用 erlang 客户端在 Redis 中存储对话的消息、From、To 和一些字段。我研究了 redis。列表数据类型最好存储聊天消息。但是我找不到任何使用列表实现的示例。有没有将聊天消息存储在列表中的示例。或者告诉我是否还有其他替代方法可以在 Redis 中存储聊天消息?
【问题讨论】:
好吧,您可以将 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 您可以轻松获取对话。
【讨论】:
在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) 阅读这些 UUID。
【讨论】: