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對數據會做持久化,也不必擔心服務器斷電....