项目主要采用的技术有ssm+redis+ajax轮询,本来想用webSocket或者Socket的,但百度了一下,WebSocket不兼容ie8.我做的教育产品要兼容ie8,所以自己写了一个简单的聊天室,其中jedis怎么封装,怎么讲对象 字符串互转我就不说了,这里主要讲流程
redis对数据加减的处理效果还是很快的。所以对小聊天室来说 并发问题可以不用考虑
废话不多说,用代码来演示:
首先,前端用ajax发起轮询的代码:
一个是发起ajax轮询的function,一个是发送消息的function
> function getAjaxContent() {
> //----------------------获取ajax请求的jQuery方法
> $.ajax({
> url:'${ctx}/chat/getMsg',
> dataType:'json',
> contentType : "application/json;charset=UTF-8",
> data:{
> "teamChatId":"team-abcd123",
> "teamId":1
> },
> success:function (data) {
> console.log(data);
> //根据data更新页面
> $("#friendsList").empty();
> for(var d in data){
> var $li=$('<li><a href="#" onclick="setReceiver(this);">'+data[d].content+'</a></li>')
> $li.appendTo($("#friendsList"));
> }
> }
> })
> }
> function sendChat() { //----------------------点击发送时调用的方法,发送聊天信息(SpringMVC通过@RequestBody注释得到data内容)
> console.log($("#msg").val());
> $.ajax({
> url:'${ctx}/chat/sendChat',
> type:'post',
> data:{
> "teamChatId":"team-abcd123",
> "content" :$("#msg").val(),
> "senderId" : 1,
> "teamId" :1,
> "senderName" : "背锅侠",
> "senderIcon" : "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=73079245,360669800&fm=11&gp=0.jpg",
> }
> });
> }
我们先对每个聊天室定义一个标识符,叫teamChatId。那么发送消息时,后台根据这个唯一标识符到redis中拿到该聊天室的聊天数据
发送消息时,传需要封装的数据以及该聊天室的teamChatId到后台,然后后台将消息放进redis 中:
重要代码:
public void sendMsg(TeamChitchat teamChitchat){
teamChitchat.setChitchatId(UUID.randomUUID().toString());
teamChitchat.setCreateTime(new Date());
try {
//将更新后的数据封装回redis;
String data = MAPPER.writeValueAsString(teamChitchat);
chatRedisService.lpush(teamChatId, data);
//封装进数据库
teamChitchatMapper.insertSelective(teamChitchat);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("【redis查询小组聊天】格式转换失败:"+e.getMessage());
}
}
JedisAPI有一个lpush方法,可以将字符串push进队列中
然后,顺便存到数据库(这里如果你觉得对redis放心也可以存到redis中)
取得方法:
前台轮询时,发送teamChatId到后台,后台根据teamChatId这个key到redis中拿数据,如果拿不到,就到数据库中拿
public List<TeamChitchat> getTeamChat(Integer teamId,String teamChatId){
List<String> data = chatRedisService.lrange(teamChatId, 0, -1);
if(!CollectionUtils.isEmpty(data)){
return Strings2TeamChatConverter.converter(data);
}else{
TeamChitchat teamChitchat = new TeamChitchat();
teamChitchat.setTeamId(teamId);
List<TeamChitchat> chatList = teamChitchatMapper.select(teamChitchat);
for (TeamChitchat temp : chatList) {
try {
String returnData = MAPPER.writeValueAsString(temp);
chatRedisService.lpush(teamChatId, returnData);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
return chatList;
}
}
本文介绍了一种使用SSM框架、Redis及AJAX轮询技术实现的简易聊天室方案,特别针对需要兼容IE8浏览器的应用场景。通过前端轮询获取最新消息,并利用Redis高效处理并发读写。
1万+

被折叠的 条评论
为什么被折叠?



