购物车中的数据保存在数据库还是cookie中

版权声明:转载请标明出处 https://blog.csdn.net/gymaisyl/article/details/84677020

目前我们使用购物车的存储方式主要有:Session方式,Cookie方式,数据库存储,下面来分析一下三种存储方式的优缺点。

1.Session(Memcached)方式

优点:购物车信息保存在服务端,可以保存1M 信息。
缺点:对于大型网站会占有过多的服务器内存资源,造成服务器压力过大。Session保存的信息会在用户退出登录后丢失。用户下次登录,购物车中商品信息丢失,用户只能从新选择。

2.Cookie方式

优点:购物车信息存储在客户端,不占用服务器资源,基本可以到达持久化存储。
缺点:Cookie有大小的限制,不能超过4K,而且不够安全。如果是个人PC机,Cookie能很好的保存购物车信息,但如果是公共办公环境,Cookie保存的信息基本就失效了(会被其他人购物车信息覆盖)。对一个大型的电子商务网站,我们需要对用户的购买行为进行分析,需要对用户推荐用户感兴趣的商品,如果把购物车信息保存在Cookie中,则不能对用户购买行为分析统计。

3.数据库存储

优点:持久化存储,可以分析用户购买行为。
缺点: 网站速度变慢,成本和维护增加。

一般来说,可以使用session,cookie和数据库来记录购物车数据:

1,不过不提倡使用session,session是存储在服务器的,会占用服务器的空间;,还有过期时间,客户关掉浏览器时session即消失,下次再上来,又得重新选产品。
2,cookie这东西不错,放在客户端的,给个一年的过期时间,只要客户不清掉,每次来都能记得上次的购物车信息。
3,数据库在数据存储方面就比较好了,不会像cookie那种容易丢失,也没有客户端的限制,你想怎么存,存多少都行。购物车数据存数据库好处有很多,可以分析购买行为,可以为客户保存购买信息(不会因为浏览器关闭而丢失)等。

不过,还需要考虑的一个问题是用户是否登录,淘宝使用的就是cookie记录,你可以试试,未登录时可以加20个商品,登录后可以加50个,这就是因为cookie客户端的限制。


这里通过一个案例来说明一下:
本案例中:

  • web开发环境: Django:1.11
  • 针对未登录用户,购物车数据存储在cookie中;
  • 已登录用户,购物车的数据存储在数据库redis中;
  • pickle模块了解: pickle模块 ;
  • base64模块了解:base64模块
  • 购物车保存的数据为:sku_id: 商品id,count:商品数量,selected:商品是否被勾选

Django中数据存储的配置

在settings.py中CACHES中增加下面的配置:
在这里插入图片描述

购物车数据的保存形式

  1. 用户登陆的状态下数据保存在redis中(假设用户id=1):
    在这里插入图片描述

在这里插入图片描述

  1. 用户未登录状态下,采用cookie进行保存:

在这里插入图片描述

购物车数据保存

这里说明一下:
数据的校验,用户登陆状态的代码这里不做解释,这里只进行数据保存部分代码的实现。

1. 用户登陆状态下:

# 建立redis数据库连接,由于有多条命令操作,可以采用管道
 redis_conn = get_redis_connection('cart')
 pl = redis_conn.pipeline()

 # hash存储数据,考虑到count数据的叠加,所以用hincrby来添加数据
 pl.hincrby('cart_%s' % user.id, sku_id, count)
 
 # set存储数据,勾选设置,如果勾选,就在这个集合中将对应的sku_id存放到里面即可
 pl.sadd('cart_selected_%s' % user.id, sku_id)

# 管道提交
 pl.execute()

2.用户未登录状态下:

  # 用户未登录--》购物车的数据保存在cookie中,cookie数据是要在response中进行设置
  # 在进行购物车数据的保存之前,需要获取到cookie中数据,判断想要加入购物车的数据是否已经存在
  cookie_str = request.COOKIES.get('cart')

# 如果有cookie数据,通过解析获取到数据
  if cookie_str:
      # 将cookie_str字符串转为bytes
      cookie_bytes = cookie_str.encode()
      # 将base64 cookie_bytes的数据转进行解码
      cart_bytes = base64.b64decode(cookie_bytes)
      # 将 cart_bytes 字节转为python格式
      cart_dict = pickle.loads(cart_bytes)
  else:
      cart_dict = {}


  # 判断商品是否已经加入过,添加过,直接修改
  if sku_id in cart_dict:
      cart_dict[sku_id]['count'] += count
      cart_dict[sku_id]['selected'] = selected

  else: # 没添加过,可以直接添加
      cart_dict[sku_id] = {
          'count': count,
          'selected': selected
      }

  # cookie中数据的转换,cookie中数据是json格式
  cart_cookie = base64.b64encode(pickle.dumps(cart_dict)).decode()


猜你喜欢

转载自blog.csdn.net/gymaisyl/article/details/84677020
今日推荐