Redis與Queue


Redis有多種數據結構,適合多種不同的應用場景

1. 使用Redis做緩存

Redis的字符串、哈希表兩種數據結構適合用來儲存大量的鍵值對信息,從而實現高速緩存。

2. 使用Redis做隊列

Redis 有多幾種數據結構適於做隊列:

  • 使用“列表”數據結構,可以實現普通級和優先級隊列的功能;

  • 使用“ 有序集合”數據結構,可以實現優先級隊列;

  • 使用“哈希表”數據結構,可以實現延時隊列;

3. 使用Redis去重

Redis 有多幾種數據結構適於做去重:

  • 利用“集合”數據結構,可以實現小批量數據的去重:

  • 利用“字符串” 數據結構的位操作,可以實現布隆過濾器,從而實現超大規模的數據去重;

  • 利用Redis 自帶的HyperLogLog 數據結構,可以實現超大規模數據的去重和計數。

4. 使用Redis實現積分板

Redis 的“ 有序集合”功能可以實現積分板功能,還能實現自動排序、排名功能。

5. 使用Redis實現“發布/訂閱”功能

Redis 自帶的“發布/訂閱”模式可以實現多對多的“ 發布/訂閱”功能

Queue和Redis

import time
import random
from queue import Queue
from threading import Thread

"""
使用python實現一個簡單的”生產者/消費者“模型
使用python的queue對象做信息隊列
"""


class Producer(Thread):
    """生產者"""

    def __init__(self, queue):
        super().__init__()  # 顯示調用父類的初始化方法
        self.queue = queue

    def run(self):
        while True:
            a = random.randint(0, 10)
            b = random.randint(90, 100)
            print(f"生產者產生了兩個數字:{a},{b}")
            self.queue.put((a, b))


class Consumer(Thread):
    """消費者"""

    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        while True:
            num_tuple = self.queue.get(block=True)
            # block=True 表示 如果隊列中為空則阻塞在這里,直到隊列中有數據為止
            sum_a_b = sum(num_tuple)
            print(f"消費者消費了一組數據,{num_tuple[0]} + {num_tuple[1]} = {sum_a_b}")
            time.sleep(random.randint(0, 10))


queue = Queue()
producer = Producer(queue)
consumer = Consumer(queue)
producer.start()
consumer.start()
while True:
    time.sleep(1)
# 由於生產過程和消費過程不對等,可能會出現數據生產者的數據堆積在隊列中的情況

python中Queue的缺陷,把隊列中的數據存放在內存中,如果突然斷電,隊列中的數據全部消失,缺陷還有很多......

使用Redis替代Queue

生產者

"""
拆分生產者和消費者隊列
使用Redis列表作為隊列
"""

import time
import json
import redis
import random
from threading import Thread


class Producer(Thread):
    def __init__(self):
        super().__init__()
        self.queue = redis.Redis()

    def run(self) -> None:
        while True:
            a = random.randint(0, 10)
            b = random.randint(90, 100)
            print(f"生產者生產了兩個數字:{a},{b}")
            self.queue.rpush("producer", json.dumps((a, b)))
            time.sleep(2)


producer = Producer()
producer.start()
while True:
    time.sleep(1)

消費者

import time
import json
import redis
import random
from threading import Thread


class Consumer(Thread):
    def __init__(self):
        super().__init__()
        self.queue = redis.Redis()

    def run(self) -> None:
        while True:
            num_tuple = self.queue.blpop("producer")
            a, b = json.loads(num_tuple[1].decode())
            print(f"消費者消費了一組數據,{a}+{b}={a+b}")
            time.sleep(random.randint(0,10))


producer = Consumer()
producer.start()
while True:
    time.sleep(1)

  • 生產者和消費者可以放在不同的服務器上運行,運行多少消費者都可以
  • 可以隨時觀察reids隊列的長度
  • Redis對數據會做持久化,也不必擔心服務器斷電....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM