基于Redis自動(dòng)過(guò)期的流處理暫停機(jī)制
在實(shí)時(shí)視頻流處理系統(tǒng)中,我們有時(shí)會(huì)遇到某些攝像頭的數(shù)據(jù)延時(shí)過(guò)大(例如網(wǎng)絡(luò)問(wèn)題或處理能力不足),此時(shí)我們希望暫時(shí)跳過(guò)該攝像頭的處理,以避免積壓的數(shù)據(jù)影響實(shí)時(shí)性。本文將介紹一種基于Redis自動(dòng)過(guò)期特性的暫停機(jī)制,該機(jī)制簡(jiǎn)單高效,且能自動(dòng)恢復(fù)。
核心思路
- 延時(shí)檢測(cè):在處理每個(gè)攝像頭數(shù)據(jù)時(shí),計(jì)算當(dāng)前時(shí)間與數(shù)據(jù)時(shí)間戳的差值
- 暫停觸發(fā):當(dāng)延時(shí)超過(guò)閾值(300秒)時(shí),將該攝像頭加入暫停列表
- 自動(dòng)恢復(fù):使用Redis的過(guò)期特性,在指定時(shí)間后自動(dòng)恢復(fù)處理
- 狀態(tài)共享:通過(guò)Redis實(shí)現(xiàn)多個(gè)進(jìn)程間的狀態(tài)共享
代碼實(shí)現(xiàn)
1. 初始化Redis連接和鍵前綴
class Tracking_Car:
def __init__(self, profile_path, logger_) -> None:
# ...其他初始化代碼...
# Redis連接
self.redis_db = redis.StrictRedis(
host=conf.redis_server.ip,
port=conf.redis_server.port,
db=conf.redis_server.db,
socket_keepalive=True,
socket_connect_timeout=10
)
# 超時(shí)存儲(chǔ)的Redis key前綴
self.TIMEOUT_KEY_PREFIX = "tracking_car:timeout:"
2. 接收數(shù)據(jù)時(shí)檢查暫停狀態(tài)
def re_stream(self, logger_):
pub = self.redis_db.pubsub()
pub.subscribe(self.topic)
msgs = pub.listen()
for msg in msgs:
if msg["type"] == "message":
json_data = json.loads(msg["data"])
ip = json_data["ip"]
# 檢查是否在暫停列表 - 使用Redis自動(dòng)過(guò)期
timeout_key = f"{self.TIMEOUT_KEY_PREFIX}{camera_ip}"
if self.redis_db.exists(timeout_key):
# 獲取剩余時(shí)間并記錄日志
ttl = self.redis_db.ttl(timeout_key)
skip_msg = f"跳過(guò){ip }的消息:處于暫停時(shí)段({ttl}s剩余)"
continue
# ...正常處理邏輯...
3. 檢測(cè)到延時(shí)過(guò)大時(shí)設(shè)置暫停
def write_database(self, cv_list, logger_: MyLogger):
# 計(jì)算時(shí)間差
current_time = time.time()
_ts = cv_list['timestamp']
diff_time = current_time - _ts
# 如果時(shí)間差超過(guò)300秒,使用Redis自動(dòng)過(guò)期設(shè)置
if diff_time > 300:
camera_ip = cv_list["ip"]
logger_.warning(f"IP {camera_ip} 延時(shí)超過(guò)300秒({diff_time:.2f}s),加入暫停列表")
# 設(shè)置Redis鍵,自動(dòng)在300秒后過(guò)期
timeout_key = f"{self.TIMEOUT_KEY_PREFIX}{camera_ip}"
self.redis_db.setex(timeout_key, 300, "1") # 值可以是任意內(nèi)容
# 刪除相關(guān)圖片并跳過(guò)處理
self.redis_db.unlink(cv_list["path"])
return
# ...正常處理邏輯...
優(yōu)勢(shì)分析
自動(dòng)恢復(fù)機(jī)制:
- 使用Redis的
setex命令設(shè)置帶過(guò)期時(shí)間的鍵 - 300秒后鍵自動(dòng)刪除,攝像頭自動(dòng)恢復(fù)處理
- 無(wú)需額外的清理任務(wù)或狀態(tài)管理
- 使用Redis的
進(jìn)程間狀態(tài)共享:
- 多個(gè)處理進(jìn)程通過(guò)Redis共享暫停狀態(tài)
- 新增進(jìn)程自動(dòng)獲取當(dāng)前暫停狀態(tài)
- 系統(tǒng)擴(kuò)展性更強(qiáng)
資源優(yōu)化:
- 檢測(cè)到延時(shí)過(guò)大時(shí)立即停止處理
- 刪除相關(guān)Redis圖片數(shù)據(jù),釋放內(nèi)存
- 避免無(wú)效處理消耗CPU資源
實(shí)時(shí)監(jiān)控:
- 記錄暫停日志及剩余時(shí)間
- 管理員可實(shí)時(shí)查看暫停狀態(tài)
應(yīng)用場(chǎng)景
這種機(jī)制特別適用于以下場(chǎng)景:
- 網(wǎng)絡(luò)不穩(wěn)定的攝像頭:某些攝像頭可能因網(wǎng)絡(luò)問(wèn)題導(dǎo)致數(shù)據(jù)延遲
- 處理能力不足:當(dāng)系統(tǒng)負(fù)載過(guò)高時(shí),可暫時(shí)跳過(guò)部分?jǐn)z像頭
- 臨時(shí)故障處理:攝像頭臨時(shí)故障導(dǎo)致數(shù)據(jù)積壓
- 優(yōu)先級(jí)管理:優(yōu)先處理實(shí)時(shí)性要求高的攝像頭
擴(kuò)展優(yōu)化
動(dòng)態(tài)閾值設(shè)置:
# 根據(jù)系統(tǒng)負(fù)載動(dòng)態(tài)調(diào)整延時(shí)閾值 load = os.getloadavg()[0] dynamic_threshold = 300 * (1 + load) # 負(fù)載越高,閾值越大
分級(jí)暫停機(jī)制:
# 根據(jù)延時(shí)嚴(yán)重程度設(shè)置不同暫停時(shí)間 if diff_time > 600: # 超過(guò)10分鐘 pause_time = 600 # 暫停10分鐘 elif diff_time > 300: # 超過(guò)5分鐘 pause_time = 300 # 暫停5分鐘監(jiān)控告警:
# 當(dāng)攝像頭被暫停時(shí)發(fā)送告警 if diff_time > 300: send_alert(f"攝像頭 {camera_ip} 因延時(shí)過(guò)高被暫停")
總結(jié)
基于Redis自動(dòng)過(guò)期的流處理暫停機(jī)制是一種高效、可靠且易于實(shí)現(xiàn)的解決方案。它通過(guò)以下方式提升系統(tǒng)穩(wěn)定性:
- 防止延時(shí)過(guò)大的數(shù)據(jù)影響實(shí)時(shí)處理
- 自動(dòng)恢復(fù)處理,減少人工干預(yù)
- 共享狀態(tài),支持分布式部署
- 優(yōu)化資源使用,提升系統(tǒng)整體效率
這種機(jī)制不僅適用于視頻流處理系統(tǒng),也可應(yīng)用于任何需要根據(jù)數(shù)據(jù)延遲動(dòng)態(tài)調(diào)整處理策略的場(chǎng)景。
到此這篇關(guān)于基于Redis自動(dòng)過(guò)期的流處理暫停機(jī)制的文章就介紹到這了,更多相關(guān)Redis自動(dòng)過(guò)期流處理暫停機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis?HyperLogLog數(shù)據(jù)量統(tǒng)計(jì)的實(shí)現(xiàn)實(shí)例
在大數(shù)據(jù)時(shí)代,統(tǒng)計(jì)海量數(shù)據(jù)中的唯一值是一個(gè)常見(jiàn)的需求,但同時(shí)也是極具挑戰(zhàn)性的任務(wù),傳統(tǒng)的統(tǒng)計(jì)方法可能會(huì)消耗大量?jī)?nèi)存或計(jì)算資源,而?Redis?的?HyperLogLog?數(shù)據(jù)結(jié)構(gòu)?則提供了一種高效、輕量的解決方案,下面就來(lái)詳細(xì)介紹一下HyperLogLog的使用,感興趣的可以了解一下2025-09-09
redis設(shè)置密碼并修改查看的幾種實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了redis設(shè)置密碼并修改查看的幾種實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2026-06-06
React Antd Cascader組件地區(qū)選擇方式
文章介紹了在表單中實(shí)現(xiàn)地區(qū)選擇功能,使用Cascader組件動(dòng)態(tài)加載數(shù)據(jù),需通過(guò)loadData和遞歸處理實(shí)現(xiàn)增刪改查,存儲(chǔ)和回顯需完整id數(shù)組以支持多級(jí)地區(qū)展示,強(qiáng)調(diào)后端設(shè)計(jì)對(duì)數(shù)據(jù)關(guān)聯(lián)(id/pid)的重要性2025-08-08
Redis實(shí)現(xiàn)優(yōu)惠券限一單限制詳解
這篇文章主要介紹了Redis解決優(yōu)惠券秒殺應(yīng)用案例,本文先講了搶購(gòu)問(wèn)題,指出其中會(huì)出現(xiàn)的多線程問(wèn)題,提出解決方案采用悲觀鎖和樂(lè)觀鎖兩種方式進(jìn)行實(shí)現(xiàn),然后發(fā)現(xiàn)在搶購(gòu)過(guò)程中容易出現(xiàn)一人多單現(xiàn)象,需要的朋友可以參考下2022-12-12

