双十一期间,对于IoT(物联网)设备的TID(Transaction ID)推荐,主要涉及到如何在高并发场景下确保交易的唯一性、可靠性和高效性。以下是关于这个问题涉及的基础概念,以及相关优势、类型、应用场景和解决方案的详细解答:
TID(Transaction ID):
IoT(物联网):
import time
import random
def generate_tid():
timestamp = int(time.time() * 1000) # 当前时间戳(毫秒)
random_num = random.randint(1000, 9999) # 随机数
return f"{timestamp}{random_num}"
tid = generate_tid()
print(tid)
import uuid
def generate_tid():
return str(uuid.uuid4())
tid = generate_tid()
print(tid)
在数据库设计时,可以使用自增字段来生成TID:
CREATE TABLE transactions (
tid INT AUTO_INCREMENT PRIMARY KEY,
data TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
问题:在高并发情况下,如何确保TID的唯一性?
解决方法:
class SnowflakeIDGenerator:
def __init__(self, datacenter_id, worker_id, sequence=0):
self.datacenter_id = datacenter_id
self.worker_id = worker_id
self.sequence = sequence
self.twepoch = 1288834974657
self.datacenter_id_bits = 5
self.worker_id_bits = 5
self.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)
self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)
self.sequence_bits = 12
self.worker_id_shift = self.sequence_bits
self.datacenter_id_shift = self.sequence_bits + self.worker_id_bits
self.timestamp_left_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bits
self.last_timestamp = -1
def _til_next_millis(self, last_timestamp):
timestamp = self._current_time_millis()
while timestamp <= last_timestamp:
timestamp = self._current_time_millis()
return timestamp
def _current_time_millis(self):
return int(time.time() * 1000)
def next_id(self):
timestamp = self._current_time_millis()
if timestamp < self.last_timestamp:
raise Exception("Clock moved backwards. Refusing to generate id for %d milliseconds" % (self.last_timestamp - timestamp))
if timestamp == self.last_timestamp:
self.sequence = (self.sequence + 1) & 4095
if self.sequence == 0:
timestamp = self._til_next_millis(self.last_timestamp)
else:
self.sequence = 0
self.last_timestamp = timestamp
return ((timestamp - self.twepoch) << self.timestamp_left_shift) | \
(self.datacenter_id << self.datacenter_id_shift) | \
(self.worker_id << self.worker_id_shift) | \
self.sequence
generator = SnowflakeIDGenerator(datacenter_id=1, worker_id=1)
tid = generator.next_id()
print(tid)
通过以上方法,可以在双十一等高并发场景下有效管理和生成TID,确保交易的唯一性和可靠性。
领取专属 10元无门槛券
手把手带您无忧上云