本文共 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 127.0.0.1:6379> hset myhash name enjoy
redis 127.0.0.1:6379> hget myhash name
redis 127.0.0.1:6379> hlen myhash
redis 127.0.0.1:6379> hexists myhash name
redis 127.0.0.1:6379> hdel myhash likes
redis 127.0.0.1:6379> hsetnx myhash sex boy
redis 127.0.0.1:6379> hincrby myhash age 10
redis 127.0.0.1:6379> hmset myhash name enjoy age 20 issingle yes
redis 127.0.0.1:6379> hmget myhash name age issingle
redis 127.0.0.1:6379> hgetall myhash
redis 127.0.0.1:6379> hkeys myhash
redis 127.0.0.1:6379> hvals myhash
在购物车的场景下,既然选择使用hash来完成,可以总体规划如下:
假设现在用户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/