博客
关于我
Redis下购物车的架构实现
阅读量:244 次
发布时间:2019-02-28

本文共 2366 字,大约阅读时间需要 7 分钟。

购物车常见实现方式

传统的做法是使用关系型数据库,比如MySQL,建立一个cart购物车表,把相关的购物车产品信息都放到数据库里面。这种设计在功能上没有问题,但在实际使用中,由于购物车的数据量太大,而且修改频繁,会导致数据库的压力增加。因此,在正式项目开发中,一般不会直接使用关系型数据库来存储购物车信息。

既然不用关系型数据库,但从非关系型数据库里面做选择,很多架构师会选择使用MongoDB存储购物车的数据。MongoDB有非常丰富的查询API,性能也比传统关系型数据库要好,使用MongoDB确实是个不错的选择。但比起MongoDB,有部分公司也会使用Redis来存放购物车的信息。Redis的性能要来得更好。

开启持久化

购物车的数据,既然不存在关系型数据库中,使用Redis存储也不能让数据丢失。为了防止数据丢失,Redis必须开启持久化。Redis有两种持久化机制,一种叫RDB,一种叫AOF。

  • RDB:RDB也叫镜像文件,存放的是某个时刻Redis内存数据的一个镜像。RDB默认是开启的,在Redis配置文件中,关于RDB的配置如下:

    save 900 1save 300 10save 60 10000

    默认的配置最少是60秒并且有10000个key发生变化才会刷新一次镜像,这样如果在时间没到60秒,这个时候Redis意外宕机,在这个时间段的数据都会丢失。

  • AOF:AOF就是append only file的简写,里面存放的是日志文件,准确的来说是存放RESP的指令日志,这里RESP指令并不是这次的重点,这里不做讨论。默认AOF并没开启,应该开启AOF日志文件,这时候得修改配置文件,增加AOF的相关配置:

    appendonly yes

开启了AOF日志,丢失数据的可能性就减少很多了。

业务分析

以京东的购物车为例,需要完成如下功能:

  • 全选功能-获取所有该用户的所有购物车商品
  • 商品数量-购物车图标上要显示购物车里商品的总数
  • 删除-要能移除购物车里某个商品
  • 增加或减少某个商品的数量
  • 数据结构选择

    Redis常用有5种数据类型分别为string、hash、list、set、zset。在这个案例里面我们选择使用hash来完成这个购物车功能。

    Redis中hash的常用命令介绍

    • hset:redis中hash的添加命令hset,如果key不存在,创建key,存在则覆盖原有值。
      redis 127.0.0.1:6379> hset myhash name enjoy
    • hget:redis中hash的查看命令hget。
      redis 127.0.0.1:6379> hget myhash name
    • hlen:redis中hash获取key包含的field数量的命令。
      redis 127.0.0.1:6379> hlen myhash
    • hexists:redis中判断指定key中指定field是否存在的命令。
      redis 127.0.0.1:6379> hexists myhash name
    • hdel:redis中hash删除命令hdel,删除一个或多个指定的字段。
      redis 127.0.0.1:6379> hdel myhash likes
    • hsetnx:redis中hash如果key或field不存在插入有效,否则不采取操作的命令。
      redis 127.0.0.1:6379> hsetnx myhash sex boy
    • hincrby:redis中hash中的value为数值时操作增减的命令。
      redis 127.0.0.1:6379> hincrby myhash age 10
    • hmset:redis中批量添加key/value的命令。
      redis 127.0.0.1:6379> hmset myhash name enjoy age 20 issingle yes
    • hmget:redis中批量获取key/value的命令。
      redis 127.0.0.1:6379> hmget myhash name age issingle
    • hgetall:redis中根据myhash键获取所有的字段及value的命令。
      redis 127.0.0.1:6379> hgetall myhash
    • hkeys:redis中获取所有字段的命令。
      redis 127.0.0.1:6379> hkeys myhash
    • hvals:redis中获取所有字段的值的命令。
      redis 127.0.0.1:6379> hvals myhash

    业务设计

    在购物车的场景下,既然选择使用hash来完成,可以总体规划如下:

  • 以用户ID作为key
  • 以商品ID作为field
  • 以商品的数量作为value
  • 增加购物车商品

    假设现在用户ID为1001,这用户往购物车放3个商品,产品的ID为10021,10025,10079,对应的指令应该为:

    hset cart:1001 10021 1hset cart:1001 10025 1hset cart:1001 10079 1

    全选功能

    全选功能-获取所有该用户的所有购物车商品,这个就非常好完成了,使用hgetall指令就好:

    hgetall cart:1001

    商品数量

    商品数量-购物车图标上要显示购物车里商品的总数,这样也不难,使用hlen指令就好:

    hlen cart:1001

    删除商品

    删除-要能移除购物车里某个商品:

    hdel cart:1001 10079

    增加商品

    增加或减少某个商品的数量:

    hincrby cart:1001 10021 1

    总结

    这种设计的购物车,性能是很好的,而且也减少了数据库的压力,在真实的项目中可以考虑这样使用。

    转载地址:http://hqqs.baihongyu.com/

    你可能感兴趣的文章
    nfs复习
    查看>>
    NFS安装配置
    查看>>
    NFS的安装以及windows/linux挂载linux网络文件系统NFS
    查看>>
    NFS的常用挂载参数
    查看>>
    NFS网络文件系统
    查看>>
    nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
    查看>>
    NFV商用可行新华三vBRAS方案实践验证
    查看>>
    ng build --aot --prod生成文件报错
    查看>>
    ng 指令的自定义、使用
    查看>>
    nghttp3使用指南
    查看>>
    Nginx
    查看>>
    nginx + etcd 动态负载均衡实践(三)—— 基于nginx-upsync-module实现
    查看>>
    nginx + etcd 动态负载均衡实践(二)—— 组件安装
    查看>>
    nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
    查看>>
    Nginx + Spring Boot 实现负载均衡
    查看>>
    Nginx + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
    查看>>
    nginx 1.24.0 安装nginx最新稳定版
    查看>>
    nginx 301 永久重定向
    查看>>