1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
| import redis
import json
import pickle
from functools import wraps
class RedisStorage:
def __init__(self, host='localhost', port=6379, db=0):
self.r = redis.Redis(host=host, port=port, db=db, decode_responses=False)
def cache_result(self, key, data, expire=3600):
"""缓存数据"""
self.r.setex(key, expire, pickle.dumps(data))
def get_cache(self, key):
"""获取缓存"""
data = self.r.get(key)
if data:
return pickle.loads(data)
return None
def cache_decorator(self, expire=3600):
"""缓存装饰器"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
cache_key = f"{func.__name__}:{args}:{kwargs}"
result = self.get_cache(cache_key)
if result is not None:
return result
result = func(*args, **kwargs)
self.cache_result(cache_key, result, expire)
return result
return wrapper
return decorator
def incr_counter(self, key):
"""计数器"""
return self.r.incr(key)
def add_to_set(self, key, *values):
"""添加到集合"""
return self.r.sadd(key, *values)
def is_crawled(self, url):
"""检查 URL 是否已爬取"""
return self.r.sismember('crawled_urls', url)
def mark_as_crawled(self, url):
"""标记 URL 已爬取"""
self.r.sadd('crawled_urls', url)
def add_to_queue(self, queue_name, item):
"""添加到队列"""
self.r.lpush(queue_name, json.dumps(item))
def get_from_queue(self, queue_name, timeout=0):
"""从队列获取"""
result = self.r.brpop(queue_name, timeout=timeout)
if result:
return json.loads(result[1])
return None
def sorted_set_add(self, key, score, member):
"""添加到有序集合"""
self.r.zadd(key, {member: score})
def get_top_n(self, key, n=10):
"""获取排行榜前 N 名"""
return self.r.zrevrange(key, 0, n-1, withscores=True)
|