• 场景:多设备连接服务器不停的向数据库写数据,并发量高,CPU高负载,可能会出现风险,凌晨设备连接数降低,CPU较低
  • 解决方案:白天高并发数据写入redis暂时保存,凌晨CPU低负载时进行定时写入数据库
  • 出现问题:平台部分模块需要查询实时数据,redis对于多条件查询支持不友好,需要查询数据字段和时间范围
  • 解决思路:redis中字段查询比较简单,redis中范围查询可以使用zset有序集合,将两者产生映射关系模拟成数据库功能
  • redis数据结构设计:设计一个设备表hash类型,设计一个数据表zset score为时间戳

redis表设计

hash表设计

在这里插入图片描述

  • hash作为主表,日志文件一般有许多同一设备上报数据,我们将设备id作为hash表的key,value中记录映射表的类型和设备id申城的唯一码作为映射表的key

zset表设计

在这里插入图片描述

  • zset表保存每个设备的上报信息,score保存时间戳,用于时间条件查询

查询过程:先根据设备id在hash表中查询到tableId,通过拿到的tableId去查询zset集合,再通过score即写入的时间戳进行范围查询,即完成通过一字段和时间范围进行筛选

如果只查询时间范围,那么只需要查询zset所在的redis的分区库,查询出所有的key,再循环进行根据时间查询数据保存。

虽然已经可以完成当成数据库的简单查询操作,但是很多操作还是不如数据库方便

每一个日志类型的集合数据最好放在redis中的一个分区,便于集合数据的直接查询

$redis->hGet('acclog','11G0140IA226655');//获取设备表信息
$redis->zRangeByScore('03be3b6e77bc13b37af345909053061c',1577808134,1577808357);//时间范围查询
Logo

一站式 AI 云服务平台

更多推荐