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

本文介绍了一种使用SSM框架、Redis及AJAX轮询技术实现的简易聊天室方案,特别针对需要兼容IE8浏览器的应用场景。通过前端轮询获取最新消息,并利用Redis高效处理并发读写。

项目主要采用的技术有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;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值