2014-02-13 2 views
0

Я работаю в приложении для андроид-чата, используя ejabberd в качестве сервера, а Redis - как базу данных для хранения сообщений чата. Я хочу сохранить сообщение о разговоре, From, To и некоторые поля в Redis, используя erlang client.I изучил redis. Тип списка данных лучше всего хранить в сообщениях чата. Но я не смог найти какой-либо пример для реализации с использованием List.Is, там есть пример для хранения сообщений чата в списке. Или скажите, есть ли другая альтернатива для хранения сообщений чата в Redis?Как хранить сообщения чата в Redis с помощью клиента Erlang?

ответ

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 (Score), вы можете использовать метку времени, так с помощью ZRANGE вы можете получить разговор легко.

+0

Я использовал ваш ответ. Но небольшой недостаток: если я использую тот же самый член, что и предыдущий, присутствующий в ZSET, предыдущий будет заменен новым членом. обратитесь: http://redis.io/commands/ZADD –

+0

Я понимаю, что вы имеете в виду, поэтому в этом случае вы можете добавить timestamp с сообщением на каждый msg, будет считаться другим ... –

+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).

Смежные вопросы