這期內容當中小編將會給大家帶來有關Redis中怎么實現一個計數器功能,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
使用字符串鍵
下面代碼演示了如何利用 Redis 中的字符串鍵來實現計數器功能。其中,incr() 方法用于累加計數,get_cnt() 方法用于獲取當前的計數值。
from redis import Redis class Counter: def __init__(self, client: Redis, key: str): self.client = client self.key = key def incr(self, amount=1): """計數累加""" self.client.incr(self.key, amount=amount) def decr(self, amount=1): """計數累減""" self.client.decr(self.key, amount=amount) def get_cnt(self): """獲取當前計數的值""" return self.client.get(self.key) if __name__ == '__main__': client = Redis(decode_responses=True) counter = Counter(client, 'page_view:12') counter.incr() counter.incr() print(counter.get_cnt()) # 2
假設我們要統計 page_id 為 12 的頁面的瀏覽數,那么我們可以設定 key 為 page_view:12,用戶每一次瀏覽,就調用一次 counter 的 incr() 方法進行計數。
使用哈希鍵
在上面的代碼中,我們需要針對每個統計項,都單獨設置一個字符串鍵。那么,下面我們來看看如何通過 Redis 的哈希鍵,來對關聯的統計項進行統一管理。
from redis import Redis class Counter: def __init__(self, client: Redis, key: str, counter: str): self.client = client self.key = key self.counter = counter def incr(self, amount=1): """計數累加""" self.client.hincrby(self.key, self.counter, amount=amount) def decr(self, amount=1): """計數累減""" self.client.hincrby(self.key, self.counter, amount=-amount) def get_cnt(self): """獲取當前計數的值""" return self.client.hget(self.key, self.counter) if __name__ == '__main__': client = Redis(decode_responses=True) counter = Counter(client, 'page_view', '66') counter.incr() counter.incr() print(counter.get_cnt()) # 2
如果采用哈希鍵,那么,我們對于同一類型的計數,可以使用一個相同的 key 來進行存儲。比如,在上面例子中,我們使用 page_view 來統計頁面的瀏覽數,對于 page_id 為 66 的頁面,直接添加到 page_view 對應的字段中即可。
使用集合鍵
在上面兩個例子中,當動作被執行時,程序可以調用一次 incr() 累加計數的方法。某些場景下,我們可能需要對特定的動作,僅僅計數一次。什么叫“僅僅計數一次”?就是說,同一個用戶/IP,多次訪問某個頁面,計數器只會將計數值增加 1。來看看以下代碼:
from redis import Redis class Counter: def __init__(self, client: Redis, key: str): self.client = client self.key = key def add(self, item: str) -> bool: """計數累加,若計數之前item已存在,放回False;否則返回True""" return self.client.sadd(self.key, item) == 1 def get_cnt(self): """獲取當前計數的值""" return self.client.scard(self.key) if __name__ == '__main__': client = Redis(decode_responses=True) counter = Counter(client, 'uv') counter.add('user1') counter.add('user2') counter.add('user1') # 重復放入 print(counter.get_cnt()) # 2
上述就是小編為大家分享的Redis中怎么實現一個計數器功能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。