开发者学堂课程【Redis 入门到精通(基础篇):数据类型-案例:微信接收消息顺序控制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/764/detail/13396
数据类型-案例:微信接收消息顺序控制
内容介绍
一、数据类型实践案例
二、Tips17
三、总结
一、数据类型实践案例
业务场景
使用微信的过程中,当微信接收消息后,会默认将最近接收的消息置顶,当多个好友及关注的订阅号同时发送消息时,该排序会不停的进行交替。同时还可以将重要的会话设置为置顶。
一旦用户离线后,再次打开微信时,消息该按照什么样的顺序显示?
接下来再看一个有关微信回话顺序管理的应用,在没有看消息的情况下,收到的消息如何展示排列,如何去实现,这就是我们要做的案例环境。我们想到的就是需要去排序,时间次序,可以考虑list,如何进行一个分析。
业务分析
我们进行一个模拟,我们的手机是100,屏幕闪烁意味着接收信息,每一个用户都有置顶信息,这个集合就是为了放置顶用户,我们给两个list,如果300发送消息,我们进行记录是置顶用户发的还是普通用户发的,首先与置顶的做一个比较,判断是否为置顶消息,然后就放在普通消息里面,然后400发送消息,判断是否是置顶用户,判断是,则放入置顶list里面,然后200发送消息,检查置顶,然后放入普通list,此时是一次消息,然后200再次发送消息,判断是否置顶,然后检查普通list是否存在200,然后如果存在就删掉再加入,可能认为是多余的,但是这是对未读消息的一次更新,如果是有之前发的,那么就会提到前面变成最新的消息,300发送消息,判断是否置顶,然后放入普通list,做一次检查,删掉之前的,然后重新进入,最新消息300就在最上面。
list 有一个从右边添加有顺序的特征,这个模型就是我们所见到的消息提醒,当300再次发送时,删除再重新添加,然后我们发现我们的用户界面上面,300到了最上面。
解决方案
●依赖list的数据具有顺序的特征对消息进行管理,将list结构作为栈使用
●对置顶与普通会话分别创建独立的list分别管理
●当某个list中接收到用户消息后,将消息发送方的id从list的一侧咖入list(此处设定左侧)
●多个相同id发出的消息反复入栈会出现问题,在入栈之前无论是否具有当前id对应的消息,先删除对应id
●推送消息时先推送置顶会话list,再推送普通会话list,推送完成的list清除所有数据
●消息的数量,也就是微信用户对话数量采用计数器的思想另行记录,伴随list操作同步更新
这次我们就是利用了list顺序的特征,按栈模型使用,队列也可以用作栈,只需要保证操作在一端就可以,建立了两个list分类管理,然后收到消息选择一侧加入,新消息删掉再重新加入,set模型可以过滤掉重复的,set没有顺序,无法使用set,那么使用发送消息的次数定义也是不可以的,发消息的多少不能决定消息的时间,但是如果按照消息最后一条的时间排列,这个是可以的,当推送消息时,置顶最上面,然后就是按时间排列的次序,这样列表清空,消息的顺序也就展示出来了,这个地方没有收到几条消息的记录,那么我们就需要列一个string或者hash,可以滚动自增的就可以实现,做滚动计数把list的同步计数加上就OK。
接下来进行实现,lrem 100 1 200,然后lpush 100 200,lrem 100 1 300,然后lpush 100 300,lrem 100 1 400,lpush 100 400,lrem 100 1 200,lpush 100 200,lrem 100 1 300, lpush 100 300,消息显示的顺序就是,lrange 100 0 -1,打印出来就是我们的顺序,如果要显示用户,发了几条消息,那么就要我们加一个滚动计数就可以了。
二、Tips17
●redis 应用于基于时间顺序的数据操作,而不关注具体时间
三、总结
最后进行一个总结,我们学了5种数据类型,分别对每一个数据类型基本操作和扩展操作进行了讲解,很多操作并不是仅仅讲的这一些,还有很多实用性不是很强的,相对操作没有这些实用,还有两个数据类型案例。