热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonRedis实战:第二章:使用Redis构建Web应用:第二节:使用Redis实现购物车

上一篇文章:Python–Redis实战:第二章:使用Redis构建Web应用:第一节:登录和cookie缓存下一篇文章:Python–Redis实战:第二章:使用Redis构建W

上一篇文章:
Python–Redis实战:第二章:使用Redis构建Web应用:第一节:登录和COOKIE缓存

下一篇文章:
Python–Redis实战:第二章:使用Redis构建Web应用:第三节:网页缓存

网景(Netscape)公司在20世纪90年代中期最先在网络中使用了COOKIE,这些COOKIE最终变成了我们现在使用的COOKIE。COOKIE最初的意图是在于为网络销售商提供一种购物车,让用户可以收集他们想要购买的商品。

使用COOKIE实现购物车:也就是将整个购物车都存储到COOKIE里面的做法非常常见,这种做法的一大优点是无须对数据库进行写入就可以实现购物车功能,而缺点则是程序需要重新解析和验证(validata)COOKIE,确保COOKIE的格式正确,并且包含的商品都是真正可购买的商品。COOKIE购物车还有一个缺点:因为浏览器每次发送请求都会连COOKIE一起发送,所以如果购物车COOKIE的体积比较大,那么请求发送和处理的速度可能会有所降低。

因为我们在签名已经使用了Redis实现了会话COOKIE和记录用户最近浏览过的商品这两个特性,所以我们决定将购物车的信息也存储到Redis里面,并且使用与会话COOKIE相同的COOKIEID来引用购物车。

购物车的定义非常简单:每个用户的购物车都是一个散列,这个散列存储了商品ID与商品订购数量之间的映射。对商品数量进行验证的工作有web应用程序负责,我们要做的则是在商品的订购数量出现变化时,对购物车进行更新:如果用户订购某件商品的数量大于0,那么程序会将这件商品的ID以及用户订购该商品的数量添加到散列里面,如果用户购买的商品以及存在于散列里面,那么新的订购数量会覆盖已有的订购数量;相反的,如果用户订购某件商品的数量不大于0,那么程序将从散列里面移除该条目。

def add_to_cart(conn,session,item,count):
if count<=0:
#从购物车里面移除指定商品
conn.hrem('cart:'+session,item)
else:
#将指定的商品添加到购物车&#x1f6d2;
conn.hset('cart:'+session,item,count)

接着,我们需要对之前的会话清理函数进行更新,让它在清理会话的同时,将旧会话对应用户的购物车也一并删除:

#清理旧会话
import time
QUIT=False
LIMIT=10,000,000
def clean_sessions(conn):
while not QUIT:
#目前已有令牌的数量
size=conn.zcard('recent:')
if size<=LIMIT:
#令牌数量未超过限制,休眠1秒后再重新检查
time.sleep(1)
continue
end_index=min(size-LIMIT,100)
tokens=conn.zrange('recent:',0,end_index-1)
session_keys=[]
#为那些将要删除的令牌构建键名
for token in tokens:
session_keys.append('viewed:'+token)
#新增下面有一行代码用于删除旧会话对应用户的购物车
session_keys.append('cart:'+token)
#移除最旧的那些令牌
conn.delete(*session_keys)
conn.hdel('login:',*tokens)
conn.zrem('recent:',*tokens)

我们现在讲会话和购物车都存储到了Redis里面,这种做法除了可以减少请求的体积之外,还使得我们可以根据用户浏览过的商品、用户放入购物车的商品以及用户最终购买的商品进行统计计算,并构建起很多大型网络零售商都在提供的【在查看过这件商品的用户当中,有X%的用户最终购买了 这件商品】、【购买了这件商品的用户也购买了XXX商品】等功能,这些功能可以帮众用户查找其它相关的商品,并最终提升网站的销售业绩。

通过将会话COOKIE和购物车COOKIE存储在Redis里面,我们得到了进行数据分析所需的两个重要的数据来源,接下来将展示如果使用缓存来减少数据库和Web前端的负载。

上一篇文章:
Python&#8211;Redis实战:第二章:使用Redis构建Web应用:第一节:登录和COOKIE缓存

下一篇文章:
Python&#8211;Redis实战:第二章:使用Redis构建Web应用:第三节:网页缓存


推荐阅读
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Spark与HBase结合处理大规模流量数据结构设计
    本文将详细介绍如何利用Spark和HBase进行大规模流量数据的分析与处理,包括数据结构的设计和优化方法。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
author-avatar
让生活洒满阳光_622
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有