商品点击量and销售量统计

第一次用python写服务,一边写一边改,跌跌撞撞到现在基本完成。

非常重要的一个经验:在动手写代码前,一定要明确需求的各个细节,通盘考虑,设计实现方案!否则只能在编写代码的过程中改了又改,不断补窟窿,换思路。


以下记录下没有弄清楚需求时,自己以为的情况的思路:

起初我以为是所有的商品点击均要监控到,这样如果点击量很大的话,将数据全部存在内存中数据量过大,是个问题,所以采用的策略是尽量将数据写到数据库中。

我没意识到按时间区间筛选时,需要记录每次点击的时间,而我每次更新的都是此sku最后一次点击的时间。还忘记了加product_link。(⊙﹏⊙)b

方案一

1.数据存储方式采用数据库sqlite3 + 内存存储:

数据库存储的字段为<image_link, skuid, click_rate, sales_volume, date>,以skuid为主键。

内存存储以字典列表的方式存储以上信息,eg:{‘skuid’:[image_link, skuid, click_rate, sales_volume, date]}(注:最好保持数据库和内存数据的顺序一致)

2.定期将内存数据flush到数据库,需要将先前的老数据Delete掉。

3.由点击触发服务,首先查询内存数据DATA,如果存在则直接更新数据;否则,查询数据库,如果查询到,将数据加载到内存DATA中,并更新之;如果数据库中也不存在,则直接记录到内存DATA。

4.sales_volume字段暂时不考虑,最后从销售系统中直接提取;所以“总计销售” 也不考虑

具体流程图如下:


此方案将用户点击行为数据保存在内存中,如果内存中中不存在则读取数据库,如果数据库中也不存在则新建数据。在查询时将内存和数据库中的数据合并后返回。同时分别查询内存与数据库中的数据,逻辑有点复杂,不够简明。

方案二

1.数据存储采用数据库sqlite。

2.每次点击触发服务后都查询数据库,然后写数据库。

此方案对数据库压力过大,属于小白方案。

方案三

记录每次点击的时间,加入product_link。O(∩_∩)O~

1.数据存储方式采用数据库sqlite3 + 内存存储:

数据库存储的字段为<image_link, skuid, click_rate, sales_volume, date, product_link>,以date为主键,date以时间戳的方式记录,为int。

内存存储以字典列表的方式存储以上信息,eg:{‘date’:[image_link, skuid, click_rate, sales_volume, date,product_link], }(注:最好保持数据库和内存数据的顺序一致)

2.定期将内存数据flush到数据库。

3.由点击触发服务,将数据记录在内存DATA中。

4.在需要显示数据时,将数据刷到数据库,然后调用数据库服务group by skuid 输出数据。

5.sales_volume字段暂时不考虑,最后从销售系统中直接提取;所以“总计销售” 也不考虑。


相比上一个方案,清晰简单多了!能用数据库的尽量使用数据库,有很多功能可以使用!


完成一个服务需要注意的问题:

1.异常处理:eg:数据库连接

2.信号量的处理:ctrl + c, kill -9 

3.给服务加日志文件:调试程序的方法有很多:print ,assert,pdb,日志文件。但是最终会发现日志是终极大招,目前我还体会不到,感觉单步调试更方便顺手。

4.给代码加单元测试:这在对代码举行修改更新时,只需要将对应的单元测试再运行一遍即可。

5.在需要存储数据时使用数据库存储数据,最好不要用文件存储。

起初在实现功能时,根本没思考怎么数据,后再肯定了数据必须存储后,思考是用文件存储还是数据库存储。最后服务写完后,认为能用数据库存储数据的都使用数据库存储,万不得已才会采用文件存储,或是文件存储更好,例如 日志。

6.全局变量有被两个进程或是服务同时访问时注意要加Lock。

7. 内存中存储的字段的顺序,数据库存储的字段的顺序最好保持一致;否则在后续将内存数据写入数据库或是将数据库中的数据写入内存时存在顺序对应的问题,比较容易犯错!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值