Web 上 cookies 的首次使用是由 Netscape 在 90 年代中期开创的,最终产生了我们刚才讨论的登录会话 cookies。 最初,cookies 旨在为 Web 零售商提供一种为用户保留购物车的方法,以便跟踪他们想要购买的商品。 在 cookies 出现之前,有一些不同的解决方案用于跟踪购物车,但没有一个特别容易使用。
购物车 cookies 的使用很常见,将整个购物车本身存储在 cookie 中也很常见。 将购物车存储在 cookies 中的一个巨大优势是您无需写入数据库即可保存它们。 但缺点之一是您还需要不断地重新解析和验证 cookie,以确保它具有正确的格式并包含实际可以购买的商品。 另一个缺点是 cookies 会随每个请求一起传递,这可能会减慢大型 cookies 的请求发送和处理速度。
由于我们在会话 cookies 和最近浏览过的商品方面取得了如此好的运气,我们将把我们的购物车信息推送到 Redis 中。 由于我们已经在 Redis 中保留用户会话 cookies(以及最近浏览过的商品),我们可以使用相同的 cookie ID 来引用购物车。
我们将使用的购物车很简单:它是一个HASH,将商品 ID 映射到客户想要购买的该商品的数量。 我们将让 Web 应用程序处理商品数量的验证,因此我们只需要在购物车中更新数量即可。 如果用户想要超过 0 件商品,我们会将商品添加到HASH中(如果存在,则替换之前的计数)。 如果没有,我们从哈希中删除该条目。 我们的add_to_cart()函数可以在此列表中看到。
def add_to_cart(conn, session, item, count): if count <= 0:
conn.hrem('cart:' + session, item)
从购物车中删除商品。
else:
conn.hset('cart:' + session, item, count)
将商品添加到购物车。
与此同时,我们将更新我们的会话清理函数,以包括删除旧的购物车,如下一个列表中的clean_full_sessions()。
def clean_full_sessions(conn): while not QUIT: size = conn.zcard('recent:') if size <= LIMIT: time.sleep(1) continue end_index = min(size - LIMIT, 100) sessions = conn.zrange('recent:', 0, end_index-1) session_keys = [] for sess in sessions: session_keys.append('viewed:' + sess)
session_keys.append('cart:' + sess)
删除旧会话的购物车的所需添加行。
conn.delete(*session_keys) conn.hdel('login:', *sessions) conn.zrem('recent:', *sessions)
我们现在在 Redis 中存储了会话和购物车,这有助于减少请求大小,并且允许我们根据访问者查看的商品、最终出现在其购物车中的商品以及他们最终购买的商品,对我们网站的访问者进行统计计算。 所有这些都让我们能够构建(如果我们想的话)与许多其他大型 Web 零售商类似的功能:“查看此商品的人最终购买此商品的可能性为 X%”,以及“购买此商品的人也购买了这些其他商品。” 这可以帮助人们找到其他相关商品,这最终对业务有利。
有了 Redis 中的会话和购物车 cookies,我们现在有了执行有用的数据分析的两个主要部分。 继续,让我们看看如何通过缓存进一步减少我们的数据库和 Web 前端负载。