兼容ie6,7,8 的 ssm+redis的简单聊天室搭建

来源:互联网 发布:淘宝购物车怎么扩容 编辑:程序博客网 时间:2024/06/13 11:11

项目主要采用的技术有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;        }    }
原创粉丝点击