記Redis在項目中一個類分時圖應用場景設計

需求: 項目有一個保存實時抓拍圖片的功能,須要統計攝像頭下每一個時間點(好比一分鐘)保存的圖片個數,並經過線型圖顯示到頁面上.
這很相似股票的分時K線圖的功能.因此我參考了一些網上的文章,採用 Redis來實現這個功能.

先交代一下項目裏數據的一個狀況:前端

  1. 攝像頭個數在150個左右,單個攝像頭每秒抓拍圖片數平均在5張左右,150個攝像頭一分鐘最大抓拍圖片量在200左右.
  2. 天天抓拍的圖片總數通常在60w-100w, 峯值不超過300w.
  3. 每張圖片的大小在8K左右.

需求分析:redis

  1. 能夠顯示某個攝像頭下每分鐘的抓拍圖片個數. (時間點:分鐘,數值:圖片個數)
  2. 顯示最近一天的分時圖. (分時圖的區間:24小時,一天的時間點個數60*24=1440)
  3. 緩存最近一天內的保存圖片信息,以最大300w條記錄算. (memory< 1K*3000000 約等於3GB, 實際狀況不到2G)

接下來重點說一下這裏的設計:數據庫

  1. 因爲每秒中的圖片數量不大,不用太考慮讀寫的壓力問題,因此我每接收到一張圖,則存入數據庫,再寫入redis當中.
  2. 存入redis的數據首先用到了redis中的自增操做, redis中分時數據的存儲格式爲hash結構,key爲count+ip,fieldyyyy-MM-dd HH:mm的分鐘時間點,value則爲圖片個數.好比192.168.0.1這個ip的攝像頭每抓拍到一張圖,則redis 操做命令爲 HINCRBY 'count:192.168.0.1' '2018-08-10 10:30' 1 . 固然,這裏會作一個定時任務,每分鐘都會初始化每一個攝像頭當前時間點抓拍圖片個數爲0,操做指令爲HSETNX 'count:192.168.0.1' '2018-08-10 10:30' 0,防止查詢時找不到對應時刻的數據.因爲hash是不支持直接傳入過時時間的,因此也須要在定時任務裏刪除掉24小時以前的數據:HDEL 'count:192.168.0.1' '2018-08-09 10:30'.
  3. 除了自增1操做外,還用到了zset結構,保存圖片信息數據. 這裏 zsetkeyinfo:+ip,value爲圖片信息的json數據,如圖片的地址,特徵id,id等,score則保存的時當前距計算機元年的秒數.之因此這樣設計是爲了方便從新統計和排序.
  4. 前端顯示數據,採用echart庫的Line,經過大量數據渲染線型圖.主要數據在兩個數組,x軸的時間點,y軸的圖片個數.兩個數組,時間點和個數一一對應.這也是第2步中要作定時任務初始化的緣由.
  5. 初次獲取攝像頭的時分圖統計的時候,首先會讀取hash結構中對應key的數據,裏面存儲了最近24小時的統計數據,經過new一個TreeMap能夠對時間進行排序,而後mao的key和value就是x,y軸所需的兩個數組.獲取完成後,每分鐘去輪詢一次查詢當前攝像頭,上一分鐘的數據,這樣能保證數據和時間點一致.
  6. 若是須要獲取最近抓拍的圖片地址信息等,則能夠經過zset結構裏的ZRANGEBYSCORE命令查詢所需時間段的圖片信息.也能夠從新統計每一個時間點的圖片個數.同時這裏也要在第2步的定時任務裏作一個ZREMRANGEBYSCORE操做移除24小時前的數據.

到這裏整個設計思路就展現差很少就基本完成了.固然這不是所有,還有些細節,好比定時任務是否正常執行,數據持久化,服務down掉了怎麼處理等.json

有時間把一些設計思路的代碼寫出來.數組

相關文章
相關標籤/搜索