文章详情

背景

在计算机专业的面试中,经常会遇到一些业务上的BUG。这类不仅考察者对编程和系统理解的深度,还考验其对实际业务场景的应对能力。是一道典型的业务上BUG及其解析。

在一个在线电商系统中,用户可以在购物车中添加商品。系统设计了一个功能,允许用户通过输入商品ID来快速将商品添加到购物车。在实际使用过程中,发现当用户连续快速输入多个商品ID时,购物车中会出现重复的商品记录。是系统相关的代码片段:

python

class ShoppingCart:

def __init__(self):

self.items = []

def add_item(self, item_id):

if item_id not in self.items:

self.items.append(item_id)

return True

return False

# 假设这是调用接口

cart = ShoppingCart()

cart.add_item('123')

cart.add_item('456')

cart.add_item('123') # 这里可能会出现重复

分析

根据上述代码,我们可以看到`add_item`方法在添加商品到购物车时会检查商品ID是否已存在于购物车中。不存在,则添加该商品ID到购物车,并返回True表示添加成功;已存在,则返回False表示添加失败。

当用户连续快速输入多个商品ID时,出`if item_id not in self.items`这一行。由于Python的`in`操作在列表中进行时,会进行一次线性查找,当购物车中商品数量较多时,查找效率会降低。更重要的是,由于用户的快速操作,可能在两次检测之间,商品ID已经被添加到列表中,从而导致重复。

解答

针对上述我们可以采取几种方法来解决:

1. 使用集合(Set)代替列表(List)

由于集合(Set)是基于哈希表实现的,其查找效率比列表高。我们可以将`self.items`从列表改为集合,这样可以大大提高查找效率。

python

class ShoppingCart:

def __init__(self):

self.items = set()

def add_item(self, item_id):

if item_id not in self.items:

self.items.add(item_id)

return True

return False

2. 使用布隆过滤器(Bloom Filter)

商品ID的数量非常大,甚至超过了内存的限制,可以使用布隆过滤器。布隆过滤器是一个概率型数据结构,它可以用来测试一个元素是否是一个集合的成员。虽然它有误报的可能,但不会出现漏报。

python

import hashlib

from bitarray import bitarray

class BloomFilter:

def __init__(self, size, hash_count):

self.size = size

self.hash_count = hash_count

self.bit_array = bitarray(size)

self.bit_array.setall(False)

def add(self, item):

digests = [hashlib.md5((item + str(i)).encode()).hexdigest() for i in range(self.hash_count)]

for digest in digests:

index = int(digest, 16) % self.size

self.bit_array[index] = True

def check(self, item):

digests = [hashlib.md5((item + str(i)).encode()).hexdigest() for i in range(self.hash_count)]

for digest in digests:

index = int(digest, 16) % self.size

if self.bit_array[index]:

continue

return False

return True

class ShoppingCart:

def __init__(self):

self.bit_filter = BloomFilter(1000000, 10)

def add_item(self, item_id):

if not self.bit_filter.check(item_id):

self.bit_filter.add(item_id)

return True

return False

3. 优化业务逻辑

业务允许,我们可以优化用户的操作流程,限制用户在短时间内输入商品ID的次数,或者增加一个防抖动的机制。

通过以上方法,我们可以有效地解决因连续快速输入商品ID导致的重复提高系统的稳定性和用户体验。

相关推荐
2024年购车指南:10万新能源车销量排行榜深度解析
入门级新能源市场为何火爆? 随着电池技术的成熟与制造成本的下降,10万元的新能源汽车市场正成为整个行业增长最迅猛的板块。对于众多首次购车或追…
头像
展示内容 2025-12-06
续航600km8万左右纯电车suv推荐
第一款是广汽新能源AION LX(参数|询价)。广汽新能源Aion LX是国产品牌中,首款续航里程表现超过600km的国产量产纯电动SUV车…
头像
展示内容 2025-12-06
全球首破160km/h!腾势N9以双倍国际标准刷新鱼钩测试纪录
在交通事故中,车辆侧翻是最危险的事故之一。 有研究表明,由车辆侧翻导致的死亡人数占到交通事故总死亡人数的35%。 特别是中大型SUV,由于其…
头像
展示内容 2025-03-26
足球怎么踢
摘要:足球,这项全球最受欢迎的运动,其踢法丰富多彩,本文将详细介绍足球怎么踢,帮助读者更好地理解这项运动。 一、基本技巧 1. 脚法训练 足…
头像
展示内容 2025-03-18
发表评论
暂无评论

还没有评论呢,快来抢沙发~