美多商城之购物车(购物车存储方案)
一、购物车存储方案
- 用户登录与未登录状态下,都可以保存购物车数据。
- 用户对购物车数据的操作包括:
增
、删
、改
、查
、全选
等等- 每个用户的购物车数据都要做唯一性的标识。
1.1. 登录用户购物车存储方案
1.1.1.存储数据说明
- 如何描述一条完整的购物车记录?
用户itcast,选择了两个 iPhone8 添加到了购物车中,状态为勾选
- 一条完整的购物车记录包括:
用户
、商品
、数量
、勾选状态
。 - 存储数据:
user_id
、sku_id
、count
、selected
1.1.2.存储位置说明
- 购物车数据量小,结构简单,更新频繁,所以我们选择内存型数据库Redis进行存储。
- 存储位置:
Redis数据库 4号库
"carts": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/4","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}
},
1.1.3.存储类型说明
- 提示:我们很难将
用户、商品、数量、勾选状态
存放到一条Redis记录中。所以我们要把购物车数据合理的分开存储。 - 用户、商品、数量:
hash
carts_user_id: {sku_id1: count, sku_id3: count, sku_id5: count, ...}
- 勾选状态:
set 【包括去重,也没有顺序要求】
- 只将已勾选商品的sku_id存储到set中,比如,1号和3号商品是被勾选的。
selected_user_id: [sku_id1, sku_id3, ...]
1.1.4.存储逻辑说明
- 当要添加到购物车的商品已存在时,对商品数量进行累加计算。
- 当要添加到购物车的商品不存在时,向hash中新增field和value即可。
1.2. 未登录用户购物车存储方案
1.2.1.存储数据说明
- 存储数据:
user_id
、sku_id
、count
、selected
1.2.2.存储位置说明 【不会存储在redis中】
- 由于用户未登录,服务端无法拿到用户的ID,所以服务端在生成购物车记录时很难唯一标识该记录。
- 我们可以将未登录用户的购物车数据缓存到用户浏览器的
cookie
中,每个用户自己浏览器的cookie中存储属于自己的购物车数据。 - 存储位置:
用户浏览器的cookie
1.2.3.存储类型说明
- 提示:浏览器的cookie中存储的数据类型是字符串。 【cookie中只能存储字符串】
- 思考:如何在字符串中描述一条购物车记录?
- 结论:JSON字符串可以描述复杂结构的字符串数据,可以保证一条购物车记录不用分开存储。
{"sku_id1":{"count":"1","selected":"True"},"sku_id3":{"count":"3","selected":"True"},"sku_id5":{"count":"3","selected":"False"}
}
1.2.4.存储逻辑说明
- 当要添加到购物车的商品已存在时,对商品数量进行累加计算。
- 当要添加到购物车的商品不存在时,向JSON中新增field和value即可。
提示:
- 浏览器cookie中存储的是字符串明文数据。
- 我们需要对购物车这类隐私数据进行密文存储。
- 解决方案:
pickle模块
和base64模块
1.2.5.pickle模块介绍
- pickle模块是Python的标准模块,提供了对Python数据的序列化操作,可以将数据转换为bytes类型,且序列化速度快。
- pickle模块使用:
pickle.dumps()
将Python数据序列化为bytes类型数据。pickle.loads()
将bytes类型数据反序列化为python数据。
import pickledict = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
ret = pickle.dumps(dict)
print(ret)dict_data = pickle.loads(ret)
print(dict_data)
运行结果:
pickle模块的详细使用方法,参考博文:https://blog.csdn.net/weixin_44799217/article/details/115187970
1.2.6.base64模块介绍
- 提示:pickle模块序列化转换后的数据是bytes类型,浏览器cookie无法存储。
- base64模块是Python的标准模块,可以对bytes类型数据进行编码,并得到bytes类型的密文数据。
- base64模块使用:
base64.b64encode()
将bytes类型数据进行base64编码,返回编码后的bytes类型数据。base64.b64deocde()
将base64编码后的bytes类型数据进行解码,返回解码后的bytes类型数据。
import pickle
import base64dict = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
ret = pickle.dumps(dict)
print(ret)
b = base64.b64encode(ret)
print(b)
print('*' * 100)
ret_1 = base64.b64decode(b)
print(ret_1)
dict_data = pickle.loads(ret_1)
print(dict_data)
运行结果:
美多商城之购物车(购物车存储方案)相关推荐
- 阿语python美多商城-商品-购物车之第7.1节购物车存储方案
购物车存储方案 用户登录与未登录状态下,都可以保存购物车数据. 用户对购物车数据的操作包括:增.删.改.查.全选等等 每个用户的购物车数据都要做唯一性的标识. 1. 登录用户购物车存储方案 1.存储数 ...
- 美多商城之验证码(异步方案)
三.异步方案RabbitMQ和Celery 3.1 生产者消费者设计模式 [替换之前重写的send_flag代码] 思考: 下面两行代码存在什么问题? 问题: 我们的代码是自上而下同步执行的. 发送 ...
- 商城-购物车-购物车功能分析
商城-购物车-购物车功能分析 2.购物车功能分析 2.1.需求 2.2.流程图 2.购物车功能分析 2.1.需求 需求描述: 用户可以在登录状态下将商品添加到购物车 放入数据库 放入redis(采用) ...
- 美多商城之商品(准备商品数据 )、Dockers容器和FastDFS存储
二.准备商品数据 [这些数据一般保存在第三方云存储服务] 提示: 数据库表有了以后,我们现在需要准备商品信息数据和商品图片数据,以便查询和展示. 商品信息数据:比如商品编号等都是字符串类型的,可 ...
- python美多商城项目百度网盘_美多商城项目(七)
正文共: 7620字 4图 预计阅读时间: 20分钟 每日分享 If you can change your mind, you can change your life. 如果你愿意改变你的想法,你 ...
- 美多商城之商品(2)
美多商城之商品(2) 1.商品搜索 1.1.全文检索方案Elasticsearch 1.2.Haystack扩展建立索引 1.3.渲染商品搜索结果 2.商品详情页 2.1.商品详情页分析和准备 2.2 ...
- Python项目实战之欢迎来到美多商城!学习目录导航
1. 项目准备 1.1. 项目介绍 1.1.1. 项目需求分析 1.1.2. 项目架构设计 1.2. 工程创建和配置 1.2.1. 创建工程 1.2.2. 配置开发环境 1.2.3. 配置Jinja2 ...
- Python_美多商城(商品)_6
商品数据库表设计 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 SPU = Standard Product Unit (标准产品单位) SPU是商品信息聚合的 ...
- 【美多商城项目01】了解主要需求和架构设计,创建配置工程
一.美多商城项目介绍 1.1 项目需求分析 需求分析原因 项目中,需求驱动开发,即开发人员需要以需求为目标来实现业务逻辑. 需求分析方式 企业中,借助产品原型图分析需求. 需求分析完后,前端按照产品原 ...
最新文章
- 如何 SQL Server 2005 实例之间传输登录和密码
- 区块链以及区块链技术总结
- Centos 7 安装 Haproxy
- git cherry-pick改写提交
- 阿里巴巴技术专家三画:如何画好架构图
- BC:带你温习并解读《中国区块链技术和应用发展白皮书》—区块链发展生态
- JFinal问题整理
- 靠刷算法题,真的可以刷进大厂吗?
- 嵩天python笔记_嵩天Python学习笔记-05
- Leetcode--5274. 停在原地的方案数
- 1024节日快乐~~~~
- C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)
- 孪生网络Dataset
- linux 驱动器发送信号,Linux设备驱动并发控制详解(自旋锁,信号量)
- 如何使用Java逐行读取大文本文件?
- c语言 如何调用void函数,在C中从main调用void*函数
- 论文笔记-LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping
- 微信小程序input只允许输入数字
- too few variables specified 怎么解决
- for循环如果先--_JavaSE第04篇:Java基础语法之循环结构