热门标签 | 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应用:第三节:网页缓存


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
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社区 版权所有