国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Redis > 正文

利用Redis簡單高效實現各種計數功能

2020-02-17 14:55:52
字體:
來源:轉載
供稿:網友

Redis 是目前 NoSQL 領域的當紅炸子雞,它象一把瑞士軍刀,小巧、鋒利、實用,特別適合解決一些使用傳統關系數據庫難以解決的問題。打算寫一系列 Redis 使用模式的文章,深入總結介紹 Redis 常見的使用模式,以供大家參考。

常見匯總計數器

匯總計數是系統常見功能,比如網站通常需要統計注冊用戶數,網站總瀏覽次數等等。 使用 Redis 提供的基本數據類型就能實現匯總計數器,通過 incr 命令實現增加操作。

比如注冊用戶數,基本操作命令如下:


?# 獲取注冊用戶數
? get total_users
? # 注冊用戶數增加一位
? incr total_users

?

按時間匯總的計數器

通常計數還要按時間統計,比如注冊用戶數需要按日統計,處理方法比較簡單,把日期帶入計數器 key 就可以。

還是注冊用戶計數的例子,基本操作命令如下:


# 假定操作 2014-07-06 數據
? # 獲取注冊用戶數
? get total_users:2014-07-06
? # 2014-07-06 注冊用戶數增加一位
? incr total_users:2014-07-06
? # 設置 48 小時過期時間 172800 = 48 * 60 * 60
? expire total_users:2014-07-06 172800

?

為計數器設置一個 48 小時的過期時間是為了節省計數器占用空間,畢竟 redis 是內存數據庫,可以在過期前執行一個任務把計數器存入關系數據庫。

速度控制

速度控制也是 Redis 一種常見的計數用途,比如有一個 API 服務,希望控制每一個 IP 每秒請求數不超過 10 次,可以用 IP 和 時間秒作為 key 設置一個計數器,實現控制,偽代碼如下所示:


?# 每秒最大請求數
? MAX_REQUESTS_PER_SECOND = 10

?

? # 檢查 ip 請求限制
? # @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 數據類型維護大量計數器

有時候需要維護大量計數器,比如每一個論壇主題的查看數,比如每一個用戶訪問頁面次數,因為論壇主題和用戶基數可能很大,直接基于論壇主題或用戶 ID 生成計數器的話,占用 Redis 資源還是相當可觀的,這時可以用 Hash 數據類型壓縮所需資源。

比如,對應論壇主題查看計數,可以由模式


? key: topic::views
? value: view count (integer)

?

轉換為模式:


?key: topic:views
? value: hash
??? hash key:
??? hash value: view count (integer)

?

以上就是利用Redis簡單高效實現各種計數功能的全部內容,感謝大家的閱讀,更多內容請關注武林技術頻道網站。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 汤阴县| 信阳市| 通辽市| 永仁县| 西乌珠穆沁旗| 永靖县| 大城县| 藁城市| 昌吉市| 溧水县| 桓台县| 宝应县| 吉木乃县| 永平县| 平谷区| 达州市| 双流县| 吉隆县| 洱源县| 黄梅县| 遂溪县| 文山县| 通城县| 武功县| 洪雅县| 石林| 南溪县| 秀山| 天祝| 湖南省| 时尚| 金华市| 天等县| 岑巩县| 玛沁县| 赤壁市| 阳原县| 怀集县| 正镶白旗| 包头市| 龙山县|