get_redis_data.py
2.59 KB
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import zlib
import redis
class GetRedisData(object):
def __init__(self, asin='', batch_size=100000):
self.asin = asin
self.batch_size = batch_size
# 连接到Redis服务器
self.redis_db = {
"us": 0,
"uk": 1,
"de": 2,
"es": 3,
"fr": 4,
"it": 5,
}
self.site_name = 'us'
self.client = redis.Redis(host='192.168.10.224', port=6379, db=self.redis_db[self.site_name], password='yswg2023')
@staticmethod
def udf_cal_crc32(asin, key_size):
# crc32算法 + 取余
# 获取asin字符串的字节表示形式
bytes_str = bytes(asin, 'utf-8')
# 使用zlib计算CRC-32校验和
checksum = zlib.crc32(bytes_str)
# 获取32位的二进制补码
checksum_signed = (checksum & 0xFFFFFFFF) - (1 << 32) if checksum & (1 << 31) else checksum
def java_mod(x, y):
# return x % y if x * y > 0 else x % y - y # 区分正负值
return abs(x) % y # 不区分正负值
# 取余
result = java_mod(checksum_signed, key_size)
print(f"result:{result}")
return result
@staticmethod
def udf_cal_bkdr(asin):
# BKDR哈希算法
hash = 0
for c in asin:
hash = (hash * 33 + ord(c)) % 65535 # 对哈希值取模65535,以避免溢出
print(f"hash:{hash}")
return hash
def get_redis_data(self):
# 连接到 Redis
# client = redis.Redis(host='localhost', port=6379, db=0)
# 外层键
outer_key = self.udf_cal_crc32(asin=self.asin, key_size=self.batch_size)
# 内层键
inner_key = self.udf_cal_bkdr(asin=self.asin)
# # 外层键
# inner_key = self.udf_cal_crc32(asin=self.asin, key_size=self.batch_size)
# # 内层键
# outer_key = self.udf_cal_bkdr(asin=self.asin)
# 从 Redis 哈希表获取数据
value = self.client.hget(outer_key, inner_key)
if value:
print(value.decode("utf-8"))
else:
print("Key not found")
def run(self):
self.udf_cal_crc32(asin=self.asin, key_size=self.batch_size)
self.udf_cal_bkdr(asin=self.asin)
if __name__ == '__main__':
# handle_obj = KafkaAsinDetailHistory(asin='B0C7BZL9C3')
# handle_obj = KafkaAsinDetailHistory(asin='B0C6DM2V9X')
# handle_obj = KafkaAsinDetailHistory(asin='B0BV7CBQW3')
handle_obj = GetRedisData(asin='B08KR79NBR')
# handle_obj = GetRedisData(asin='B0062TMTMK')
# handle_obj.run()
handle_obj.get_redis_data()