redis当成数据库使用,时间范围查询
场景:多设备连接服务器不停的向数据库写数据,并发量高,CPU高负载,可能会出现风险,凌晨设备连接数降低,CPU较低解决方案:白天高并发数据写入redis暂时保存,凌晨CPU低负载时进行定时写入数据库出现问题:平台部分模块需要查询实时数据,redis对于多条件查询支持不友好,需要查询数据字段和时间范围解决思路:redis中字段查询比较简单,redis中范围查询可以使用zset有序集合,将两者...
·
- 场景:多设备连接服务器不停的向数据库写数据,并发量高,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);//时间范围查询
更多推荐




所有评论(0)