Netty实时接收数据放入缓存处理简单示例

因为硬件设备使用的udp协议,传输数据,客户端只顾着发数据,所以大部分操作都在我服务端进行操作,做到数据实时(定义为每秒客户端发送来一次数据)展示。


暂定方案为netty+redis+map


 netty这块我就不多赘述了,不懂得可以先看netty得基础或者简单得demo学习一下;在开启服务后配置handler,在handler中尽量能不做操作就不要做出任何操作,只负责解析报文和处理数据,收到得数据放入缓存中,再由拿到得缓存另外处理,存入数据库也好,页面展示也好,都通过缓存进行操作

handler代码如下:

        


    @Override
    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg){
        try{
            //获取接收到得内容
            ByteBuf content = msg.content();
            //对数据进行解码
            CCloudPacketParser decoder = new CCloudPacketParser();
            InputStream io = new ByteBufInputStream(content);
            CPacketDecoder parsePacket = decoder.parse(io);
            //数据是否为我方数据,不是则丢弃
            if (parsePacket != null) {
                //数据类型
                byte msg_type = parsePacket.getMsgType().getMsg_type();
                //判断数据类型
                if (msg_type == 4) {
                    ParsePacketUtil.parsePacket_4(parsePacket);
                } 
            }else {
                log.info("异常链接,传入异常IP地址为:" + msg.sender());
            }
        }catch (Exception e){
            log.info("读取数据异常");
            e.printStackTrace();
        }

    }

具体操作是在parsePacket_4里面,我使用的是RedisTemplate

 public static void parsePacket_4(CPacketDecoder packet){
        CBasePacket cBasePacket = packet.getMsgType();
        //设备ID
        String driverId = String.valueOf(cBasePacket.getElevator_id());
        //根据设备id获取数据
        Object deviceEntity = redisUtil.get(driverId);
        if (deviceEntity != null){
            //转为实体类
            JSONObject deviceJSONObject = JSONObject.parseObject(deviceEntity.toString());
            ElevatorDevice elevatorDevice = JSONObject.toJavaObject(deviceJSONObject, ElevatorDevice.class);
            //发现电动车进入
            Byte byte_49 = packet.get(49);
            String electricVehicleEntry = (byte_49 == 1) ? "触发发现电动车进入" : "解决发现电动车进入";
            //告警数据更新后得map
            Map faultMap = CacheUtil.resolveTheFault("electricVehicleEntry", electricVehicleEntry);
            //先获取redis中故障数据
            Map cacheFaultMap = redisUtil.hmget(faultRedisID);
            if (cacheFaultMap == null){
                redisUtil.hmset(faultRedisID,faultMap);
            }else {
                //用于获取两个map之间得所有得不同点,并返回MapDifference对象
                MapDifference difference = Maps.difference(faultMap, cacheFaultMap);
                //判断redis中得告警故障信息是否与当前故障缓存是否相同,数据发生变化则为false,无变化则为true
                boolean isEqual = difference.areEqual();
                //告警故障发生变化则进行更新redis,不变化则不操作
                if (!isEqual){
                    redisUtil.del(faultRedisID);
                    redisUtil.hmset(faultRedisID,faultMap);
                }
            }
        }
    }

map首先判断是否已存在该数据,并判断客户端传来的数据与map中的数据是否有变化,对比里昂个map是否有变化的方法使用

 //用于获取两个map之间得所有得不同点,并返回MapDifference对象
                MapDifference difference = Maps.difference(faultMap, cacheFaultMap);
                //判断redis中得告警故障信息是否与当前故障缓存是否相同,数据发生变化则为false,无变化则为true
                boolean isEqual = difference.areEqual();

map数据出现变化之后放入redis中,之后拿到redis进行操作即可。

你可能感兴趣的:(Netty,redis,数据库,缓存)