你的问题是如何在Redis中保存消息。针对你的需求,要能有推送列表,同时还需要保存未读已读状态。
我的方案是分开,将推送消息列表和消息列表分开,即每个用户保存一个需要推送的消息列表,以及一个该用户的历史消息列表。
对于消息推送列表无需保存任何状态,推送过去后就从列表移除,不管用户是否读取,在推送下发的同时将该消息添加到用户的历史消息列表,这里可以保存消息的读取状态。
历史消息列表不建议使用队列,建议分两个数据结构保存,由于消息列表显示是根据时间序,所以可以使用redis的有序列表,得分为时间戳,使用这个有序列表保存用户的消息列表(仅保存ID,方便查询分页),然后消息的具体信息,如内容、读取状态、时间、发送人等保存到一个hash结构中,key就是消息ID。
欢迎指正
写长连接服务常用的还是socket.io 提供了方便的api去管理连接,并且并发处理的也比较好,不论点对点推送还是群推。SF的消息推送用的就是这个=W=。推送消息或接受客户端消息流量大的话可以搭一个Redis的消息队列,将socket服务和其他后端模块打通。
http://socket.io/
欢迎参考NoNOIM