https://github.com/lloydzhou/...
应用redis stream实现im
利用redis stream存储最近音讯
同时监听stream实现音讯实时推送
应用redis-module实现,以达到更好性能
能够间接从stream拿到音讯构建出最近聊天列表以及好友名单
前端应用indexedDB长久化音讯,能够增量同步音讯
redis key
u:<uid>
hash, 寄存用户信息,例如name/avatar等s:<uid>
stream, 这个队列用于接管/发送用户音讯c:<uid>
sorted set, 用于寄存用户联系人(包含群组)gm:<gid>
set, 用于寄存群用户idgs:<gid>
stream, 用于接管/发送群音讯gi:<gid>
hash, 寄存群信息,例如name,还有一些配置信息(例如加群是否须要验证?)
redis module
redis module实现IM
IM.RECIVE
IM.RECIVE [uid] BLOCK [ms] COUNT [count] START [start]
获取历史音讯,以及监听新的音讯
IM.MESSAGE
IM.RECIVE [GROUP | USER] [uid | gid] [mid]
获取单条音讯
IM.SEND
IM.SEND [uid] [tuid] [field value] [field value ... ]
发送单聊音讯
IM.GSEND
IM.GSEND [uid] [gid] [field value] [field value ... ]
发送群聊音讯
IM.USER
IM.USER [uid]
(get user info) 获取用户信息
IM.USER [uid] [field value] [field value ... ]
(create user or update user info)
IM.GROUP
IM.GROUP [gid]
(get group info)
IM.GROUP [gid] [uid] [field value] [field value ... ]
(create group or update group info)
IM.LINK
IM.LINK [uid] [tuid]
(add to user contact list)
IM.UNLINK
IM.UNLINK [uid] [tuid]
(remove from user contact list)
IM.JOIN
IM.LINK [uid] [gid]
(add to user group)
IM.QUIT
IM.QUIT [uid] [gid]
(remove from user group)
GUI
- using tornado WebSocketHandler to create websocket.
- using svelte create simple ui to send message (using localStorage to save message)
docker
docker run --rm --name=redisim -p 8888:8888 lloydzhou/redisim