Redis的使用模式之計(jì)數(shù)器模式實(shí)例
Redis 是目前 NoSQL 領(lǐng)域的當(dāng)紅炸子雞,它象一把瑞士軍刀,小巧、鋒利、實(shí)用,特別適合解決一些使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)難以解決的問題。打算寫一系列 Redis 使用模式的文章,深入總結(jié)介紹 Redis 常見的使用模式,以供大家參考。
常見匯總計(jì)數(shù)器
匯總計(jì)數(shù)是系統(tǒng)常見功能,比如網(wǎng)站通常需要統(tǒng)計(jì)注冊(cè)用戶數(shù),網(wǎng)站總瀏覽次數(shù)等等。 使用 Redis 提供的基本數(shù)據(jù)類型就能實(shí)現(xiàn)匯總計(jì)數(shù)器,通過 incr 命令實(shí)現(xiàn)增加操作。
比如注冊(cè)用戶數(shù),基本操作命令如下:
# 獲取注冊(cè)用戶數(shù)
get total_users
# 注冊(cè)用戶數(shù)增加一位
incr total_users
按時(shí)間匯總的計(jì)數(shù)器
通常計(jì)數(shù)還要按時(shí)間統(tǒng)計(jì),比如注冊(cè)用戶數(shù)需要按日統(tǒng)計(jì),處理方法比較簡(jiǎn)單,把日期帶入計(jì)數(shù)器 key 就可以。
還是注冊(cè)用戶計(jì)數(shù)的例子,基本操作命令如下:
# 假定操作 2014-07-06 數(shù)據(jù)
# 獲取注冊(cè)用戶數(shù)
get total_users:2014-07-06
# 2014-07-06 注冊(cè)用戶數(shù)增加一位
incr total_users:2014-07-06
# 設(shè)置 48 小時(shí)過期時(shí)間 172800 = 48 * 60 * 60
expire total_users:2014-07-06 172800
為計(jì)數(shù)器設(shè)置一個(gè) 48 小時(shí)的過期時(shí)間是為了節(jié)省計(jì)數(shù)器占用空間,畢竟 redis 是內(nèi)存數(shù)據(jù)庫(kù),可以在過期前執(zhí)行一個(gè)任務(wù)把計(jì)數(shù)器存入關(guān)系數(shù)據(jù)庫(kù)。
速度控制
速度控制也是 Redis 一種常見的計(jì)數(shù)用途,比如有一個(gè) API 服務(wù),希望控制每一個(gè) IP 每秒請(qǐng)求數(shù)不超過 10 次,可以用 IP 和 時(shí)間秒作為 key 設(shè)置一個(gè)計(jì)數(shù)器,實(shí)現(xiàn)控制,偽代碼如下所示:
# 每秒最大請(qǐng)求數(shù)
MAX_REQUESTS_PER_SECOND = 10
# 檢查 ip 請(qǐng)求限制
# @param ip
# @raise 超過限制,拋出 RuntimeError 異常
def check_request_limitation_for_ip(ip)
time_tick = Time.now.to_i
key = "#{ip}:#{time_tick}"
num = $redis.get(key).to_i
if num > MAX_REQUEST_PER_SECOND
raise 'too many requests'
else
$redis.incr(key)
$redis.expire(key, 10)
end
end
使用 Hash 數(shù)據(jù)類型維護(hù)大量計(jì)數(shù)器
有時(shí)候需要維護(hù)大量計(jì)數(shù)器,比如每一個(gè)論壇主題的查看數(shù),比如每一個(gè)用戶訪問頁(yè)面次數(shù),因?yàn)檎搲黝}和用戶基數(shù)可能很大,直接基于論壇主題或用戶 ID 生成計(jì)數(shù)器的話,占用 Redis 資源還是相當(dāng)可觀的,這時(shí)可以用 Hash 數(shù)據(jù)類型壓縮所需資源。
比如,對(duì)應(yīng)論壇主題查看計(jì)數(shù),可以由模式
key: topic:<topic_id>:views
value: view count (integer)
轉(zhuǎn)換為模式:
key: topic:views
value: hash
hash key: <topic_id>
hash value: view count (integer)
總結(jié):利用 Redis 實(shí)現(xiàn)計(jì)數(shù)器,可以簡(jiǎn)單高效實(shí)現(xiàn)各種計(jì)數(shù)功能。
相關(guān)文章
Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解
這篇文章主要介紹了Redis遠(yuǎn)程字典服務(wù)器?hash類型示例詳解,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08深入解析RedisJSON之如何在Redis中直接處理JSON數(shù)據(jù)
JSON已經(jīng)成為現(xiàn)代應(yīng)用程序之間數(shù)據(jù)傳輸?shù)耐ㄓ酶袷?然而,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在處理JSON數(shù)據(jù)時(shí)可能會(huì)遇到性能瓶頸,本文將詳細(xì)介紹RedisJSON的工作原理、關(guān)鍵操作、性能優(yōu)勢(shì)以及使用場(chǎng)景,感興趣的朋友一起看看吧2024-05-05如何使用?redis?消息隊(duì)列完成秒殺過期訂單處理操作(二)
這篇文章主要介紹了如何使用?redis?消息隊(duì)列完成秒殺過期訂單處理操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07Mac中Redis服務(wù)啟動(dòng)時(shí)錯(cuò)誤信息:NOAUTH Authentication required
這篇文章主要介紹了Mac中使用Redis服務(wù)啟動(dòng)時(shí)錯(cuò)誤信息:"NOAUTH Authentication required"問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08詳解Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表
這篇文章主要介紹了Redis數(shù)據(jù)結(jié)構(gòu)中的跳躍表的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Redis?sentinel哨兵集群的實(shí)現(xiàn)步驟
本文主要介紹了Redis?sentinel哨兵集群的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07