本节书摘来异步社区《Redis实战》一书中的第2章,第2.2节,作者: 【美】Josiah L. Carlson(约西亚 L.卡尔森)译者: 黄健宏 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 使用Redis实现购物车

网景(Netscape)公司在20世纪90年代中期最先在网络中使用了cookie,这些cookie最终变成了我们在上一节讨论的登录会话cookie。cookie最初的意图在于为网络零售商(web retailer)提供一种购物车,让用户可以收集他们想要购买的商品。在cookie之前,有过几种不同的购物车解决方案,但这些方案全都不太好用。

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

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

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

代码清单2-4 add_to_cart()函数

2-4.jpg

接着,我们需要对之前的会话清理函数进行更新,让它在清理旧会话的同时,将旧会话对应用户的购物车也一并删除,更新后的函数如代码清单2-5所示。

代码清单2-5 clean_full_sessions()函数

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

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

《Redis实战》一2.2 使用Redis实现购物车相关推荐

  1. redis实战第七篇 使用redis工具(redis-cli)搭建redis cluster

    上一篇有介绍手动安装redis cluster传送门,很明显,手动创建redis cluster的过程比较繁杂,容易出错,因此redis官方开发了一个工具,可以快速搭建redis cluster.在5 ...

  2. Redis实战(七):redis的集群:主从复制、CAP、PAXOS、cluster分片集群 2

    上节回顾 上一节我们讲了AKF拆分原则,讲了Redis主从复制的方式,是X轴方向的拓展,实现了HA,但是没有解决单节点数据的容量有限问题. 如何解决单节点数据容量的问题 如果数据可以分类,交集不多,可 ...

  3. Redis实战(六):Redis的集群:AKF,主从复制的概念引入,CAP,Sentinel 哨兵

    单击.单节点.单实例存在的问题 单点故障(物理机挂了,要等很久才能可用) 容量有限 压力过大 解决方式 AKF 有XYZ三个轴,可以只发生一个,可以多个维度一起发生 X轴:Redis示例的副本,数据库 ...

  4. Redis实战(五):Redis的持久化RDB、fork、copyonwrite、AOF、RDBAOF混合使用

    补充一个知识 缓存:数据可以丢,保证速度. 数据库:数据是绝对不能丢的,保证速度+持久性,内存中的数据是掉电易失的. 存储层: 快照/副本 日志文件 $$优先级高于管道 fork() fork是系统调 ...

  5. Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU

    啤酒理论 Buffer机制,减少没必要的来回调用 前置知识 只要和redis建立了连接,发送字符串,就能交互 管道 发布 / 订阅 help @pubsub 发送者 订阅者 PSUBSCRIBE pa ...

  6. Redis实战(二):Redis 的 String 类型 bitmap

    Redis 常用命令.数据类型 查看帮助 To get help about Redis commands type:"help @<group>" to get a ...

  7. Redis实战(一):Redis一键安装脚本,Redis 介绍及 NIO 原理介绍

    Redis一键安装并启动的脚本(root用户) 试过用其他权限用户安装会出错,可能是因为命令中没有写 sudo 切换到root,直接执行即可. #!/bin/bash cd /usr/local/ & ...

  8. Redis实战(十二)Redis实现分布式锁

    序言 SET my_key my_value NX PX milliseconds 资料 如何优雅地用Redis实现分布式锁? 转载于:https://www.cnblogs.com/cnki/p/1 ...

  9. Redis实战(三):Redis的List、Set、Hash、sorted_set、skip list

    String类型(上节回顾) List 类型 help @list查看帮助 可以用List类型实现一个栈: lpush k1 a b c d e左边push lpop k1 a b c d e左边po ...

  10. SpringBoot2.0整合Redis实战

    SpringBoot2.x整合Redis实战 1.分布式缓存Redis介绍 简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具 1.redis官网 https://redis.io/down ...

最新文章

  1. 华数软件测试岗位,重磅:字节跳动与华数共同研发的电视原创视频app已正式测试上线...
  2. C# 加载 SQLite DLL问题
  3. 底部导航栏Bottom navigation规范指南
  4. MySQL—数据库表的完整性约束(非外键约束)
  5. python os模块 常用命令
  6. python装饰器class_Python中的各种装饰器详解
  7. Datatables 构建响应式
  8. 走不远的共享滑板车!
  9. 安装oracle12c之前,centos7安装oracle12c数据库的坑
  10. vim全文替换字符串
  11. Lottie动画的优劣及原理
  12. 小学计算机教案设计ppt,小学信息技术制作幻灯片的教案
  13. 全能扫描王(一款识别率超高的OCR识别APP)
  14. 深响|对话THE9演唱会主创:技术打开想象力,未来的娱乐还能这么玩
  15. python循环中释放内存的方法_我怎样才能在Python中明确释放内存?
  16. 微软账户登入显示空白框,无法创建用户
  17. Linux通过wine运行QQ,Ubuntu安装wine运行QQ和微信
  18. mysql字符集mysqldump_Mysqldump 字符集问题
  19. ps -ef | grep httpd | grep -v grep | wc -l
  20. 格雷希尔G20系列低压外包式快速接头有哪些特性

热门文章

  1. WCF如何使用X509证书(安装和错误)(二)
  2. ASP.NET修改文件夹名称
  3. 2018-2019-2 网络对抗技术 20165115 Exp6 信息搜集与漏洞扫描
  4. 计算某个目录下所有文件的MD5值
  5. unity中Rotation * Position的意义
  6. linux命令行使用
  7. 用微软的压力测试工具进行拒绝服务攻击
  8. 类中定义接口-匿名内部类
  9. TelephonyManager与PhoneInterfaceManager应用
  10. C#.NET通用权限管理系统组件中用少数几行代码实现记录页面状态